And*_*rei 4 c arrays pointers sizeof
假设我宣布 int v[]={1,2,3,4,5};
我被教导过这v是指向v数组中第一个元素的指针.当我调用apply sizeof时v,它返回20,我知道是5*sizeof(int),因为数组中有5个元素.
v+0也是指向数组中第一个元素的指针,但是sizeof(v+0)为4.
为什么sizeof(v)= 20和sizeof(v+0)= 4?
我希望它sizeof(v)也返回4,就像v一个指针,但它以某种方式还包含有关存储在数组中的元素数量的信息.对此有何解释?
我被教导过这
v是指向v数组中第一个元素的指针.
你被错误地教导了. v不是指针 - 没有指针的空间被实现为数组的一部分.你得到的是这样的:
+---+
v: | 1 | v[0]
+---+
| 2 | v[1]
+---+
| 3 | v[2]
+---+
| 4 | v[3]
+---+
| 5 | v[4]
+---+
Run Code Online (Sandbox Code Playgroud)
而不是这个:
+---+
v: | |
+---+
|
|
V
+---+
| 1 | v[0]
+---+
| 2 | v[1]
+---+
| 3 | v[2]
+---+
| 4 | v[3]
+---+
| 5 | v[4]
+---+
Run Code Online (Sandbox Code Playgroud)
除了当它是的操作数sizeof或一元&运算符,或者是用于在声明的字符阵列,初始化一个字符串文字表达型"的N元件阵列的T将被转换("衰变")"到的表达输入"指向T",表达式的值将是数组第一个元素的地址.
当写类似foo( v ),或者printf( "%p\n", (void *) v),甚至只是v[i],该表达 v从类型"的5个元素的数组转换int为"指针" int",并且表达式的值是相同的&v[0].
但是,在编写时sizeof v,不会发生转换 - sizeof计算整个数组中的字节数(5*sizeof (int)).类似地,表达式的类型&v是int (*)[5](指向5元素数组的指针int),而不是int **.
这就是为什么sizeof v得到20,而sizeof (v + 0)产率4 -在第二种情况下,v是不的操作数sizeof,该表达 (v + 0)是的操作数sizeof.在表达式中(v + 0),v衰变为类型int *.请注意,如果编写,将获得不同的结果sizeof v + 0- sizeof优先级高于加法运算符+,因此表达式将被解析为(sizeof v) + 0.