C++指针学习笔记(二)——理解指针与引用

如何理解指针与引用

内存空间像当于一栋房子,每个房间都有编号,编号相当于内存地址。而每个房间里的人就相当于我们在内存中存储的数据。
下图是一张二进制文件,它和物理内存中的存储原理是一样的,不妨用它做个例子:
存储空间示意上图中每行相当于每个楼层,而每一列相当于处于同一楼单元的所有房间。
我们在000011A0楼层的第4和第5个房间分别存了两个数,0x31和0x32。
000011A4就是第4个房间的地址,房间里的内容是0x31,房间容量1字节。
000011A5就是第5个房间的地址,房间里的内容是0x32,房间容量1字节。
如果想存储占用2个字节的数据类型,如short int, 就需要把两个房间打通,合在一起,这时,房间的地址用靠前面的地址代表(即房间4#),房间容量变成2个字节。比如图中,我们在 编号为000011A4、容量为2字节的房间里存了一个2字节整数0x3231(对应十进制12849)。

我们定义:

short int x = 12849;

系统就会为x分配一个字长2字节的空间,并将该空间地址告诉x。
用面向对象的思路理解,x相当于x.value, &x相当于x.addr(&x中还包括&x的数据类型)
即:

x.value=12849;
x.addr=0x000011A4;

结论:引用就是对系统分配给变量的存储空间的调用,包括起始地址和空间长度(即数据类型),而不仅仅是地址

那么,变量是什么?比如x到底是什么?
我们再定义:

short int &y=x;

我们会发现,&y==&x, 系统为变量y分配的空间起始地址就是x的地址。x和y值一样,地址也一样。它们本来就是一个东西。y就相当于x的别名。比如,王子文同学住在金地雅苑8栋3门902。王子文同学还有一个小名叫王小虎,同学们根据王小虎的名字也能找到8栋3门902,而且发现王子文同学家里存的东西和王小虎家里的东西完全一样。

结论:变量名就是程序为一个特定存储空间及其内容构成的对象分配的一个称号。

结论:把变量看成一个存储对象,该对象有三个属性:地址、容量和内容。而变量名x、y就是程序给这个对象起的一个名字,以便在程序中调用,编译后将不复存在。

那么指针又是什么?
我们定义:

short int * p = &x;

取x的值和地址分别如下:

p;(取地址x.addr)
*p;(取值x.value)

我们会发现,p也有自己的地址,即&p, 而且&p != &x,所以,系统为p另外分配了一个地址。既然有地址,p自然也就有自己的存储空间,而且sizeof( p )也不等于sizeof(x),在32位系统里,sizeof( p )=32/8=4 bytes。为何?因为p里存储的内容是一个地址,在32位系统中,地址的长度是32位。

我们还回到王小虎的例子,王小虎邀请同学到他家做客,但没有告诉同学们门牌号,而是告诉同学们,请先到物业办公室,我在那留了一张纸条,上面有我家地址。同学们到了金地雅苑,问看门的大爷,小区物业办公室咋走?大爷指了指右前方。同学们沿着大爷指的方向发现了物业办公室的牌子,正挂在3栋1门101门口,同学们在办公室里发现了一个王小虎留下的一张纸条,上面写着,8栋3门902。同学位根据这个地址,找到了王小虎。

这个例子中,物业办公室就相当于指针p, 它也有自己的地址3栋1门101,也有自己的存储空间,3室一厅,要不然,王小虎留的纸条没地方放。同学们根据看门大爷提示找物业办公室,就相当于做了&p操作,看纸条的过程相当于p(即获得了x.addr),找到王小虎相当于*p(即得到了x.value)

结论:指针是一种特殊的变量,这种变量也有自己的地址和容量,但与一般变量不同的是,这种变量中存储的内容是其它变量的地址。

地址也是一个整型数字,所以,我们也可以定义一个非指针型的整型变量,将其它变量的地址赋给该整型变量,通过取该整型变量的值,就可以获得其它变量的地址,从而获得其它变量的值。

int addr = 0x002904fe; //addr存储了一个地址
float *p ;
p = (float *)addr; //将地址强制转换为一个指向该地址的浮点型指针
cout<<"The value from the given address is:"<<*p<<endl;
}
//以上代码只为举例说明,实际运行会出错,因为指定的addr可能不是本程序可访问的内存地址

理解了指针,指针的指针也很容易理解,它同样有自己的地址,容量和内容。继续用王小虎的例子,指针的指针相当于街道,从街道找到小区物业,从小区物业再找到王小虎家。

int x=0;
int *p =&x;
int **pf = &p;
表达式
&pfpf.addr
pfpf.value = p.addr = &p
* pfp.value = &x
** pf* p = x.value
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值