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

Mar*_*ius 4 c pointers

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

据我所知,array只是一个指针&array[0]

但是,怎么sizeof(array);知道一个数组的大小而不仅仅是它只有4个字节的数字?

das*_*ght 7

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

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


Joh*_*ode 4

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

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

     +---+
arr: | 1 | arr[0]
     +---+
     | 2 | arr[1]
     +---+
     | 3 | arr[2]
     +---+
     | 4 | arr[3]
     +---+
Run Code Online (Sandbox Code Playgroud)

arr除了数组元素本身之外,没有单独的变量存储空间。可以看到, 的地址arr和 的地址arr[0]是相同的。这就是为什么表达式arr&arr&arr[0]都给出相同的(第一个元素的地址),即使这些表达式的类型不同。

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