C 什么';s数组和&;阵列?

C 什么';s数组和&;阵列?,c,arrays,pointers,C,Arrays,Pointers,假定 int array[16]; 有一种称为数组到指针转换的标准转换,因此数组将被隐式转换为类型int*,但为什么数组等于数组 比如说, int array[16]; void *p = array; void *q = &array; printf("%p\n", p); printf("%p\n", q); 这将给出相同的地址,并且没有编译错误 为什么?这就是数组名在C中的行为 数组变量的名称表示数组第一个元素的地址 所以 及 p.S.偶数,FWIW void *r = &a

假定

int array[16];
有一种称为数组到指针转换的标准转换,因此
数组
将被隐式转换为类型
int*
,但为什么
数组
等于
数组

比如说,

int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);
这将给出相同的地址,并且没有编译错误

为什么?

这就是数组名在
C
中的行为

数组变量的名称表示数组第一个元素的地址

所以

p.S.偶数,FWIW

 void *r = &array[0]; //address of the first element
也会给你相同的地址

这将给出相同的地址,并且没有编译错误

它们确实是相同的值,在这里编译器并没有什么好抱怨的


需要注意的是:一旦您将地址分配给空指针,您将丢失与之相关的类型信息。

C中的数组作为指向内存中第一个元素地址的指针。

因为您在这两行中说的基本相同:

void *p = array; // Pointer to array, which is an address
void *q = &array; // Pointer to reference to an array, which is basically saying "A pointer to the same address as the pointer".
换言之:

void *p;
同:

&array;

&array
的类型是
int(*)[16]
(指向16个整数数组的指针)。当让
数组
衰减时,其类型为
int*
(指向整数的指针)。它们都指向相同的位置,但对编译器的意义不同

如果执行
(&array)[0]
,则最终得到的值是16个整数的原始数组,可以再次下标,如
(&array)[0]
(&array)[1]
将是下一个包含16个整数的数组(如果有)

如果执行
数组[0]
,则最终得到的值是一个整数,不能再次下标<代码>数组[1]只是下一个整数。(无论
array
int[16]
还是
int*
,这都是正确的)


显然,如果你将指针变成
void
指针,你就失去了可能存在的任何语义差异。

不完全正确。在大多数情况下,数组名衰减为指向数组中第一个元素的指针,但以下面的示例为例:
char foo[20]=“bar”;大小\u t size=foo的大小
,如果
foo
将是指针,
size
将是4或8,但事实上它将是20@EliasVanOotegem感谢您指出这一点,您是正确的。您也可以检查此链接:如果
数组
类型为
int(*)
,那么它是否完全有效?
void *p;
&array;