数组和数组有什么区别?

Kev*_*ong 14 c arrays pointers

假使,假设

int array[16];
Run Code Online (Sandbox Code Playgroud)

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

例如,

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

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

为什么?

zne*_*eak 11

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

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

如果这样做array[0],您最终得到的值是一个整数,您不能再次下标.array[1]只是下一个整数.(无论array是a int[16]还是a,都是如此int*.)

显然,如果你把你的指针变成void指针,你就会失去任何语义上的差异.


Sou*_*osh 5

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

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

所以,

void *p = array;   //array name, gives address of the  first element.
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

PS偶,FWIW,

 void *r = &array[0]; //address of the first element
Run Code Online (Sandbox Code Playgroud)

也会给您相同的地址。

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

它们的确具有相同的值,在这里编译器没有什么好尖叫的

注意:将地址分配给空指针后,将丢失与它们关联的类型信息。