[問題] 將陣列當引數 傳到函數後size變了??

看板C_and_CPP作者 (十八尖山內馬爾)時間8年前 (2016/05/29 22:44), 編輯推噓10(10017)
留言27則, 10人參與, 最新討論串1/1
使用Dev-C++ 程式碼如下: #include <iostream> using namespace std; void test(int a[]); int main(void) { int score[]={89,54,73,95,71}; cout<<sizeof(score)<<endl; test(score); } void test(int a[]) { cout<<sizeof(a)<<endl; } 結果如下: 20 8 想請問為什麼傳入函數前的矩陣大小是20 byte 可是傳入函數後變成8 byte呢? 感謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.12.231 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1464533089.A.98F.html

05/29 22:49, , 1F
a會轉成指標 所以你sizeof的是指標的大小
05/29 22:49, 1F

05/29 22:51, , 2F
所以是傳址而非傳值的意思? 請問這可以修正嗎?
05/29 22:51, 2F

05/29 22:56, , 3F
sizeof(*a)
05/29 22:56, 3F

05/29 22:57, , 4F
函數本來就不吃陣列 你參數的int a[]會自己轉成int *a
05/29 22:57, 4F

05/29 22:59, , 5F
要用函數處理陣列通常是丟一個指向陣列的指標去處理
05/29 22:59, 5F

05/29 23:16, , 6F
補充一下,int *a會指向陣列的第一個元素,所有陣列自動
05/29 23:16, 6F

05/29 23:18, , 7F
轉指標的通通都會指向第一個 所以你要算整個陣列的大小
05/29 23:18, 7F

05/29 23:18, , 8F
要加總整個陣列內元素的大小
05/29 23:18, 8F

05/29 23:22, , 9F
可是無法用sizeof判斷有幾個元素 該如何加總呢?
05/29 23:22, 9F

05/29 23:27, , 10F
你可以用sizeof(陣列)/sizeof(型態)來取得元素個數
05/29 23:27, 10F

05/29 23:27, , 11F
方法還很多啦 你可以自己想想看
05/29 23:27, 11F

05/29 23:30, , 12F
template<size_t N>
05/29 23:30, 12F

05/29 23:30, , 13F
void test(int (&a)[N]) {
05/29 23:30, 13F

05/29 23:30, , 14F
std::cout << sizeof(a) << std::endl;
05/29 23:30, 14F

05/29 23:30, , 15F
}
05/29 23:30, 15F

05/29 23:31, , 16F
傳參考進去就可以了,直接印出 N 就是元素個數
05/29 23:31, 16F

05/29 23:33, , 17F
感謝 我試試看
05/29 23:33, 17F

05/30 03:07, , 18F
sizeof這招不是進去函數就破功了 還是現在改了
05/30 03:07, 18F

05/30 03:07, , 19F
compile-time的東東可以這樣用嗎
05/30 03:07, 19F

05/30 07:48, , 20F
那也要函數是宣告指標或無大小的陣列才會先 decay 再傳
05/30 07:48, 20F

05/30 07:48, , 21F
如果是有大小的陣列參考的話是會留著的
05/30 07:48, 21F

05/30 07:49, , 22F
這個東西的進階用法就是 _countof
05/30 07:49, 22F

05/30 09:30, , 23F
C語言風格的API都會再給函數一個參數存放陣列長度
05/30 09:30, 23F

05/30 22:54, , 24F
試試template(小聲)
05/30 22:54, 24F

05/31 18:42, , 25F
函數不能傳或返回陣列
05/31 18:42, 25F

06/01 00:41, , 26F
新手 哈哈
06/01 00:41, 26F

06/19 10:19, , 27F
印象中 指標的size 應該統一是4才對?
06/19 10:19, 27F
文章代碼(AID): #1NIm1XcF (C_and_CPP)