归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
一分耕耘,一分收获,努力越大,收获越多!
目录
一、指针数组:
由指向同一数据类型数据的指针作为元素组成的数组称为指针数组。定义指针数组的一般形式为:
类型*数组名[数组长度]
例如:
char *str[3]={"one","programming","ok"};
定义了一个具有三个元素的数组,每个元素都是一个指向字符型数据的指针变量,指
针变量中存储它所指向的字符串的首地址。该定义语句等价于如下语句:
char *str[3];
str[0]="one";
str[1]="programming";
str[2]="ok";
采用指针数组存储字符串时,字符串在内存中可按实际长度存放
假设上述三个字符串在内存中是顺序存储的,且第一个字符串的首地址为 1001H,那么上述语句所表示的存储关系如图a所示。
![](https://img-blog.csdnimg.cn/2ff07defd14c4ef1b1371ad1c92be25f.png)
若用二维字符数组存放字符串,则每个字符串都要占用等长的存储空间,它的长度至少应等于最长的字符串的长度,这将浪费许多存储空间。
例如:
char str[3][12]={"one","programming","ok"};
定义了一个3行12列的二维字符数组,系统将为其分配36字节的存储空间。字符数组str初始化后的状态如图b所示,其中有许多存储空间被浪费了。
![](https://img-blog.csdnimg.cn/e20f808273da46868f659b1b7f9bc163.png)
当指针数组各个元素分别指向字符串的首地址后,就可以通过指针数组元素引用字符串了。
例如:
利用指针数组处理字符串
#include<stdio.h>
int main(){
char *str[5]={"one ","two ","three ","four ","five "};
int i;
for(i=0;i<5;i++){
printf("%s",str[i]);
}
}
运行结果:
处理指针数组比处理字符串本身更容易,这种优点在复杂程序中更为明显。我们再看一个用指针数组处理二维数组的例子。
利用指针数组存储二维数组的元素
#include<stdio.h>
int main(){
int i,j;
int a[4][4],*p[4]={a[0],a[1],a[2],a[3]};
for(i=0;i<4;i++){
for(j=0;j<4;j++){
scanf("%d",*(p+i)+j);
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%3d",*(p[i]+j));
}
printf("\n");
}
}
二、指向指针的指针:
指针变量也要分配内存空间,指针变量的地址称为指针的指针。存放指针变量地址的指针变量是指向指针的指针变量。而指针的指针则是多级指针最简单、最常用的形式。
在多级间接寻址中,一个指针变量中存放的是另一个指针变量的地址,直到最后一级指针变量才存放指向变量的地址。这种多级间接寻址可以延伸到任何一级,但在实际编程中很少用到超过二级间接寻址(指针的指针)的多级指针。因为多级间接寻址降低了程序的可读性,容易出错。
二级指针变量定义的一般形式为:
类型 **标识符;
要访问一个二级指针间接指向的数据,必须两次使用取内容运算符“*”。
例如:
利用二级指针存储二维数组的元素
#include<stdio.h>
int main(){
int i,j;
int a[4][4],*p[4],**pa;
p[0]=a[0];p[1]=a[1];p[2]=a[2];p[3]=a[3];
pa=p;//pa指向指针数组p的p[0]元素,指针数组名是二级指针
for(i=0;i<4;i++){
for(j=0;j<4;j++){
scanf("%d",*(pa+i)+j);
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%3d",*(*(pa+i)+j));
}
printf("\n");
}
}
程序中 pa 指向指针数组 p的 p[0]元素,指针数组 p的元素 p[0]、[1]、p[2]、p[3]依次指向整型数组 a 的元素 a[0][0]、a[1][0]、a[2][0]、a[3][0]。*(pa+i)就是 p[i],也就是元素a[i][0]的地址,*(pa+i)+j 就是元素 a[i][j]的地址,*(*(pa+i)+t)就是元素 a[i][j]。所以,键盘输入的数据存储在数组 a 中,输出的是数组 a 元素的值。
由上述二级指针的概念可知,多级指针的要点如下:
(1)定义指针变量时,指针变量前面有几个星号(*)就是几级指针,如语句 imt ***p;定义了一个三级指针变量 p。
(2) 高级指针不能脱离低级指针单独使用,第n 级的指针变量存第n-1级的指针变量的地址,第一级指针变量存储最终普通变量的地址。
(3)引用 n 级指针变量访问最终的普通变量,指针变量名前需有 n 个取内容运算符
三、总结归纳:
重点在于理解指针变量也要分配内存空间,指针变量的地址称为指针的指针。存放指针变量地址的指针变量是指向指针的指针变量。反复理解这句话,即可理解指向指针的指针。
二级指针保存一级指针的指针
三级指针保存二级指针的指针
最后,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。若这篇文章中有哪些不正确的内容,欢迎大家在评论区和我交流讨论!