From:http://soft.chinabyte.com/database/339/12423339.shtml
最近在百度知道里面发现很多学习初学者搞不清楚行指针的具体概念,今天在这里作下详细的解释分析。
行指针,顾名思义就是指向一行的指针。那么哪里会用到行指针呢,用的最多的,那就是二维指针了,大家都知道,我们通常把二维指针看成一个行列式,但是它在内存中的排序却是和一维指针一样的。
比如组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。