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;
}
相关推荐
Mr_liu_6666 小时前
ns3-gym例子解析_基础例子与wifi例子_DQN(3)
开发语言·c++·python·dqn·ns3
佳児素花痴╮6 小时前
C++速通2
开发语言·c++·算法
David猪大卫7 小时前
【C++修炼】异常
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141917 小时前
浅谈C++的列表初始化std::initializer_list
开发语言·数据结构·c++·list·开源项目
励志不掉头发的内向程序员7 小时前
【LibreCAD 2D架构】RS_Line创建之后发生了什么?从图形容器到屏幕渲染
开发语言·c++·qt·学习·系统架构
青少儿编程课堂9 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
Keven_1117 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
mengzhi啊17 小时前
QPluginLoader 动态 DLL 插件版,支持插件之间通信,广播。请求和应答
c++·qt
老赵的博客20 小时前
c++ QT之动态库加载问题
c++·qt
(Charon)21 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法