如何,在哪里以及为什么有人会使用int(* q)[3];

时间:2014-10-09 09:30:11

标签: c arrays pointers

我正在阅读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.

有人能解释我如何初始化以及如何取消引用指针及其内存布局?

1 个答案:

答案 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。)