C++之关于变量名、地址、指针、引用、解引用的理解

C++之关于变量名、地址、指针、引用、解引用的理解

变量名和地址

变量名是指内存空间的名字(好比人的名字),地址是指内存空间的编号(好比人的身份证号码),通过变量名或者地址都能获取这块内存空间的内容(就好比通过名字或者身份证都能找到这个人)。

指针

指针就像是其他变量一样,那为什么不直接叫变量呢?与变量不同的是,指针存储的不是真实内容,而是要访问内容的地址。

int a = 10;
int *p = &a;	//这就定义了一个指向变量a的指针p

引用

引用是某一个变量或对象的别名(好比人的绰号,不管有多少个绰号,指的都是同一个人)。

看看它的语法定义格式:类型 &引用名 = 目标变量名。

int a = 10;
int &bn = a;	//访问bn实际上就是访问a,都为10
/*
 *注意bn和a的内存空间地址都一样,意思就是说声明引用时并没有分配
 *新 的内存空间,它只是拿了变量a的地址来用,所以知道为什么叫引用
 *了吧
 */

解引用

解引用就是取内存地址里的具体值,例如:

int a = 10;
int *p = &a; 
*p;	//得到的是变量a的值。

相信比较多人有点乱了,取地址和引用都是用&符号,定义指针变量和解引用都是用*符号,那么怎么区分呢?

可以看出等号右边用&表示的是取地址,等号左边用&表示的是引用的定义;等号右边用表示的是解引用,等号左边用表示的是指针变量的定义

好了,有没有明白过来,了解了概念之后,下面我们通过程序来强化。

示例

int x = 5;
int *ptr = &x;
*ptr;
/*
 *ptr是指针变量,它的内容就是x变量的地址,我要怎么拿到这个5
 *呢,*ptr就是取x变量地址的内容,这就叫做解引用
 */

引用是一个指向其它对象的常量指针,它保存着所指对象的存储地址。并且使用的时候会自动解引用,而不需要像使用指针一样显式提示。所以:

int a = 10; 
int &bn = a;
/*
 *不管你用变量名a还是bn都是指变量a的内存空间(好比一个人除了有名
 *字,也可以有绰号,但不管怎么样都是指这个人)
 */

C++创建对象时返回的是对象地址,要用指针来接收,例如:

Demo *demo = new Demo();

能不能像java这样Demo demo = new Demo(),然后使用demo.属性名呢;这个时候就要使用引用了,例如:

Demo &demo = new Demo();

总结

指针和引用的区别

  • 指针有自己的一块空间,而引用只是一个别名;
  • 使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
  • 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;
  • 可以有const指针,但是没有const引用;
  • 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;
  • 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;
  • 可以有const指针,但是没有const引用;
  • 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;
  • 指针可以有多级指针(**p),而引用至于一级;
  • 指针和引用使用++运算符的意义不一样;
  • 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值