行指针与列指针_2

行指针,顾名思义就是指向一行的指针。那么哪里会用到行指针呢,用的最多的,那就是二维指针了,大家都知道,我们通常把二维指针看成一个行列式,但是它在内存中的排序却是和一维指针一样的。

  比如组a[2][3]={{1,2,3}{4,5,6}},a是整个数组的首地址,同时也指向第一行元素,即a是一个行指针,它每加1,所指地址移动二维数组的一行,a+1指向第二行元素。

  对a取*,即*a指向第一行第一个数,*(a+1)指向第二行第一个数,可见,对行指针取值就成了列指针,此时它还是个指针。它每加1,所指地址移动一个元素,*(a+1)+1指向第二行第二个元素,也可以写成a[1]+1。

  **a(也可写成a[0][0])就是这个二维数组第一行的第一个元素,**(a+1)(也可写成a[1][0])就是第二行的第一个元素,*(*(a+1)+1)(也可写成a[1][1])是第二行的第二个元素。可见,对行指针取2次*就成了某个元素的值了,而不再是地址。

  有这样一个公式a[i][j]=*(*(a+i)+j),应该就知道为什么了吧…

  行指针还可以这样定义int (*p)[n],此处定义的p指针,每加1,移动n个地址位(针对不同二维数组定义不同的n值)比如下面的这段:

  int main(void)

  {

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

  int (*p)[3];

  p = a;

  p++;

  printf("%d",**p);

  }

  此段代码输出结果为4,p是个行指针,可以直接将a这个行指针直接赋值给它,此时p也指向二维数组的起始地址,即第一行。p++就会移动3个元素,从而指向第二行。用法同二维数组名a

猜你喜欢

转载自blog.csdn.net/jzjz73/article/details/77917746