我被教导说v
是指向第一个元素的指针v
array.
你被错误地教导了。v
不是指针 - 没有指针空间被具体化为数组的一部分。你得到的是这样的:
+---+
v: | 1 | v[0]
+---+
| 2 | v[1]
+---+
| 3 | v[2]
+---+
| 4 | v[3]
+---+
| 5 | v[4]
+---+
and not this:
+---+
v: | |
+---+
|
|
V
+---+
| 1 | v[0]
+---+
| 2 | v[1]
+---+
| 3 | v[2]
+---+
| 4 | v[3]
+---+
| 5 | v[4]
+---+
除非它是操作数sizeof
或一元&
运算符,或者是用于初始化声明中的字符数组的字符串文字,表达类型为“N 元素数组T
” 将被转换(“衰减”)为“指向的指针”类型的表达式T
",表达式的值将是数组第一个元素的地址。
当你写类似的东西时foo( v )
, or printf( "%p\n", (void *) v)
,或者甚至只是v[i]
, the 表达 v
从类型“5 元素数组”转换而来int
“到”指针int
",表达式的值与&v[0]
.
然而,当你写sizeof v
,这种转换不会发生 -sizeof
计算结果为整个数组中的字节数 (5 *sizeof (int)
)。同样,表达式的类型&v
is int (*)[5]
(指向 5 元素数组的指针int
), not int **
.
这就是为什么sizeof v
产量 20,而sizeof (v + 0)
产生 4 - 在第二种情况下,v
is not的操作数sizeof
, the 表达 (v + 0)
是操作数sizeof
。在表达式中(v + 0)
, v
衰减到打字int *
。请注意,如果你这样写,你会得到不同的结果sizeof v + 0
- sizeof
优先级高于加法运算符+
,因此该表达式将被解析为(sizeof v) + 0
.