我正在阅读stackoverflow上的这个问题 C pointer to array/array of pointers disambiguation
我遇到了int (*q)[3]; // q is a pointer to array of size of 3 integers
讨论非常理解C中的复杂声明。
我无法理解何时使用它以及如何使用它?我如何取消引用它?任何人都可以用一些示例代码来解释我,比如初始化指针并解除引用它。
int main(){
int a =45;
int c[3] = {23};
int b[2][3];
int d[2][5];
int (*q)[3];
b[0][0]=1;
b[0][1]=2;
b[0][0]=3;
q = &a; // warning incompatible pointer type
q = c; // warning incompatible pointer type
q = b; // no warnings works fine
q = d; // warning incompatible pointer type
return 0;
}
在尝试上述语句后,我理解q可以指向一个n row but 3 column
大小的数组。如何取消引用这些值?
printf("%d",*q); gives some strange value 229352.
有人能解释我如何初始化以及如何取消引用指针及其内存布局?
答案 0 :(得分:2)
由于q
可以指向数组,因此必须
q = &c;
和++(*q)[1]
,printf("%d", (*q)[2])
等。请注意,b
的行也是int[3]
类型的数组,因此您还可以将q
的每一行的地址分配给b
:
q = b + 0; // (*q)[i] == b[0][i]
q = b + 1; // (*q)[i] == b[1][i]
(相比之下,d
的行的类型为int[5]
,因此其地址与q
的类型不兼容,当然还有a
的地址也不兼容,因为a
的类型为int
。)