指针和引用的区别(C++)
一、C++中的指针和引用的区别
1、本质区别:指针有自己的一块空间(地址),而引用只是一个别名。
2、使用sizeof看一个指针的大小是4(64位是8),而引用是被引用对象的大小。
3、指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用。
4、作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象。
int i = 10;
int* p= &i;
*p = 100;//<即给i赋值100,*p除了在定义时时指针之外,其他地方都称为解引用。
解引用: 引用指p指向了i的地址,要取出i的内容,就相当于从i的地址中解出内容,所以称为解引用。
5、可以有const指针,但是没有const引用。
(1)、常量指针VS常量引用
常量指针:
运行结果:
常量引用:
i = 10;
const int& ref = i;
和常量指针类似,不能通过引用修改指向的对象(i)的内容;
但是可以通过i简介改变。
运行结果:
(2)指针常量VS 引用常量
指针常量:
运行结果:
引用常量:
int& ref = i;
因为引用本身在定义时就必须进行初始化,而且不可以改变指向的对象,所以不存在引用常量这种说法,没意义。
(3)、常量指针常量
const int* const iPointer = &i;
说明: iPointer的内容和他所指向的地址中的数据均不可以改变;
6、指针在使用中可以指向其他对象,但是引用还只能是一个对象的引用,不能被改变;
7、指针可以有多级指针(**p),而引用只有一级。
eg:
8、指针和引用使用++运算符的意义不一样 ;
说明:
int i = 10;
int& iQuto = i;
int* iPointer = &i;
iQuto++;
iPointer++;
//<输出说明:
i = 11;
iQuto = 11;
iPointer指向的是i的地址的下一个地址;
*iPointer的值是i的地址的下一个地址中存储的值;
9、如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏。
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?