[问题] 将阵列当引数 传到函数后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