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
.