关于指针的理解

之前写过关于链表的文章,现在用链表“纸条与盒子”的理解再来看看指针。
按照链表的理解,指针可理解为一个小纸条,上面记着一个盒子的位置,这个盒子里装着一点东西。然而最易混的是,盒子里的东西和纸条本身完全没有关系。无论盒子里装着什么,即指针指向的变量的类型与数据如何,指针仍是一张纸条,上面不会随之有任何变动。
这一点曾在我学习链表时造成了不少困扰。这是一个很简单的理解,不过我们将其提前声明一下,一定对后面的理解有作用。
下面是指针变量的声明。即:
指针所指向的变量类型 *指针变量名;
如,我们声明一个指向整型变量的指针就是:

int *p;

但是一个易混点就出现了。此时的指针变量p,和int没有半毛钱关系。它只是一个纸条,它对其指向的盒子的类型做了限定,即整型。
这里分清,就可进行下一步,即区分*和&。
*我们很熟悉,它是指针变量的声明时加在类型和名称中间的运算符,表示这个变量是一个指针变量(小纸条)。但是,要区分的是,这里的*和后面运算中的*不是一个东西。指针声明时的*与前面的int一起被称为int*类型,即指向int型的指针类型。这里要注意。
所以,*在指针运算中的意义到底是啥?它叫做指针运算符,用它可以对一个指针进行还原,即返回它所指的变量。而&,叫做取地址运算符,它可以返回一个变量的地址,并可以赋值到指针变量里。
没错,所以我们要把一个指针指向一个变量,只需要这样:

int a;
int *p=&a;

就可以有一个指针p指向一个变量a。
而后我们如要通过p这个指针来访问a这个变量,那么我们只需:

*p;

就可返回a变量的值,此即通过地址还原变量。
而既如此,则我们可知,*&a指的是a的地址所指向的变量,即a变量本身;&*a指的是a所指变量的地址,即a指针变量本身。
我们已经熟悉了*和&的用法,可是在其他代码的阅读中,我们还会遇到诸如:

int &a;
int b;
a=b;

的情况。这是怎么回事呢?这其实是另一种类型,叫做引用类型;a就叫引用变量。和指针类型相似,每个类,如int,除了会有其指针类型(int*)外还会有引用类型,即int&。同样,这里的&和指针运算里的&没有任何关系。
要理解引用类型的意义,我们需要先了解指针的意义。
为什么会有指针这一概念?首先,我们知道指针所含是系统内存中存储变量的地址。如,我们有指针变量p和普通变量a,p=&a,那么我们就知道,p和&a是相等的,所以*p和a就是两个拥有同一地址的变量;当*p改变时,p内存地址下数据发生改变,使用改地址的变量a也同时改变,反之亦然。此时,*p和a变一个,另一个也随之而变,这被称作引用。
可以说,指针的出现,是为了实现这样的引用的。那,引用类型是什么意思呢?
我们虽有了完善的指针可以实现引用,可是赋值时p=&a,使用时用*p,这也太麻烦了。所以,就有了引用类型,即:
引用变量所引变量类型&
这种类型声明的变量,在使用其他变量赋值时,会和其他变量共用地址,即,全自动创造一个共用一个地址的变量。这就很简洁了,使用时用int&a=b,用时直接用a,b,不用一堆乱七八糟的运算符。
这就是我对指针和引用的理解,感谢各位前辈!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值