数组和&数组有什么区别?

时间:2015-05-12 14:59:48

标签: c arrays pointers

假设

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);

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

为什么?

5 个答案:

答案 0 :(得分:10)

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

如果你做(&array)[0],你最终得到的值是16个整数的原始数组,你可以再次下标,比如(&array)[0][0](&array)[1]将是16个整数的下一个数组,如果有的话。

如果你array[0],你最终得到的值是一个整数,你不能再次下标。 array[1]只是下一个整数。 (无论arrayint[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的指针