假设
int array[16];
标准转换称为数组到指针转换,因此array
会隐式转换为int*
类型,但为什么&array
等于array
?< / p>
例如,
int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);
这将给出相同的地址,没有编译错误。
为什么?
答案 0 :(得分:10)
&array
的类型是int (*)[16]
(指向16个整数数组的指针)。 array
的类型在留下衰减时为int*
(指向整数的指针)。它们都指向相同的位置,但对编译器有不同的含义。
如果你做(&array)[0]
,你最终得到的值是16个整数的原始数组,你可以再次下标,比如(&array)[0][0]
。 (&array)[1]
将是16个整数的下一个数组,如果有的话。
如果你array[0]
,你最终得到的值是一个整数,你不能再次下标。 array[1]
只是下一个整数。 (无论array
是int[16]
还是int*
,都是如此。)
显然,如果你将指针转换为void
指针,你就会失去任何语义上的差异。
答案 1 :(得分:3)
这就是数组名称在C
中的行为方式。
数组变量的名称表示数组的第一个元素的地址。
所以,
void *p = array; //array name, gives address of the first element.
和
void *q = &array; //adress-of-array name, also gives address of the first element
// actually &array is of type int (*)[16] which is decayed to int *
// and casted to void * here
P.S。甚至,FWIW,
void *r = &array[0]; //address of the first element
也会给你相同的地址。
这将给出相同的地址,没有编译错误。
它们确实是相同的值,这里编译器没有什么可以尖叫。
注意事项:一旦将地址分配给无效指针,您就会丢失与它们相关的类型信息。
答案 2 :(得分:0)
C中的数组表现为指向内存中第一个元素地址的指针。
答案 3 :(得分:0)
因为你基本上在这两行中说同样的话:
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;
答案 4 :(得分:0)
表达类型
---------- ----
&amp; array void ()[10] - 指向void *
的10元素数组的指针
&amp; array [0] void ** - 指向void的指针