C++基础——引用和指针篇

一、指针(Pointer)

定义:

指针是一个变量,用于存储另一个变量的地址。

基本用法:

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int* p = &a; // p 存储 a 的地址

    cout << "a 的值: " << a << endl;
    cout << "p 指向的值: " << *p << endl; // 通过解引用访问 a 的值
    return 0;
}

常见用途:

  • 动态内存管理(new, delete
  • 传递大对象的地址以减少复制开销
  • 实现数据结构(链表、树等)
  • 函数指针、回调函数

二、引用(Reference)

定义:

引用是某个变量的别名,必须在定义时初始化,不能更改指向。

基本用法:

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int& ref = a; // ref 是 a 的引用

    ref = 20; // 相当于修改 a
    cout << "a 的值: " << a << endl; // 输出 20
    return 0;
}

常见用途:

  • 函数参数传递:减少复制,提高效率
  • 返回值优化:如操作符重载中常返回引用
  • C++ 引用语义:适用于 STL 容器遍历、函数链式调用等

三、引用 vs 指针

特性 指针 引用
是否可以为 null 可以 不可以(必须绑定合法对象)
是否可重新赋值 可以指向不同对象 不能更改绑定对象
是否可修改地址 可以 不可以(底层实现是隐藏的指针)
语法使用 使用 *, & 操作 类似变量操作(无需解引用)
是否有内存开销 有,实际占一个地址空间 没有额外开销,编译器优化处理

四、在函数中的对比用法

使用指针:

void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main() {
    int x = 1, y = 2;
    swap(&x, &y);
    cout << x << " " << y << endl; // 输出 2 1
}

使用引用(C++ 推荐):

void swap(int& a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}

int main() {
    int x = 1, y = 2;
    swap(x, y);
    cout << x << " " << y << endl; // 输出 2 1
}

五、与 C 的区别

  1. 引用是 C++ 特有的,C 语言没有引用概念,只能用指针。
  2. C 中函数参数修改必须用指针,而 C++ 中可用引用,更安全简洁。
  3. C++ 引用语义也用于支持高级特性(如智能指针、右值引用、move 语义等)。

六、指针与引用的性能差距

  • 指针和引用对应的汇编码完全相同,所以二者的没有任何的性能差异。C++中的引用可以看做是C++对于指针操作的一个“语法糖”,底层实现完全一致。

总结

适用场景 推荐使用
函数需要修改参数 使用引用(C++)或指针(C)
需要 nullptr 只能使用指针
动态内存分配 使用指针
简洁代码 优先使用引用

posted @ 2025-05-09 17:00  江海余生  阅读(27)  评论(0)    收藏  举报