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;
}
相关推荐
王老师青少年编程18 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【跳跃与过河问题】:过河问题
c++·算法·贪心·csp·信奥赛·跳跃与过河问题·过河问题
是个西兰花18 小时前
C++11:智能指针
开发语言·c++·智能指针·rall
CN-Dust18 小时前
【C++专题】输出cout例题
开发语言·c++
沉默-_-18 小时前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法
Reese_Cool18 小时前
【STL】蓝桥杯/天梯赛终极杀器!10个C++字符串核心技巧,暴力破解高频考点
开发语言·c++·蓝桥杯·stl
hehelm19 小时前
C++ 模拟实现 AVL 树
开发语言·c++
jieyucx19 小时前
Go 语言 switch 条件语句详解
开发语言·c++·golang
万法若空19 小时前
C++ <iomanip> 库全方位详解
开发语言·c++
c++之路19 小时前
C++ 模板
linux·开发语言·c++
鸿儒51719 小时前
记录一个C++ Windows程序移植到Linux系统的bug
开发语言·c++·bug