C++面试八股文:指针与引用的区别

引言

这也是一道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叙述一遍,如果深入问具体哪方面是怎么样的便可按照我给的解释和例子继续作答。相信读了本文的你再碰到这个问题一定可以对答如流!请给我点个赞吧

相关推荐
李兴球10 分钟前
这个来自五线城市的C++兴趣班的程序可不一般
c++
White_Can38 分钟前
《C++11:智能指针》
c++·c++11·智能指针
无限进步_38 分钟前
【数据结构&C语言】对称二叉树的递归之美:镜像世界的探索
c语言·开发语言·数据结构·c++·算法·github·visual studio
im_AMBER1 小时前
Leetcode 98 从链表中移除在数组中存在的节点
c++·笔记·学习·算法·leetcode·链表
CSDN_RTKLIB1 小时前
C++取模与取余
开发语言·c++
蘋天纬地1 小时前
蚂蚁数科二面-如果目前当前系统qps是100,如何降低成本
面试
星河耀银海1 小时前
C++开发入门——环境搭建与第一个程序
开发语言·c++·策略模式
测试界的海飞丝1 小时前
14:00面试,14:06就出来了,问的问题过于变态了。。。
测试工具·面试·职场和发展
码农水水1 小时前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
_OP_CHEN2 小时前
【算法基础篇】(四十四)数论之欧拉定理与扩展欧拉定理深度解析:从降幂到超大规模幂运算
c++·算法·蓝桥杯·算法竞赛·欧拉定理·扩展欧拉定理·acm/icpc