面试官最爱问的9个C++指针与引用问题,你准备好了吗?

旅行   2024-11-25 08:08   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程《C++百万并发服务器开发》,有需要的加我微信获取:fb964919126


01

指针和引用的区别



指针是一个变量,其指向一个地址,本身占用内存。指针的大小取决于系统架构。引用本质上是一个别名,它本身不占用内存


指针可以为空,并且可以改变指向,而引用必须初始化且不能再改变。


对指针进行sizeof会返回指针的大小,而对引用进行sizeof会返回引用所绑定变量的大小而不是引用本身的大小,这也说明了引用本身不占用内存


作为参数传递时,指针也会形成一个副本,修改这个副本不会改变原指针,而引用修改会改变原始变量。


指针可以有多级,比如上面说的要像修改原指针,就需要传二级指针,而引用只能是一级,有个特殊情况是右值引用,但它并不是引用的引用,而是另一种类型的引用。


02

参数传递什么时候用指针?什么时候用引用?什么时候值传递?




只使用不修改需要修改
内置数据类型值传递指针传递
数组指针传递指针传递
结构体
指针或引用(较大的结构)指针或引用(较大的结构)
类对象指针或引用指针或引用
指针传递
传递的是指针的值(即地址),而不是指针所指向的数据的拷贝。
修改指针所指向的数据:函数内部可以通过指针修改指针所指向的数据,这些修改会影响到原始数据
传递指针本身:需要使用二级指针或指针的引用,才能在函数内部改变指针的指向。
引用传递
直接操作原始对象:函数内部对引用参数的任何修改都会直接影响到调用者提供的对象。
避免拷贝开销:对于大型对象,引用传递可以避免拷贝带来的性能开销。
值传递
值传递拷贝的数据是传递的变量的值,当变量较大时效率慢。
函数需要返回内部变量的内存时要用指针传递,返回局部变量的引用时无意义的,因为局部变量在函数作用域结束后会销毁。
对栈空间比较敏感如递归时使用引用传递,不需要创建临时变量,开销更小。
类对象作为参数传递时:
当函数需要修改调用者提供的对象时,使用引用传递是最常见和推荐的做法。对于大对象(如复杂的类实例),使用引用传递可以避免不必要的拷贝操作,提高性能。
当参数可以为 nullptr 时,使用指针传递可以明确表示参数的可选性。当需要传递动态分配的对象或数组时,指针传递是必要的。当需要在函数内部改变指针的指向时,使用指针传递是唯一的选择。

03

引用的底层实现



在C++中,引用的底层实现通常是由编译器处理的,编译器将引用转换为一个隐式的指针,但不会为这个指针分配单独的内存空间。引用的地址实际上是被引用对象的地址。每次使用引用时,编译器会自动插入解引用操作,使得引用的使用更加简洁和直观。


04

一个指针占用多大内存



32位系统 4字节

64位系统 8字节


05

常量指针和指针常量的区别



常量指针(const int *):是底层常量,表示一个指向常量整数的指针,即指针所指向的数据是常量,不能通过该指针修改数据。这里的关键在于“常量”指的是指针所指向的数据,而不是指针本身。


指针常量(int * const):是顶层常量,表示一个指针常量,即指针本身是常量,不能改变其指向的地址,但可以通过该指针修改所指向的数据。这里的“常量”指的是指针本身,而不是指针所指向的数据。


06

函数指针和指针函数的区别



函数指针

定义:指向函数的指针。

声明:返回类型 (*指针变量名)(参数列表);

用途:用于存储函数的地址,可以通过该指针调用函数。


指针函数

定义:返回指针的函数。

声明:返回类型* 函数名(参数列表);

用途:返回一个指针,通常用于动态内存分配或返回复杂数据结构的地址。


07

数组名和指针的区别?



数组名

本质:数组名是数组的首元素地址的常量。

不可修改:不能改变数组名的值。

占用内存:数组名本身不占用额外的内存,数组的内存是在栈或静态区域分配的。


指针

本质:一个变量,存储另一个变量的地址。

可修改:可以改变指针的值,使其指向不同的地址。

占用内存:指针本身占用内存,大小取决于系统(通常是4字节或8字节)。


08

空指针



空指针是一个特殊的指针值,表示不指向任何有效内存地址。


通常用 nullptr、NULL 或 0 表示。


用于初始化指针,表示该指针尚未指向任何有效的对象或内存地址。


访问空指针会导致未定义行为,通常会导致程序崩溃或错误。


09

野指针和悬空指针



野指针

未初始化的指针,指向不确定的内存地址。

指向的地址是随机的,可能指向任何地方。


悬空指针

曾经指向有效内存地址的指针,但该内存地址已经被释放或删除。

指向的地址曾经是有效的,但现在不再有效。


end



CppPlayer 



关于AI编程工具:Cursor,现在官方有漏洞可以无限续期。需要方法的加我vx: fb964919126


文章推荐

面试官不讲武德,偷袭我一个大学生:当"我知道答案"遇上"请解释原理"
面试题:什么是用户态和内核态,如何进入内核态?——分叉智能科技一面
面试题:使用 GDB 如何调试 Core 文件?
面试题:poll为什么使用poll_list链表结构而不是数组 - 深入内核源码分析

CppPlayer
一个专注面试题拆解的公众号
 最新文章