这个跟指针函数与函数指针有点像,所以特意再重新学一学,写一写。
数组指针
就是说,指向数组的指针(指向数组的指针),本质上是一个指针。其实跟使用数组本身没什么区别。
例如: int (*pA)[n], 意思是,pA指向一个长度为n的数组,那么当pA + 1,就会跳过整个数组,如果有下一个长度为n的数组,就会指向下一个数组。
这种数组对二维数组很有用:
比如说二维数组:
int ary[3][5];
int (*pA)[5]; 定义一个数组指针,指向长度为5的一个int 类型数组
现在就可以把二维数组的首地址给pA, 首地址就是ary[0]或者&ary[0][0]
pA = ary// 此时pA 指向的是ary的第一行5个元素
pA++ 指向了ary下一行,即,ary[1]行
例子:
int i=0,j=0;
// 测试数组指针
int a[2][3];
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
a[i][j] = i+1;
}
int (*pA)[3];
pA = a;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d",*(*(pA+i)+j)); // 或者,*(pA[i]+j), pA[i][j]
}
printf("\n");
}
// 测试数组指针
int a[2][3];
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
a[i][j] = i+1;
}
int (*pA)[3];
pA = a;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d",*(*(pA+i)+j)); // 或者,*(pA[i]+j), pA[i][j]
}
printf("\n");
}
指针数组
所有元素都为指针的数组,本质上是一个数组,只不过数组里面都是指针。
比如说 int* pA[n]; pA[0], pA[1],......,pA[n-1]是数组里面的元素,是地址,如果想得到里面的值,那么就是*pA[0], *pA[1],......,*pA[n-1]
对于二维数组的情况:
int ary[3][5];
int *pA[3]; // 注意这个3 和数组的3行是相同的
那么, pA[0] 就表示一个地址,加入pA[0] = ary[0] 或者 pA[0] = &ary[0][0], 就表示pA[0]指向了二维数组的第一行
所以*(pA[0]+0),*(pA[0]+1),*(pA[0]+2),*(pA[0]+3),*(pA[0]+4);表示二维数组的5个元素
对于第二行也一样, 可以用pA[0] + 1, pA[0] + 2
例子:
int * pAA[2];
for(i=0;i<2;i++)
{
pAA[i] = a[i];
for(j=0;j<3;j++)
{
printf("%d",*(pAA[i]+j)); // 当 把 pAA = a时,可以用*(*(pAA+i)+j) 、(*(pAA+i))[j]、p[i][j]来输出
}
printf("\n");
}
for(i=0;i<2;i++)
{
pAA[i] = a[i];
for(j=0;j<3;j++)
{
printf("%d",*(pAA[i]+j)); // 当 把 pAA = a时,可以用*(*(pAA+i)+j) 、(*(pAA+i))[j]、p[i][j]来输出
}
printf("\n");
}
推荐一篇博客,讲的很是详细:http://www.cnblogs.com/mq0036/p/3382732.html