C++学习笔记08:指针和引用的区别

目录

一、基本概念

二、引用的使用

三、指针的使用

四、指针和引用的主要区别

1.引用必须初始化,指针可以不初始化

2.引用绑定后不能改变,指针可以改变指向

3.有空指针,没有空引用

4.sizeof结果不同

5.指针需要解引用,引用可以直接使用

五、简单对比表

六、什么时候用引用,什么时候用指针?

七、小结


一、基本概念

在C++中指针和引用都可以间接操作变量,但他们的语法和使用方式不一样。

引用的本质是:

欸已经存在的变量起一个别名。

指针的本质是:

存放变量地址的变量。

例如:

cpp 复制代码
int a = 10;

int& ra = a;    // 引用,ra是a的别名
int* p = &a;    // 指针,p存放a的地址

二、引用的使用

引用定义的时候必须初始化。

cpp 复制代码
int a = 10;
int ra = a;

这里ra和r指向同一块空间。

cpp 复制代码
ra = 20;
cout << a << endl;

输出结果:

cpp 复制代码
20

说明修改ra,其实就是修改a。

引用的特点是:

引用不是新变量,而是原变量的别名。


三、指针的使用

指针用来存放变量的地址。

cpp 复制代码
int a = 10;
int* p = &a;

如果要通过指针修改变量,需要使用解引用操作符 *。

cpp 复制代码
*p = 20;
cout << a << endl;

输出结果:

cpp 复制代码
20

这里p保存的是a的地址,*p表示访问这个地址上的变量。


四、指针和引用的主要区别

1.引用必须初始化,指针可以不初始化

引用:

cpp 复制代码
int a = 10;
int& r = a;

错误写法:

cpp 复制代码
int& r;    // 错误

指针:

cpp 复制代码
int *p;    // 可以定义,但不建议

指针虽然可以不初始化,但容易成为野指针,所以最好写成:

cpp 复制代码
int *p = nullptr;

2.引用绑定后不能改变,指针可以改变指向

引用一旦绑定某个变量,就不能再改成其他变量的引用。

cpp 复制代码
int a = 10;
int b = 20;

int& r = a;
r = b;

这里 r = b 不是让 r 改成引用 b,而不是 b 的值赋给 a。

执行后:

cpp 复制代码
a = 20;
b = 20;

但 r 仍然是 a 的引用。

指针可以改变指向:

cpp 复制代码
int a = 10;
int b = 20;

int* p = &a;
p = &b;

这里 p 一开始指向a,后来改成指向 b。


3.有空指针,没有空引用

指针可以为空:

cpp 复制代码
int*p = nullptr;

但是引用必须绑定到一个已存在的变量。

cpp 复制代码
int& r;    // 错误

所以一般来说,引用会比指针安全一些。


4.sizeof结果不同

引用的 sizeof 结果是原变量类型大小。

cpp 复制代码
int a = 10;
int& r = a;

cout << sizeof(r) << endl;

一般输出:

cpp 复制代码
4

因为 r 是 a 的别名,所以 sizeof(r) 相当于sizeof(a)。

指针的sizeof结果是地址的大小。

cpp 复制代码
int* p = &a;

cout << sizeof(p) << endl;

在32位环境下通常是4字节,在64位环境下通常是8字节。


5.指针需要解引用,引用可以直接使用

指针访问变量需要写 *p:

cpp 复制代码
*p = 20;

引用可以想普通变量一样使用:

cpp 复制代码
r = 20;

所以引用的语法更简单。


五、简单对比表

对比点 引用 指针
本质 变量的别名 存放地址的变量
初始化 必须初始化 可以不初始化
是否能改变指向 不能 可以
空值 没有空引用 可以为空指针
使用方式 直接使用 需要解引用
sizeof 原变量大小 地址大小
安全性 相对更安全 更灵活但风险更高

六、什么时候用引用,什么时候用指针?

如果只是函数传参、减少拷贝、或者希望语法更简单,一般优先考虑引用。

例如:

cpp 复制代码
void Swap(int& x, int& y) {
    int tmp = x;
    x = y;
    y = tmp;
}

如果需要可以表示"可能为空",或者需要动态改变指向,就更适合使用指针。

例如:

cpp 复制代码
int* p = nullptr;
p = &a;
p = &b;

简单理解:

引用更安全、更简单;

指针更灵活,但容易出错。


七、小结

本篇主要学习了指针和引用的区别。

需要就记住:

  1. 引用是变量的别名;
  2. 指针是存放地址的变量;
  3. 引用必须初始化,指针可以不初始化。
  4. 引用绑定后不能改变,指针可以改变指向;
  5. 有空指针,没有空引用;
  6. 引用可以直接使用,指针需要解引用;
  7. 引用更安全,指针更灵活。

指针和引用都很重要。后面学习函数传参、类和对象、动态内存管理、数据结构时都会经常用到。

相关推荐
余额瞒着我当琳3 小时前
C++多态深入解析:多态概念,多态实现条件,虚函数表与内存分布,常见问题及注意事项
c++·算法
ocean21033 小时前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
程序猿编码4 小时前
扔掉 Python!纯 C++ 本地跑扩散 TTS,GGML 加持,支持 RK3588 NPU 加速
c++·计算机视觉·大模型·transformer·rk3588·推理·ggml
郝学胜-神的一滴4 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio
代码王同学4 小时前
2026.9.15日C++类和对象学习收获笔记
c语言·c++
刚入门的大一新生5 小时前
Linux-简单设计libc库
linux·c++
6Hzlia5 小时前
【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
c++·算法·leetcode
讳疾忌医丶14 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
2401_8685347814 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
软件课代表CiCi14 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库