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

And*_*rei 4 c arrays pointers sizeof

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

我被教导过这v是指向v数组中第一个元素的指针.当我调用apply sizeofv,它返回20,我知道是5*sizeof(int),因为数组中有5个元素.

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

为什么sizeof(v)= 20和sizeof(v+0)= 4?

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

Joh*_*ode 5

我被教导过这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)).类似地,表达式的类型&vint (*)[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.