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

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

相关推荐
啊啊啊啊啊!!!!7 小时前
【c++】stack和queue的接口使用以及底层实现
开发语言·c++
(Charon)10 小时前
【C++】锁与原子操作(四):自旋锁的完整实现与性能优化
c语言·开发语言·c++
ShineWinsu11 小时前
对于Linux:五种IO模型以及非阻塞IO的详细解析
linux·c++·面试·io·阻塞·非阻塞·fcntl
呜喵王阿尔萨斯12 小时前
extern “C“ in C++
c语言·c++·算法
乐观勇敢坚强的老彭12 小时前
C++信奥静态数组和动态数组
数据结构·c++·算法
gumichef12 小时前
第一章:面向对象核心——类和对象深度讲解
开发语言·c++
ao-weilai12 小时前
C++基础:类和对象
开发语言·c++
郝学胜-神的一滴13 小时前
[简化版 GAMES 104] 现代游戏引擎 04:从0到1构建你的游戏世界
c++·游戏·unity·游戏引擎·软件工程·unreal engine
Bryce学亮13 小时前
FileLine,基于 Qt 6 + QML 构建的跨平台文件传输与即时通讯工具
数据库·c++·人工智能·python·qt·github
旖旎夜光13 小时前
LeetCode 991: 坏了的计算器(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法