int array[] = {1,2,3,4};
据我了解,array
只是指向&array[0]
但是,为什么sizeof(array);
知道数组的大小而不仅仅是4字节数呢?
答案 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(数组)但不是动态的。如果有人知道的话,请纠正我。