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;
}
相关推荐
兩尛2 小时前
45. 跳跃游戏 II
c++·算法·游戏
睡一觉就好了。2 小时前
C++ 容器
开发语言·c++
怪谈爱好者CMZ2 小时前
【C++学习笔记】图论-最短路径Dijkstra算法
c++·笔记·学习
tangchao340勤奋的老年?2 小时前
ADS通信 C++ 设置通知方式读取指定变量
开发语言·c++·算法
落羽的落羽2 小时前
【Linux系统】从零实现一个简易的shell!
android·java·linux·服务器·c++·人工智能·机器学习
Trouvaille ~2 小时前
【Linux】UDP Socket编程实战(三):多线程聊天室与线程安全
linux·服务器·网络·c++·安全·udp·socket
jiang_changsheng2 小时前
MCP协议的核心架构基础
c语言·开发语言·c++·python·comfyui
永远睡不够的入3 小时前
类和对象(下):流重载、初始化列表、友元
c++
Trouvaille ~3 小时前
【Linux】UDP Socket编程实战(四):地址转换函数深度解析
linux·服务器·网络·c++·udp·socket·地址转换函数