欢迎关注本公众号,专注面试题拆解
分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取 ,免费分享。 欢迎V:fb964919126
C++指针和引用有什么区别?
高频出现的题目,最近校招包括互联网大厂百度、腾讯都有问,传统行业大厂海能达、大疆也有问。
在 C++ 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。
01
指针
指针(Pointer)
定义:
指针是一个变量,它存储了一个内存地址。
指针的类型是指向的数据的类型。
声明:
指针通常用星号 * 来声明,例如 int *p; 表示 p 是一个指向 int 类型的指针。
赋值:
指针可以通过赋值操作来指向不同的地址,例如 p = &a;,其中 &a 是变量 a 的地址。
指针可以指向 nullptr 或 NULL(在 C++11 之后推荐使用 nullptr)表示不指向任何对象。
解引用:
使用星号 * 来解引用指针并访问它所指向的数据,例如 *p = 10;。
内存管理:
指针需要手动分配和释放内存(使用 new 和 delete)。
指针可以指向任何类型的内存,包括未初始化的内存区域。
安全性:
使用指针时需要特别小心,因为访问无效或已释放的内存可能导致程序崩溃或未定义行为。
代码示例:
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;。
内存管理:
引用本身不涉及内存分配,它只是现有对象的一个别名。
引用通常用于传递大对象或作为函数返回值,以避免不必要的拷贝。
安全性:
使用引用相对安全,因为引用总是有效,不会指向不存在的对象。
代码示例:
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
引用不占用内存空间
看下面示例代码:
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电子书资料赠送
精彩文章合集
专题推荐