指针数组
- 所谓指针数组是指若干具有相同存储类型和数据类型的指针变量构成的集合
- 指针数组的一般说明形式:
- <存储类型><数据类型>*<指针数组名>[<大小>]
- 指针数组名表示该指针数组的起始地址 声明一个指针数组: auto double *p[2],a[2][3];//定义一个一维指针数组、二维指针数组
- 把一维数组a[0]和a[1]的首地址分别赋予指针变量数组的数组元素pa[0]和pa[1];
//二维指针数组赋值:
pa[0] = a[0]; //等价于pa[0] = &a[0][0];
pa[1] = a[1]; //等价于pa[1] = &a[1][0];
此时pa[0]指向了一维数组a[0]的第一个元素a[0][0];
而pa[1]指向了一维数组a[1]的第一个元素a[1][0]; 例:
#include<stdio.h>
int main()
{
int * p[3];//含有三个指针p[0]、p[1]、p[2]
int a[] = {1,2,3,4,5};
p[0] = &a;
p[1] = a+1;
p[2] = a+2;
printf("%d %d %d\n",*p[0],*p[1],*p[2]);
return 0;
}
运行结果:
1 2 3
二维数组指针举例:
#include<stdio.h>
int main()
{
int * p[2];//含有三个指针p[0]、p[1]、p[2]
int a[2][3] = {{1,2,3},{4,5,6}};
p[0] = a[0];
p[1] = a[1];
printf("%d\n",a[0][1]);
printf("%d\n",*(a[0]+1));
printf("%d\n",*(p[0]+1));
return 0;
}
运行结果:
2
2
2
例:
#include<stdio.h>
int main()
{
int a[2][3] = {{1,2,3},{4,5,6}};
int * p[2] = {a[0],a[1]};
printf("%p %p\n",a[0],p[0]);
printf("%p %p\n",a[1],p[1]);
return 0;
}
运行结果:
0x7ffec8c40290 0x7ffec8c40290
0x7ffec8c4029c 0x7ffec8c4029c
验证的结果就是a[0] = p[0]。 例:打印二维数组中的元素并计算二维数组中所有元素的值。
#include<stdio.h>
int main()
{
int a[2][3] = {{1,2,3},{4,5,6}};
int * p[2] = {a[0],a[1]};
int i ,j,sum = 0;
for(i = 0;i<2;i++)
{
for(j = 0;j<3;j++)
{
printf("%d,%d ",*(a[i]+j),*(p[i]+j));
sum+= (*(p[i]+j));
}
puts("");
}
printf("sum = %d\n",sum);
return 0;
}
运行结果:
1,1 2,2 3,3
4,4 5,5 6,6
sum = 21
总结与思考
- 主要介绍了指着数组的用法,包括声明、初始化、赋值及指针数组如何访问二维数组等
思考 - 指针数组名加1,移动多少字节?
移动4个字节 - 指针数组名相当于什么样的指针?
指针数组名称相当于一个二级指针。