Menu
CoddyTech

指针和引用

本课属于 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

主要区别:

指针引用
可以为空必须初始化
可以重新赋值不能重新绑定
使用 * 访问值直接访问值
可以不指向任何内容始终有效

两者对于高效地将对象传递给函数而不进行复制,以及处理堆分配的内存都至关重要。引用更安全、更简单,而当你需要重新赋值或检查是否为空时,指针则更灵活。

challenge icon

挑战

简单

我们来构建一个简单的值操作系统,演示指针和引用在修改数据时的不同工作方式。

你将创建两个文件来组织代码:

  • 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器