指针数组的⽤法
指针数组
1、学习⽬标
掌握指针数组的⽤法
总结与思考
2、指针数组
所谓指针数组是指由若⼲个具有相同存储类型和数据类型的指针变量构成的集合。
指针数组的⼀般说明形式:
<;存储类型> <;数据类型> *<;指针数组名> [<⼤⼩>]
指针数组名表⽰该指针数组的起始地址
声明⼀个指针数组
double * p[2] (指针数组), a[2] [3](⼆维数组);
把⼀维数组a[0]和a[1]的⾸地址分别赋予指针变量数组的数组元素p[0]和p[1]。
p[0]=a[0]; //等价p[0]= &a[0] [0]; p[0]指向了⼀维数组a[0]的第⼀个元素a[0] [0]
p[1]=a[1]; //等价p[1] = &a[1] [0]; p[1]指向了⼀维数组a[1]的第⼀个元素a[1] [0] p[0]=a[0];p[1]=a[1];原理⽰意图:
⽰例:指针数组与⼀维数组的关系
#include <stdio.h>
int main()
{
int * p[3];
int a[] = {3,6,1,9,10};
p[0] = a;
p[1] = a + 1;
p[2] = a + 3;
//p[0],p[1],p[2]均为地址
printf("%d %d %d\n", a[0], a[1], a[3]);
printf("%d %d %d\n", *(p[0]), *(p[1]), *(p[2]));
//[]的优先级⾼于* 所以()可以省略
return 0;
}
运⾏结果:
$ ./app
369
369
指针数组与⼆维数组的关系
#include<stdio.h>
int main()
{
int a[2][3]={{1,4,6},{12,9,7}};
int* p[2];
p[0]= a[0];//&a[0][0]
p[1]= a[1];//&a[1][0]
printf("%d\n", a[0][1]);
printf("%d\n",*(a[0]+1));//加*取值
printf("%d\n",*(p[0]+1));//⼀级指针加1是移动⼀个数(列)
printf("%d\n",*(p[1]+2));
return0;
}
运⾏结果:
$ ./app
4
指针与二维数组
4
4
7
⽰意图:
3、程序举例
编程:利⽤指针数组处理⼀个⼆维数组,要求求出⼆维数组所有元素的和。
(1)指针数组加1,移动多少字节?
#include<stdio.h>
int main()
{
int a[2][3]={{1,4,6},{12,9,7}};
int* p[2]={a[0], a[1]};
printf("%p %p\n", p[0], a[0]);
printf("%p %p\n", p[1], a[1]);
//p[0]指向a[0],p[1]指向a[1]
//p[0]指向a[0],p[1]指向a[1]
return0;
}
运⾏结果:
$ ./app
0x7ffeba244cc00x7ffeba244cc0
0x7ffeba244ccc0x7ffeba244ccc//12个字节3*4(2)访问第i⾏第j列。
#include<stdio.h>
int main()
{
int a[2][3]={{1,4,6},{12,9,7}};
int* p[2]={a[0], a[1]};
int i, j;
//  printf("%p %p\n", p[0], a[0]);
//  printf("%p %p\n", p[1], a[1]);
for(i =0; i <2; i++){
for(j =0; j <3; j++)
printf("%d %d %d", a[i][j],*(a[i]+j),*(p[i]+j));
//  printf("%d %d ", *(*(a+i) + j), *(*(p+i) + j));
//拆开下标
puts("");
}
return0;
}
运⾏结果:
$ ./app
111444666
121212999777
(3)求和
#include<stdio.h>
int main()
{
int a[2][3]={{1,4,6},{12,9,7}};
int* p[2]={a[0], a[1]};
int i, j, sum =0;
//  printf("%p %p\n", p[0], a[0]);
//  printf("%p %p\n", p[1], a[1]);
for(i =0; i <2; i++){
for(j =0; j <3; j++)
sum +=*(p[i]+j);
}
printf("sum = %d\n", sum);
return0;
}
运⾏结果:
$ ./app
sum =39
4、总结与思考
主要介绍了指针数组的⽤法,包括声明,初始化,赋值及指针数组如何访问⼆维数组等。
思考
如何计算指针数组占⽤的内存空间?
#include<stdio.h>
int main()
{
int a[2][3]={{1,4,6},{12,9,7}};
int* p[2]={a[0], a[1]};
int i, j, sum =0;
printf("total: %d\n",sizeof(p));
return0;
}
运⾏结果:指针在64位机中长度占8字节,int *p[2]中有两个长度为8字节的地址
$ ./app
total:16
指针数组名加1,移动多少字节?
*(p+1):⾛了⼀⾏; * (p+1)+1⾛了⼀列
字节数由指针数组指向的数组内容决定,见“程序举例(1)”
指针数组名相当于什么样的指针?
指针数组名就是元素地址相当于⼀级指针取地址就是⼆级指针,故指针数组名相当于⼆级指针
“数据类型 * q ” 本⾝就是⼀个指针,⽽它的数据类型是int * 也是⼀个指针,故称为⼆级指针。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。