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指针,你就会失去任何语义上的差异.
这就是数组名称在中的行为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)
也会给您相同的地址。
这将给出相同的地址,并且没有编译错误。
它们的确具有相同的值,在这里编译器没有什么好尖叫的。
注意:将地址分配给空指针后,将丢失与它们关联的类型信息。