欢迎关注本公众号,专注面试题拆解
分享一套视频课程《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
文章推荐