指针数组其实就是相同数据类型和存储类型的指针变量组成的集合
指针数组和前面提到的数组,字符数组,字符串数组一样都是数组,区别就是他们组成的元素不同
一般说明形式:
<存储类型> <数据类型> *<指针数组名称> [<大小>]
int *p[2],a[2][3]
将数组a[0]和a[1]的首地址分别赋给指针数组pa的数组元素pa[0],pa[1]
pa[0] = a[0];//pa[0] = &a[0][0]
pa[1] = a[1]; //pa[1] = &a[1][0]
#include <stdio.h>int main()
{int a[]={1,2,3,4,5};int *p[2];p[0] = a;p[1] = a+2;printf("%p\n",p[0]);printf("%p\n",&a[0]);printf("%p\n",p[1]);printf("%p\n",&a[2]);return 0;
}
运行程序我们可以发现,p[0]的地址和a[0]地址相同,p[1]的地址和a[2]地址相同。所以我们可以发现,指针数组p[0]包含两个元素,分别是a[0]和a[1]的地址值,输出地址时输出的是a[0]的首地址,以此类推。一维数组和指针数组的关系如下图
用指针数组计算二维数组元素之和
#include <stdio.h>int main()
{int a[][3]={{1,4,7},{2,5,8},{3,6,9}};int *p[3];int i=0,j=0;int sum1=0,sum2=0;for(i=0;i<3;i++){for(j=0;j<3;j++){p[i] = a[i];sum1 += p[i][j];sum2 += *(p[i]+j);printf("%d ",p[i][j]);}puts("");}printf("%d %d\n",sum1,sum2);return 0;
}