szieof 操作符

2018-10-30 16:57:50 +08:00
 codechaser

求教:sizeof 可以返回对象的字节数。

1

int array[5] = {0};
int bytes = sizeof array;

这里的 bytes 等于 20。那么如果定义一个函数:

2

void test(int array[]){
    printf("%d\n",sizeof array);
}

如果传入 array 的话会打印出 4,我刚才看了下书知道这里计算的是 array 这个指针,指针一直为 4 字节,所以会输出 4。那么 1 中 sizeof 也是对 array 这个数组的第一个元素指针操作啊,为什么不输出 4,而输出整个数组的字节数呢?难道sizeof还变吗?它怎么知道传入的是数组还是指针呢?

2772 次点击
所在节点    C
18 条回复
newmind
2018-10-30 17:05:25 +08:00
标题看的我强迫症犯了
cyang812
2018-10-30 17:12:32 +08:00
@newmind 有点
chenstack
2018-10-30 17:17:22 +08:00
1 中 array 类型是 int[5],2 中 array 类型是 int[],也就是 int*,所以结果不一样
zhicheng
2018-10-30 17:21:08 +08:00
参数里的全是指针。
GeruzoniAnsasu
2018-10-30 17:26:26 +08:00
本站已跟百度达成深度合作。。。
codechaser
2018-10-30 17:49:06 +08:00
@newmind 我...打错了😂
bytelee
2018-10-30 17:51:47 +08:00
理解下数组和指针的区别 :)
fcten
2018-10-30 17:53:03 +08:00
数组作为作为函数参数传递时,实际传递的是指针。sizeof 自然只能计算出指针的长度,因为这个时候根本不知道数组的长度。
chiu
2018-10-30 18:06:02 +08:00
两个 array 类型不一样,一个数组一个指针。
innoink
2018-10-30 18:09:56 +08:00
int [5]和 int []又不是同一个类型,当然不一样了
HHehr0ow
2018-10-30 21:08:11 +08:00
sizeof 是一个 compile time 的运算符
msg7086
2018-10-30 21:40:53 +08:00
sizeof 是编译时运算符,编译完以后的代码是
int bytes = 20;
printf("%d\n", 8);
运行程序并不会改变 8 的值,无论函数的输入是什么样的数组,8 就是 8。
LGA1150
2018-10-30 21:53:07 +08:00
@msg7086 @HHehr0ow
sizeof 有一个特例是 VLA (变量长度的数组),其大小是在运行时才确定的
stevenbipt
2018-10-30 23:20:07 +08:00
定义一个指针指向数组
stevenbipt
2018-10-30 23:20:34 +08:00
然后在 sizeof 那个指针试试←_←
codechaser
2018-11-01 14:45:11 +08:00
@stevenbipt 想着指针的指针的指针最后会到哪儿?谁是他们最初的起源呢
codechaser
2018-11-01 14:46:03 +08:00
@msg7086 sizeof 返回的值编译的时候就会替换成常量是吗?
msg7086
2018-11-01 17:19:08 +08:00
@LGA1150 嗷对,还有这新(?)玩意儿……

@codechaser 如上所说,除开 VLA 以外都是编译时就得出值的。
至于指针,就只是一个内存地址而已。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502633

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX