C&C++指针和引用的区别

介绍说明

C++中的指针和引用是两种不同的概念,它们在语法和语义上有显著的区别。以下是两者主要区别的总结:

  1. 定义和基础概念

    • 指针:指针是一个变量,存储的是另一个变量的内存地址。通过解引用指针(使用*运算符),你可以访问或者修改指针所指向的内存位置上的值。
    • 引用:引用更像是目标变量的别名,它并不存储实际的内存地址,而是直接绑定到一个已存在的对象。一旦初始化后,引用就永远关联于同一对象。
  2. 初始化

    • 指针:在声明指针时可以不初始化,之后可将其初始化为任意合法地址,包括nullptr表示不指向任何对象。
    • 引用:引用在声明时必须初始化,并且此后不能更改引用的目标。引用始终必须绑定到有效的对象。
  3. 改变绑定

    • 指针:可以改变指针的值,使其指向新的内存地址,指向不同的对象。
    • 引用:一旦引用被初始化为某个对象后,就不能改变引用其他对象,它始终保持对初始对象的引用。
  4. 空引用与空指针

    • 指针:指针可以为nullptr,表明它目前不指向任何对象。
    • 引用:不存在所谓的“空引用”,引用必须总是绑定到一个有效的对象。
  5. 使用方式

    • 指针:使用指针时需要通过解引用或者箭头运算符来访问或修改其指向的对象。
    • 引用:引用可以直接当作原始对象使用,无需解引用。
  6. 大小和存储

    • 指针:指针有自己的固定大小,通常在32位系统中为4字节,在64位系统中为8字节。
    • 引用:引用没有独立的存储空间,它的大小与它所引用的对象相同,因为它只是对象的一个别名。
  7. 安全性

    • 指针:使用不当可能导致未初始化的指针解引用,这是一种常见的运行错误。
    • 引用:引用总是绑定到一个对象,故如果正确初始化,引用通常比指针更安全。
  8. 多级指针

    • 指针:可以有多级指针,如int **p指向一个指向整型变量的指针。
    • 引用:没有多级引用的概念,引用始终只有一层。

应用实例

#include <iostream>

void changeValue(int* ptr, int& ref) {
    *ptr = 100; // 通过指针改变值
    ref = 200;  // 通过引用改变值
}

int main() {
    int x = 5;
    int y = 10;
    
    // 指针示例
    int* p = &x;  // p 存储了 x 的地址
    std::cout << "Before: x = " << x << ", *p = " << *p << std::endl;
    changeValue(p, y);
    std::cout << "After: x = " << x << ", *p = " << *p << std::endl;

    // 引用示例
    int& r = x;  // r 是 x 的引用,直接绑定到 x
    std::cout << "Before: x = " << x << ", r = " << r << std::endl;
    changeValue(&y, r);  // 这里虽然传入了 y 的地址,但通过引用改变了 x 的值
    std::cout << "After: x = " << x << ", r = " << r << std::endl;

    return 0;
}
实例说明
  • 对于指针p,我们可以改变它指向的对象(即x)的值,也可以改变p本身让它指向其他对象,例如p = &y;

  • 对于引用r,它一旦绑定到x,就无法再绑定到其他对象。当我们将r作为参数传递给changeValue函数时,实际上操作的是x的值,即使函数参数列表中我们传入的是y的地址。所以在这段代码执行后,x的值被改为了200,而不是y

总结

引用和指针各有其优点和适用场景。在大多数情况下,如果你需要一个变量的别名,那么应该使用引用。如果你需要操作内存地址,或者需要在函数间传递对象的地址,那么应该使用指针。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匠心码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值