C++——关于指针,一级指针,二级指针

指针,一级指针,二级指针

我们知道指针分为一级指针,二级指针…n级指针,其中一级指针指向其类型的对象,二级指针指向一级指针,以此类推n级指针指向n-1级指针,需要注意的是,上一级指针指向下一级指针,上一级指针的类型要保持和其指向下一级指针的类型相同(void类型指针除外),在本文中假定其类型都相同。

指针的地址,指针指向对象的地址

我们知道,指针存放的内容是地址,那存放的是谁的地址呢,存放的是其指向对象的地址,那指针的地址又是什么呢,我们知道每个对象都有其本身的地址,指针也是一种对象,所以它也有地址。那这二者有什么区别呢,我们知道指针指向某个对象,也就是存储了某个对象的地址,也就是把指向这个对象的地址存储在了指针本身的地址空间里面,也就是俗称的地址里面存储了地址。
如下图

	int val = 1;
	int *ptr = &val;
	cout<<&val<<endl;
	cout<<ptr<<endl;
	cout<<*ptr<<endl;
	cout<<&ptr<<endl;

输出结果为
在这里插入图片描述
我们可以看到,我们定义了一个int变量val,定义了一个int类型的指针ptr指向val,我们第一行输出表示变量val本身的地址,第二行输出表示p存储空间里面的数据,也就是val的地址,所以这两个输出相同,第三行使用了解引用符*,表示的是指针ptr指向对象所存储的值,也就是1,第四行表示指针本身的地址。

我们接下来讨论二级指针与这些地址的关系,看懂了下面的关系,再往后的指针也就是类似了,相信大家会对这些地址的关系会有一个非常清晰的认知

同样的我们二级指针是指向一级指针,那么我们二级指针存储的就是一级指针的地址,我们在上图的基础下做如下定义和输出。
再提一句,例如上图中,我们指针的名字是ptr,而不是ptr,所以我们想要输出指针存储的数据时候,我们输出的是ptr,而不是ptr.当我们输出*ptr时,*表示解引用符,表示输出其指向对象的值。

	int val = 1;
	int *ptr = &val;
	int **ptr1 = &ptr;
	cout<<&val<<endl;
	cout<<&ptr<<endl;
	cout<<&ptr1<<endl;
	cout<<ptr1<<endl;
	cout<<*ptr1<<endl;
	cout<<**ptr1<<endl;

输出
在这里插入图片描述
其中1,2,3行输出的分别是val,ptr,ptr1的地址,我们知道ptr1存储的是ptr的地址,所以第4行输出的是ptr的地址,而*ptr1,对ptr1进行了一次解引用,那么输出的是ptr1指向对象存储的内容,也就是ptr存储的内容,也就是val的地址,所以第五行输出的是val的地址,而**ptr1进行了2次解引用,那么输出的是其指向的对象指向的对象的值,也就是ptr指向对象的值,也就是val的值。

关于指针的一些基础知识,大家清楚了吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值