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. 引用更安全,指针更灵活。

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

相关推荐
卷无止境1 天前
C++ 的Eigen 库全解析
c++
卷无止境1 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴1 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18003 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴3 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨4 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4568 天前
C++进阶(1)——前景提要
c++
夜悊8 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴8 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0019 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp