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;
}
相关推荐
小欣加油5 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
星恒随风5 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
浪客灿心6 小时前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q6 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
为何创造硅基生物8 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~8 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz9 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂9 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
起床困难户5759 小时前
条款20:协助完成返回值优化
c++
啦啦啦啦啦zzzz10 小时前
算法总结(二分查找、双指针)
c++·算法