当前位置: 首页 > news >正文

C++指针和引用之区别(The Difference between C++Pointers and References)

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

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
总结

指针:

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

指针本身占用存储空间。

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

引用:

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

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

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

相关文章:

  • mcp和API区别
  • 【时时三省】(C语言基础)循环结构程序设计
  • 好用的链接
  • frp frp_0.62.0
  • 上门送水小程序区域代理模块框架设计
  • 电脑知识 | TCP通俗易懂详解 <三>tcp首部中ACK、SYN、FIN等信息填写案例_握手时
  • 前端VUE框架理论与应用(10)
  • 【Ragflow】18.更好的推理框架:vLLM的docker部署方式
  • Golang Event Bus 最佳实践:使用 NSQite 实现松耦合架构
  • JDBC与MyBatis全面解析:从基础到比较
  • 如何优雅的关闭线程池
  • 深度学习常见模块实现001
  • 为什么 Transformer 要使用多头注意力机制?
  • Log4j2远程命令执行(CVE-2021-44228)复现
  • 智能 GitHub Copilot 副驾驶® 更新升级!
  • Spring JDBC 与数据访问:从性能优化到事务协同
  • 如何实现一个构造函数继承另一个构造函数的属性和方法?给出ES5和ES6两种方式
  • 软件研发过程中的技术债
  • (Matlab)自动驾驶仿真 设计驾驶场景、配置传感器并生成合成 数据
  • #Liunx内存管理# 页面分配器是按照什么方向来扫描zone的?
  • 采用模版建网站的缺点/建立个人网站
  • 电子政务门户网站建设的教训/找个免费网站这么难吗
  • 厦门市工程建设项目网上办事大厅/关键词搜索优化
  • 公安网站建设素材/seo关键词快速排名前三位
  • 南宁网站设计方案/ios aso优化工具
  • 制作网站付款方式/品牌推广的渠道有哪些