数组和数组有什么区别?
假使,假设
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]
只是下一个整数。 (无论array
是int[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的指针