针对于指针本质的个人理解“房子理论”


前言

首先感谢下列文章为作者提供思路,其次本文为作者未来查阅所写。

让你不再害怕指针——C指针详解(经典,非常详细)


一、指针和指针变量的定义

若有一个变量专门用来存放另一个变量的地址,那么就称它为“指针变量”。也就是说,指针变量里面存放的是指针,即地址。
大家一定要区分“指针”和“指针变量”这两个概念。指针是一个地址,而指针变量是存放地址的变量。
习惯上我们也将“指针变量”简称为“指针”,但大家心里一定要明白这两个指针的区别。一个是真正的指针,它的本质是地址;而另一个是指针变量的简称。

注:后文中出现的“指针”均代表“指针变量”,若有例外则会特殊说明。

二、指针的定义

1.定义

int m=5;  /* 类型为int 变量名称为m  储存的值为5 */
int* p=&m;  /* 类型为int*(指针类型) 变量名称为p 储存的值为&m(m的地址)  */
int** q=&p;  /* 类型为int**(指针类型)变量名称为q 储存的值为&p(p的地址)  */

为了对不同的指针加以区分,我们习惯性称 int* 为 一级指针 将 int** 称为二级指针,根据*数量的增加依次类推。

2.对变量本质的理解“房子理论”

如下图,在编程语言中我们可以将任意一个变量看做一个房子,它主要由三部分组成:
在这里插入图片描述
说人话就是:
在这里插入图片描述
那么我们根据这个思路来看,前文代码块中变量构成如下:
在这里插入图片描述
将指针具象化为一个房子,目的是将抽象的理论与实际结合从而能够更好的理解,变量(整个房子)所在的空间,就是计算机内存中的一部分空间(政府地皮),变量的地址(家庭住址)就是这一块空间的编号(小区门牌号),依次类推,从而一定程度的理解变量的构成。


三、指针符号&和 * 的理解和使用

前文中提到,一个变量可以看做一个房子,那么&可以理解为一个工具(可以比作放大镜,具体读者可以尝试根据实际自行比喻),我们通过这个工具可以得到这个房子住址的具体值,如下:

int m=5;
cout<<"m=="<<m<<endl;
cout<<"&m=="<<&m<<endl;

在这里插入图片描述

在这里插入图片描述

注意:&运算符在任意变量中都可以使用。


根据上文中对 & 运算符的定义,我们可以得知,指针中所储存的内容为其他变量的地址,那么我们可以将 * 看做一把钥匙,首先我们先正常访问指针p中的内容(m的地址),然后带上钥匙(p前面带上*),从而根据p中存储的m的地址找到并打开m的房间,读取到m房间中的内容(数字5)。如下:

	int  m=5;
	int* p=&m;
	
	cout<<"m=="<<m<<endl;
	cout<<"&m=="<<&m<<endl;
	cout<<"p=="<<p<<endl;
	cout<<"*p=="<<*p<<endl;

在这里插入图片描述
在这里插入图片描述

扩展,当为二级指针时:
在二级指针的情况下依然可以用我们的“房子理论”解释,
首先:一级指针我们已经讨论过了,那么进入二级,q中储存的内容为p的地址,那么先通过第一把钥匙进入p房间,然后通过p房间存储的m的地址,通过第二把钥匙进入m房间,得到数字5.
如下:

	int  m=5;
	int* p=&m;
	int** q=&p;
	
	cout<<"m=="<<m<<endl;
	cout<<"&m=="<<&m<<endl;
	cout<<"p=="<<p<<endl;
	cout<<"*p=="<<*p<<endl;
	cout<<"&p=="<<&p<<endl;
	cout<<"q=="<<q<<endl;
	cout<<"*q=="<<*q<<endl;
	cout<<"**q=="<<**q<<endl;
	cout<<"&q=="<<&q<<endl;

在这里插入图片描述
在这里插入图片描述

注意:* 运算符仅可以在指针变量中使用。


四、结构体指针中->(箭头)与.(点)使用的区别

这个比较好理解,如下:

typedef struct number{
	int k;
}TEST;
//1
TEST mm;
mm.k=6;
//2
TEST* pp;
pp->k=6;

由上面两个例子可得,当结构体变量为一般变量时,想要访问结构体内部的成员,需要使用 . (点运算符),当结构体变量为指针变量时,想要访问结构体内部的成员,需要使用 -> (箭头运算符)。


五、总结

笔者认为本文重点是如何将一个变量理解为一个房子,以及 & 和 * 运算符的另一种定义的理解,从而对指针得出一个针对于个人的理解方式,只要能够根据自己的定义推导出其他相关知识,如根据房子推出 * 的钥匙,能够自圆其说即可。

总结一下: 一个变量由三部分构成,变量名,存储地址,存储内容。
一个变量通过 & 运算符,可以得到它的具体地址,一个指针变量通过 * 运算符,可以得到该指针内储存的地址中所储存的内容(理解为打开那个地址下房子的钥匙)。
点运算符在结构体变量为一般变量时使用,箭头运算符在结构体变量为指针变量时使用。

理解一个概念不一定必须依照教材,若能用自己的理解去解释一类知识,那样将会对其有更深刻的认识。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值