首页 > 其他分享 >指针和引用的区别

指针和引用的区别

时间:2023-04-05 09:55:46浏览次数:35  
标签:const 变量 区别 int -- 引用 指针

指针和引用在 C++ 中都用于间接访问变量,但它们有一些区别:

  1. 指针是一个变量,它保存了另一个变量的内存地址,引用是另一个变量的别名,与原变量共享内存地址。
  2. 指针可以被重新赋值,指向不同的变量,引用在初始化后不能更改,始终指向同一个变量。
  3. 指针可以为 nullptr,表示不指向任何变量;引用必须绑定到一个变量,不能为 nullptr。
  4. 使用指针需要对其进行解引用以获取或修改其指向的变量的值,引用可以直接使用,无需解引用。

下面的示例展示了指针和引用的区别:

#include <iostream>

int main() {
    int a = 10;
    int b = 20;

    // 指针
    int *p = &a;
    std::cout << "Pointer value: " << *p << std::endl; // 输出:Pointer value: 10

    p = &b;
    std::cout << "Pointer value: " << *p << std::endl; // 输出:Pointer value: 20

    // 引用
    int &r = a;
    std::cout << "Reference value: " << r << std::endl; // 输出:Reference value: 10

    // r = &b; // 错误:引用不能被重新绑定
    int &r2 = b;
    r = r2; // 将 b 的值赋给 a,r 仍然引用 a
    std::cout << "Reference value: " << r << std::endl; // 输出:Reference value: 20

    return 0;
}

从汇编底层角度来解释 C++ 中引用的实现机制的话,引用是别名这是C++语法规定的语义,那么到底引用在汇编层面和指针有什么区别呢?其实没区别。引用会被 C++ 编译器当做const指针来进行操作。

简单总结

  • 引用只是C++语法糖,可以看作编译器自动完成取地址、解引用的常量指针
  • 引用区别于指针的特性都是编译器约束完成的,一旦编译成汇编就和指针一样
  • 由于引用只是指针包装了下,所以也存在风险,比如如下代码:
int *a = new int;
int &b = *a;
delete a;
b = 12;    // 对已经释放的内存解引用
  • 引用由编译器保证初始化,使用起来较为方便(如不用检查空指针等)
  • 引用没有顶层const即int & const,因为引用本身就不可变,所以在加顶层const也没有意义; 但是可以有底层const即 const int&,这表示引用所引用的对象本身是常量
  • 指针既有顶层const(int * const--指针本身不可变),也有底层const(const int *--指针所指向的对象不可变)
  • 有指针引用--是引用,绑定到指针, 但是没有引用指针--这很显然,因为很多时候指针存在的意义就是间接改变对象的值,但是引用本身的值我们上面说过了是所引用对象的地址,但是引用不能更改所引用的对象,也就当然不能有引用指针了。
  • 指针和引用的自增和自减含义不同,指针是指针运算, 而引用是代表所指向的对象执行++或--

标签:const,变量,区别,int,--,引用,指针
From: https://www.cnblogs.com/real010/p/17287887.html

相关文章

  • 关于传递引用会导致的问题
    复习effectivec++的时候看到:于是来验证一下,果然会出现对应问题:#include<iostream>#include<vector>#include<math.h>#include<algorithm>#include<unordered_set>#include<set>#include<unordered_map>#include<queue>usingn......
  • go run、build、install、get的原理和区别
    学习go也有好些年头了,都没怎么研究过go的编译命令。真是惭愧。今天学习并记录下结论:gorun专门用来运行命令源码文件的命令,一般用来运行单个文件gobuild主要是用于测试编译。编译某个包或者项目,在当前目录下生成可执行文件goinstall编译并安装代码包或者源码文件的。go......
  • C语言——复杂指针的读写
     1int*(*(*(*abc)())[6])();2/*3*1、(*abc)()——函数指针4*2、(*(某1))[6]——某的数组的指针5*3、int*(*(某2))()——返回值为int*类型的某的函数指针6*组合方式:123217*组合:(以(指向((返回值为int*类型的(函数指针))数组)的指针)......
  • 对于数组和指针的关系的测试
    #include"stdio.h"//验证数组和指针的以下一些关系//1.一元数组名本质上是数组第一个元素的地址,也是数组的地址//2。数组中存在a[2]=*(a+2)//3.数组在传递的时候传递的是数组名,也就是传递的是它的地址intmain(){intc[3]={1,2,3};int*a=c;//此时的a表示c数组......
  • 字节码引用检测原理与实战
    一、字节码与引用检测1.1Java字节码本章中的字节码重点研究Java字节码,Java字节码(Javabytecode)是Java虚拟机执行的一种指令格式。可以通过javap-c-vxxx.class(Class文件路径)命令来查看一个Class对应的字节码文件,如下图所示:1.2字节码检测字节码检测本质就是对.java或.kt文件......
  • [rust学习] 二、 rust中的智能指针
     rust中智能指针大致分类以下内容提炼自rust官方文档: https://doc.rust-lang.org/book/ch15-01-box.html 一、Box<T>1.使用例子:  1fnmain(){2letb=Box::new(5);3println!("b={}",b);4}2.特性:a.由B......
  • 高防服务器与游戏盾有什么区别
    高防服务器与游戏盾有什么区别游戏行业的红利一直非常可观,因此越来越多的人都开始投入游戏行业进行游戏开发。游戏行业一直是DDOS流量入侵的主要目标,所以一般大家在开发游戏时就知道需要做好防御措施。大部分用户会选择高防服务器、高防IP来进行防御,这两种方式对防御DDOS流量入侵是......
  • jQuery中this与$(this)的使用与区别
    https://blog.csdn.net/h2604396739/article/details/95191644this与$(this)的区别this其实是一个Html元素,是一个javascript对象,常用其来为其属性赋值。$(this)是一个jQuery对象,不存在html的属性,只能通过方法传参的方式为属性赋值。如下代码$(“#textbox”).hover(function(......
  • Django外键引用User模型时显示username的解决方法
    问题需求:在DjangoAdmin后台模型管理中,引用User外键的字段,显示的是username(用户名)。下拉菜单要显示姓名(last_name和first_name,外加username保持唯一性、可辨别性)。使用代理模型(proxymodel)fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUser#创建代......
  • js中e.clientX e.pageX e.offsetX e.screenX之间的区别
     event.clientX、event.clientY鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性event.pageX、event.pageY类似于event.clientX、event.clientY,但它们使用的是文档坐标而非窗口坐标。这2个属性不是标准属性,但......