面试题:C++指针和引用有什么区别?

旅行   2024-10-10 11:55   广东  

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

分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取
,免费分享。 欢迎V:fb964919126







C++指针和引用有什么区别?





高频出现的题目,最近校招包括互联网大厂百度、腾讯都有问,传统行业大厂海能达、大疆也有问。


在 C++ 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。

01

指针

指针(Pointer)

定义:

指针是一个变量,它存储了一个内存地址。

指针的类型是指向的数据的类型。

声明:

指针通常用星号 * 来声明,例如 int *p; 表示 p 是一个指向 int 类型的指针。

赋值:

指针可以通过赋值操作来指向不同的地址,例如 p = &a;,其中 &a 是变量 a 的地址。

指针可以指向 nullptr 或 NULL(在 C++11 之后推荐使用 nullptr)表示不指向任何对象。

解引用:

使用星号 * 来解引用指针并访问它所指向的数据,例如 *p = 10;。

内存管理:

指针需要手动分配和释放内存(使用 new 和 delete)。

指针可以指向任何类型的内存,包括未初始化的内存区域。

安全性:

使用指针时需要特别小心,因为访问无效或已释放的内存可能导致程序崩溃或未定义行为。


代码示例:

#include <iostream>
int main() { int a = 10; int *p = &a; // p 指向 a *p = 20; // 修改 a 的值 std::cout << "a: " << a << std::endl; // 输出 20
p = nullptr; // p 不再指向任何东西 *p = 30; // 错误!p 为 nullptr return 0;}

02

引用


引用(Reference)

定义:

引用是一个别名,它是一个已经存在的变量的另一个名字。

引用不是真正的变量,它不占用额外的存储空间。

声明:

引用通常用 & 符号声明,例如 int &r = a; 表示 r 是变量 a 的引用。

赋值:

引用一旦初始化后就不能更改,也就是说,不能重新绑定到另一个对象。一旦绑定后,引用始终指向同一个对象。

初始化时必须立即绑定到一个对象,不能是 nullptr

解引用:

引用本身就是一个左值(可以出现在赋值的左边),因此不需要解引用即可访问其绑定的对象,例如 r = 10;。

内存管理:

引用本身不涉及内存分配,它只是现有对象的一个别名。

引用通常用于传递大对象或作为函数返回值,以避免不必要的拷贝。

安全性:

使用引用相对安全,因为引用总是有效,不会指向不存在的对象


代码示例:

#include <iostream>
int main() { int a = 10; int &r = a; // r 是 a 的引用 r = 20; // 修改 a 的值 std::cout << "a: " << a << std::endl; // 输出 20
// 下面的语句是非法的,因为引用不能重新绑定到另一个对象 // int b = 30; // r = b; // 错误!r 不能重新绑定
return 0;}

03

引用不占用内存空间

看下面示例代码:

#include <iostream>
int main() { int a = 9; int& b = a; // b 是 a 的引用 int* p = &a;
std::cout << "a 的地址: " << &a << std::endl; std::cout << "b 的地址: " << &b << std::endl; std::cout << "p 的地址:" << &p << std::endl;
return 0;}

运行输出:



可以看到引用b的地址和变量a的地址是一样的,b就是a的一个别名,它不涉及到额外的内存分配。但是指针p是一个变量,指针本身也会占用内存。


在 C++ 中,引用的内存分配如下:


变量 a:

分配一块内存空间存储 a 的值。

引用 b:

不需要分配新的内存空间,它直接绑定到 a 上。

因此,无论在代码中创建多少个引用,它们都不会占用额外的内存空间,只会占用现有变量的内存。

04

总结

指针:

指针是一个变量,存储地址。

指针本身占用存储空间。

指针可以初始化为空,可以重新指向其他地址。


引用:

引用不是一个变量,而是现有变量的别名。

引用本身不占用存储空间。

引用不能初始化为空,一旦初始化后不能重新绑定到另一个对象

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

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