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

作者: l8PeakNeymar (十八尖山內馬爾)   2016-05-29 22:44:47
使用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呢?
感謝!!
作者: ko27tye (好滋好滋)   2016-05-29 22:49:00
a會轉成指標 所以你sizeof的是指標的大小
作者: l8PeakNeymar (十八尖山內馬爾)   2016-05-29 22:51:00
所以是傳址而非傳值的意思? 請問這可以修正嗎?
作者: ko27tye (好滋好滋)   2016-05-29 22:56:00
sizeof(*a)函數本來就不吃陣列 你參數的int a[]會自己轉成int *a要用函數處理陣列通常是丟一個指向陣列的指標去處理補充一下,int *a會指向陣列的第一個元素,所有陣列自動轉指標的通通都會指向第一個 所以你要算整個陣列的大小要加總整個陣列內元素的大小
作者: l8PeakNeymar (十八尖山內馬爾)   2016-05-29 23:22:00
可是無法用sizeof判斷有幾個元素 該如何加總呢?
作者: ko27tye (好滋好滋)   2016-05-29 23:27:00
你可以用sizeof(陣列)/sizeof(型態)來取得元素個數方法還很多啦 你可以自己想想看
作者: LiloHuang (十年一刻)   2016-05-29 23:30:00
template<size_t N>void test(int (&a)[N]) {std::cout << sizeof(a) << std::endl;}傳參考進去就可以了,直接印出 N 就是元素個數
作者: l8PeakNeymar (十八尖山內馬爾)   2016-05-29 23:33:00
感謝 我試試看
作者: MOONRAKER (㊣牛鶴鰻毛人)   2016-05-30 03:07:00
sizeof這招不是進去函數就破功了 還是現在改了compile-time的東東可以這樣用嗎
作者: LPH66 (-6.2598534e+18f)   2016-05-30 07:48:00
那也要函數是宣告指標或無大小的陣列才會先 decay 再傳如果是有大小的陣列參考的話是會留著的這個東西的進階用法就是 _countof
作者: ronin728 (浪人)   2016-05-30 09:30:00
C語言風格的API都會再給函數一個參數存放陣列長度
作者: TobyH4cker (Toby (我要當好人))   2016-05-30 22:54:00
試試template(小聲)
作者: loveflames (咕啾咕啾魔法陣)   2016-05-31 18:42:00
函數不能傳或返回陣列
作者: knockbusterx (knockbusterx)   2016-06-01 00:41:00
新手 哈哈
作者: EngRookie (EngRookie)   2016-06-19 10:19:00
印象中 指標的size 應該統一是4才對?

Links booklink

Contact Us: admin [ a t ] ucptt.com