16. 指针和引用的区别

1.指针和引用的区别


1.指针和引用的区别

csharp 复制代码
a.指针

是一个"独立的变量, 专门用来存储另一个变量的内存地址; 指针本身占用内存空间, 可指向不同的变量(甚至空地址)"

b.引用

是"某个变量的别名(nickname)和原变量共享同一块内存空间, 没有自己独立的内存", 本质上是编译器层面的"语法糖"

csharp 复制代码
a.初始化差异

#include <iostream>
using namespace std;

int main() {
    int a = 10;

    // 指针:可未初始化(不推荐,野指针)
    int* p1;  // 合法,但p1指向随机地址(野指针,危险)
    int* p2 = &a;  // 正确初始化

    // 引用:必须初始化,否则编译报错
    // int& ref1;  // 错误:引用必须初始化
    int& ref2 = a;  // 正确:ref2是a的别名

    return 0;
}

csharp 复制代码
b.指向/绑定修改差异

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;

    // 指针:可修改指向
    int* p = &a;
    cout << *p << endl;  // 输出:10
    p = &b;              // 指针指向b
    cout << *p << endl;  // 输出:20

    // 引用:不能修改绑定对象(看似修改,实际是修改原变量)
    int& ref = a;
    cout << ref << endl;  // 输出:10
    ref = b;              // 不是绑定b,而是把b的值赋给a(a变成20)
    cout << a << endl;    // 输出:20
    cout << ref << endl;  // 输出:20(ref还是a的别名)

    return 0;
}

csharp 复制代码
c.空值与语法使用差异

#include <iostream>
using namespace std;

int main() {
    // 指针:可空
    int* p = nullptr;  // 空指针,合法
    if (p == nullptr) {
        cout << "p是空指针" << endl;
    }

    // 引用:不能空(以下代码编译报错)
    // int& ref = nullptr;  // 错误:引用必须绑定到有效变量

    // 语法使用:指针需要解引用,引用直接用
    int num = 100;
    int* p_num = &num;
    int& ref_num = num;

    cout << *p_num << endl;  // 指针:解引用访问值,输出100
    cout << ref_num << endl; // 引用:直接访问值,输出100

    cout << &p_num << endl;  // 指针自身的地址(独立内存)
    cout << &ref_num << endl;// 引用的地址 = 原变量num的地址(无独立内存)

    return 0;
}

csharp 复制代码
d.const 修饰的差异

#include <iostream>
using namespace std;

int main() {
    int x = 5, y = 6;

    // const修饰指针:两种场景
    const int* p1 = &x;  // 指向的内容不可改,指针本身可改
    // *p1 = 10;  // 错误
    p1 = &y;           // 正确

    int* const p2 = &x;  // 指针本身不可改,指向的内容可改
    *p2 = 10;           // 正确
    // p2 = &y;  // 错误

    // const修饰引用:限制引用的内容不可改
    const int& ref = x;
    // ref = 10;  // 错误:不能修改const引用的内容
    x = 10;       // 正确:原变量可改,引用值也会变
    cout << ref << endl;  // 输出:10

    return 0;
}
相关推荐
Ljwuhe18 小时前
类与对象(中)——运算符重载
开发语言·c++
郝学胜-神的一滴18 小时前
深入理解链表:从基础到实践
开发语言·数据结构·c++·算法·链表·架构
crescent_悦18 小时前
C++:Have Fun with Numbers
开发语言·c++
mjhcsp18 小时前
C++轮廓线 DP:从原理到实战的深度解析
开发语言·c++·动态规划
ArturiaZ18 小时前
【day36】
数据结构·c++·算法
CodeJourney_J19 小时前
从“Hello World“ 开始 C++
c语言·c++·学习
tod11320 小时前
C++ 核心知识点全解析(八)
开发语言·c++·面试经验
Ljwuhe20 小时前
C++类与对象(上)
开发语言·c++
killer_queen480420 小时前
AI_agent(三) MCP协议(二)
c++·agent·mcp·a2a