上一章我们已经了解了指针的灵活性,对于一个指针游标(unsigned char *)可以指向内存的任意一个字节,但是对于取值实际而言,我们需要进行不同步长的取值。

二维数组

有如下矩阵作为二维数组:

  1. int arr[2][3] = {
  2. {1,2,3},
  3. {4,5,6}
  4. };

现在我们需要一个指针来每次指向一行,指针每次加一,便指向下一行。
此时我们需要组指针。

  1. int (*p)[3];
  2. p = arr;

但需要注意的是组指针是有两层指针构成的。
因此需要使用两次解指针来访问元素。要想访问列中的各个元素,需要额外的访问指针。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4. int arr[2][3] = {
  5. {1,2,3},
  6. {4,5,6}
  7. };
  8. int (*p)[3];
  9. p = arr;
  10. int *r = p[0];
  11. printf("%p\n%p\n",p,p+1);
  12. printf("%d %d\n",**p,**(p+1));
  13. printf("%d %d\n",*r,*(r+1));
  14. r = p[1];
  15. printf("%d %d\n",*r,*(r+1));
  16. }

输出为:

  1. 000000000061FDF0
  2. 000000000061FDFC
  3. 1 4
  4. 1 2
  5. 4 5