sizeof 应用于数组名称与指向数组第一个元素的指针

2023-12-07

假设我声明int v[]={1,2,3,4,5};

我被教导说v是指向第一个元素的指针v大批。当我打电话申请时sizeof to v,它返回 20,我知道是5*sizeof(int),因为数组中有 5 个元素。

v+0也是指向数组中第一个元素的指针,但是sizeof(v+0) is 4.

Why is sizeof(v)=20 and sizeof(v+0)=4?

我希望sizeof(v)也返回 4,如v是一个指针,但它以某种方式还包含有关数组中存储的元素数量的信息。对此有何解释?


我被教导说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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sizeof 应用于数组名称与指向数组第一个元素的指针 的相关文章