Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

Vinllen Chen


但行好事,莫问前程

C指针运算在高维数组中的应用

  今天,看到一个很好的例子,讲解指针和高维数组:
比如声明如下:int a[4][5];
则:
  &a: 表示数组的首地址
  a: 类型为int (*)[5],即a为指向数组a第0个元素a[0]的指针,且a为常量,不可以进行赋值运算,a+i的类型也同为int (*)[5],指向a[i];&a+1等同于&(a+1)跳过全部20个元素,指向数组末尾的下一个。
  *a或a[0]: 类型为int *,*a为指向数组a[0]首元素a[0][0]的指针;
  *(a+1)或a[1]: 类型也为int *,因a的类型为int (*)[5],即a指向一个有5个元素的一维数组,故a+1将跳过5个元素。则(a+1)为指向数组a的第1个元素a[1]的指针,即*(a+1)或a[1]为指向数组a[1]首元素a[1][0]的指针
  *(*(a+1)+2): 类型为int,因*(a+1)类型为int*,故*(*(a+1)+2)将跳过2个int元素。则*(*(a+1)+2)为指向数组a[1]第二个元素a[1][2]的指针,即*(*(a+1)+2)为数组a[1]的第2个元素a[1][2].

  由以上总结得到:

  1. &a的类型为 int(*)[4][5];
  2. a+i的类型为 int(*)[5];
  3. *(a+i)的类型为int *;
  4. *(*(a+i)+j)的类型为int;
  5. *(a+i)=a[i];
  6. *(*(a+i)+j)=*(a[i]+j)=a[i][j]

About the author

vinllen chen

Beijing, China

格物致知


Discussions

comments powered by Disqus