以下程序打印出 a 和 array 共享同一地址。
我应该如何理解这种行为?
&arr 是指针arr 的地址,它包含10 个字符的起始地址吗?
#include <stdio.h>
int main()
{
char arr[10] = {0};
char* a = (char*)(&arr);
*a = 1;
printf("a=%p,arr=%p.\n", a, arr);
printf("%d\n", arr[0]);
return 0;
}
当你在 C 中分配一个数组时,你得到的是类似下面的东西:
+---+
arr[0]: | |
+---+
arr[1]: | |
+---+
...
+---+
arr[N-1]: | |
+---+
就是这样。没有为名为 arr
的对象预留单独的内存位置来存储数组第一个元素的地址。因此,数组第一个元素的地址 (&arr[0]
) 与数组本身的地址 (&arr
) 是相同的值>).
除非它是 sizeof
或一元 &
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字, “T
的 N 元素数组”类型的表达式 将被转换(“衰减”)为“指向 T
的指针”类型的表达式和值表达式的地址将是数组第一个元素的地址。
所以在第一个printf
调用中表达式arr
的类型是char [10]
;根据上面的规则,表达式“衰减”为 char *
类型,其值为 arr[0]
的地址。
在表达式&arr
中,arr
是一元&
运算符的操作数,所以不进行转换;您得到的不是 char **
类型的表达式,而是 char (*)[10]
类型的表达式(指向 char 的 10 元素数组的指针
)。同样,由于数组第一个元素的地址与整个数组的地址相同,因此表达式 arr
和 &arr
具有相同的值。