数组和&数组之间的区别[0]

时间:2015-10-09 09:48:10

标签: c pointers

int array[] = {1,2,3,4};

据我了解,array只是指向&array[0]

的指针

但是,为什么sizeof(array);知道数组的大小而不仅仅是4字节数呢?

5 个答案:

答案 0 :(得分:7)

虽然数组的名称确实成为在某些上下文中指向其初始成员的指针(例如将数组传递给函数),但数组的名称指的是整个数组,而不仅仅是指向该数组的指针。初始成员。

这体现在通过sizeof运算符获取数组的大小。

答案 1 :(得分:2)

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,表达式为类型“{元素数组T”将被转换(“衰减”)为类型“指针T的表达式,表达式的值将是第一个元素的地址数组。

C中的数组不存储任何有关其大小或其他任何内容的元数据,也不会为任何类型的指针留出任何存储空间。它们的布局大致如下:

     +---+
arr: | 1 | arr[0]
     +---+
     | 2 | arr[1]
     +---+
     | 3 | arr[2]
     +---+
     | 4 | arr[3]
     +---+

除了数组元素本身之外,变量arr没有单独的存储空间。如您所见,arr的地址和arr[0]的地址相同。这就是为什么表达式arr&arr&arr[0]都能为您提供相同的(第一个元素的地址),即使类型是不同的。

除了操作数是可变长度数组之外,sizeof的结果是在编译时计算的,并且编译器在这些情况下将数组操作数视为数组;否则,它将数组表达式视为指向第一个元素的指针。

答案 2 :(得分:0)

不,array不仅仅是指针,正如您的sizeof示例所示。 只有在大多数情况下,它才会转换为&array[0],但不会转换为android.support.design.widget.FloatingActionButton

答案 3 :(得分:0)

在此声明中 -

int a[] = {1,2,3,4};    // a is of array type 

a成为指向数组a的第一个元素的指针(衰变后的 )。并非在所有情况下两者都是相同的,但在诸如将数组传递给函数的情况下。

答案 4 :(得分:0)

这仅适用于您定义数组的范围。如果将数组传递给函数,则sizeof运算符不再起作用。 我不完全确定,但我认为编译器存储数组的长度并将其放回到像macro一样的sizeOf(数组)但不是动态的。如果有人知道的话,请纠正我。