指针和引用
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 13 课,共 104 课。
现在你已经了解了栈内存和堆内存,接下来我们来看看如何直接操作内存地址:指针和引用。
指针存储另一个变量的内存地址。你可以用 * 声明指针,并用 & 获取地址。
int value = 42;
int* ptr = &value; // ptr 保存着 value 的内存地址
std::cout << ptr; // 输出内存地址
std::cout << *ptr; // 解引用:输出 42引用是现有变量的别名。绑定后,它始终指向该变量。你可以用 & 声明它。
int value = 42;
int& ref = value; // ref 是 value 的别名
ref = 100; // 将 value 改为 100
std::cout << value; // 输出 100主要区别:
| 指针 | 引用 |
|---|---|
| 可以为空 | 必须初始化 |
| 可以重新赋值 | 不能重新绑定 |
使用 * 访问值 | 直接访问值 |
| 可以不指向任何内容 | 始终有效 |
两者对于高效地将对象传递给函数而不进行复制,以及处理堆分配的内存都至关重要。引用更安全、更简单,而当你需要重新赋值或检查是否为空时,指针则更灵活。
挑战
简单我们来构建一个简单的值操作系统,演示指针和引用在修改数据时的不同工作方式。
你将创建两个文件来组织代码:
ValueOps.h:定义三个以不同方式修改整数值的函数:doubleByPointer(int* ptr):接收一个指针,并将它指向的值加倍tripleByReference(int& ref):接收一个引用,并将该值变为原来的三倍swapValues(int* a, int* b):接收两个指针,并交换它们指向的值
main.cpp:从输入中读取两个整数,然后演示指针和引用:- 打印原始值:
"Original: <first> <second>" - 对第一个值使用
doubleByPointer,然后打印:"After double: <first>" - 对第二个值使用
tripleByReference,然后打印:"After triple: <second>" - 使用
swapValues交换两个值,然后打印:"After swap: <first> <second>"
- 打印原始值:
使用指针调用函数时,记得使用取地址运算符(&)来传递变量的地址。引用的使用方式更直接,只需直接传递变量即可。
在 main.cpp 中使用 #include "ValueOps.h" 引入头文件。
亲手试试
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// 从输入中读取两个整数
int first, second;
cin >> first;
cin >> second;
// 输出原始值
cout << "Original: " << first << " " << second << endl;
// TODO: 对第一个值使用 doubleByPointer(用 & 传入地址)
// TODO: 翻倍后输出
// TODO: 对第二个值使用 tripleByReference(直接传入变量)
// TODO: 变为三倍后输出
// TODO: 使用 swapValues 交换两个值(用 & 传入地址)
// TODO: 交换后输出
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器