网站首页 > 技术教程 正文
引言
这也是一道C++开发工程师在面试中经常被问到的题目,本文将从指针和引用的几方面区别和各自的常用用途展开讲解,助力各位在面试中大放异彩。
指针和引用的区别
1、指针是一个变量,储存的是一个地址,通过该地址可以操作内存中的数据。引用是别名,相当于直接操作原对象,就像腾讯和鹅厂一样,说腾讯怎么怎么样说的是腾讯,说鹅厂怎么怎么样说的也是腾讯。
2、指针可以为空,引用不可以且引用必须初始化。
int a = 10;
int *ptr_0; //可以通过编译并且能够正常运行,但不推荐。
int *ptr_1 = nullptr; //可以通过编译并且能够正常运行
int& ref_0 ; //报错 error: 'ref_0' declared as reference but not initialized
int& ref_1 = a; //可以通过编译并且为正确的使用方式
3、指针可以有多级,引用只能有一级
int a = 10;
int* p1 = &a; // 一级指针,指向变量a
int** p2 = &p1; // 二级指针,指向一级指针p1
int*** p3 = &p2; // 三级指针,指向二级指针p2
多级指针其实也很好理解,就是通过另一个指针变量来指向一个指针变量而已。
std::cout << *p1; // 输出10,解引用一级指针,获取a的值
std::cout << **p2; // 输出10,解引用二级指针,获取一级指针指向的值
std::cout << ***p3; // 输出10,解引用三级指针,获取二级指针指向的值
但是引用没有这个机制,引用只有一级。
4、指针可以改变指向。引用初始化之后只有一个,你不能说鹅厂是腾讯的别名,鹅厂又是百度的别名,那不行。
5、sizeof指针,指针变量的大小,sizeof引用,为引用对象的大小。
sizeof返回的是指针变量的大小(也可以说是指针的大小),无论其指向何值,他都是固定的。
int* ptr;
std::cout << sizeof(ptr); // 32位系统上输出4,64位系统上输出8
而引用本身并没有自己实际的内存空间,返回的是原对象的大小。
int a = 10;
int& ref = a;
std::cout << sizeof(ref); // 输出4,等同于sizeof(a)
6、当你将指针作为函数参数传递时,传递的是指针的拷贝,而不是原始指针本身。而引用传递的就是原始对象。
void modifyPointer(int* ptr) {
int temp = 20;
ptr = &temp; // 改变指针的指向,但不会影响实参
}
int main() {
int a = 10;
int* p = &a;
modifyPointer(p);
// 此时p依然指向a,而不是temp
std::cout << *p; // 输出10
return 0;
}
上面的例子当中,在main函数调用modifyPointer函数,将指针变量p传入,实际上是拷贝了一个形参变量ptr来接收这个指针变量p。也正是如下图所示。
这里我们假设a的内存地址为0x7ffee,a在这块内存地址上存储的数据为10,指针变量p的内存地址为0x9768,p在这块内存地址上存储的数据为0x7ffee(a的地址),而ptr也一样就是拷贝了一份和p相等的数据而已。在modifyPointer函数内对指针变量ptr进行的更改就会变的如下图所示。
对于形参ptr更改的指向压根不会对实参p有任何影响。
这里再说回引用
void modifyReference(int& ref) {
ref = 20; // 改变引用的值,实际就是改变实参的值
}
int main() {
int a = 10;
modifyReference(a);
std::cout << a; // 输出20
return 0;
}
引用的传入相当于就是传入原对象,对应的更改也会改变实参的值,而且代码会相当整洁。
指针和引用的使用场景
指针:动态内存管理、数组操作如遍历数组、函数指针。
引用:就像上面的代码一样,函数参数传递中的引用使用。
总结
在面试中,如果面试官问到了指针和引用的区别,便可按照第二小节的1~6叙述一遍,如果深入问具体哪方面是怎么样的便可按照我给的解释和例子继续作答。相信读了本文的你再碰到这个问题一定可以对答如流!请给我点个赞吧
猜你喜欢
- 2024-10-04 C++核心准则编译边学-F.43 永远不要返回局部对象的指针或引用
- 2024-10-04 C++|虚函数多态机制的虚函数表及其指针的内存布局及手动引用
- 2024-10-04 C|指针分类与void指针的赋值、解引用与算术运算
- 2024-10-04 第5课,引用方式(锁定) 锁定引用值
- 2024-10-04 C++函数参数采用变量、引用和指针的区别
- 2024-10-04 Java String 手工引用指针 java中指针和引用
- 2024-10-04 C++核心准则C.145:通过指针或引用访问多态对象
- 2024-10-04 C\C++语言11|引用做为函数参数与返回值及与指针的区别
- 2024-10-04 Excel中的引用方式,看过之后你就懂
- 2024-10-04 C++,常量及sizeof函数,传值调用、指针调用和引用调用的区别
你 发表评论:
欢迎- 05-05从virsh当中学习QEMU/KVM启动命令
- 05-05Win10 BCD文件损坏怎么修复?(bcd文件损坏win7)
- 05-05亚马逊春节假期期间的店铺管理设置
- 05-051分钟总结常用k8s常用诊断教程(k8s常见故障)
- 05-05VisiPics重复图片查找软件中文汉化教程
- 05-05微服务的发布实现方式1灰度实现(微服务实现原理)
- 05-05轻松掌握Java多线程 - 第二章:线程的生命周期
- 05-05德拉诺之王邪DK报告:PVE向小测试及分析
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)