数组和数组有什么区别?

假使,假设

int array[16]; 

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

例如,

 int array[16]; void *p = array; void *q = &array; printf("%p\n", p); printf("%p\n", q); 

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

为什么?

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

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

如果你做array[0] ,你最终得到的值是一个整数,你不能再次下标。 array[1]只是下一个整数。 (无论arrayint[16]还是int* 。)

显然,如果你将指针转换为void指针,你就会失去任何语义上的差异。

这就是数组名称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 

PS甚至,FWIW,

  void *r = &array[0]; //address of the first element 

也会给你相同的地址。

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

它们确实是相同的值,在这里编译器没有什么可以尖叫的

注意:一旦将地址分配给void指针,您将丢失与它们相关联的类型信息。

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 void )[10] – 指向void * &array [0]的10元素数组的指针void ** – 指向void的指针