指针(4)——指针数组和指针的指针

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
      一分耕耘,一分收获,努力越大,收获越多!

目录

一、指针数组:

二、指向指针的指针:

三、总结归纳:


一、指针数组:

        由指向同一数据类型数据的指针作为元素组成的数组称为指针数组。定义指针数组的一般形式为:

                类型*数组名[数组长度]

例如:

char *str[3]={"one","programming","ok"};

        定义了一个具有三个元素的数组,每个元素都是一个指向字符型数据的指针变量,指
针变量中存储它所指向的字符串的首地址。该定义语句等价于如下语句:

char *str[3];
	str[0]="one";
	str[1]="programming";
	str[2]="ok";

        采用指针数组存储字符串时,字符串在内存中可按实际长度存放

        假设上述三个字符串在内存中是顺序存储的,且第一个字符串的首地址为 1001H,那么上述语句所表示的存储关系如图a所示。

图 ​​​a

                若用二维字符数组存放字符串,则每个字符串都要占用等长的存储空间,它的长度至少应等于最长的字符串的长度,这将浪费许多存储空间。

        例如:

char str[3][12]={"one","programming","ok"};

         定义了一个3行12列的二维字符数组,系统将为其分配36字节的存储空间。字符数组str初始化后的状态如图b所示,其中有许多存储空间被浪费了。

图 b

         当指针数组各个元素分别指向字符串的首地址后,就可以通过指针数组元素引用字符串了。

例如:

        利用指针数组处理字符串

#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 个取内容运算符

三、总结归纳:

        重点在于理解指针变量也要分配内存空间,指针变量的地址称为指针的指针。存放指针变量地址的指针变量是指向指针的指针变量。反复理解这句话,即可理解指向指针的指针。

        二级指针保存一级指针的指针

        三级指针保存二级指针的指针

        最后,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。若这篇文章中有哪些不正确的内容,欢迎大家在评论区和我交流讨论!

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梵豪

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值