首页 > 编程语言 >C++ 指针与引用的区别

C++ 指针与引用的区别

时间:2024-04-25 18:56:21浏览次数:26  
标签:变量 int C++ 引用 指针 定义

C++指针与引用的区别示意图

初学 C++ 指针时,我误以为可以将指针视作对于原始对象的引用,当时还没有接触 C++ 引用的概念,所以犯了概念上的错误,在此澄清一下这两者的区别。

在形式上使用 * 定义指针变量:int *p; 定义的时候可以不初始化。使用 & 定义引用:int &r = i; (其中 i 是另一个变量),定义引用的时候需要初始化,否则会报错:app.cpp:4:10: error: 'r' declared as reference but not initialized

对于 int i = 1;,分别定义 int &r = i; 和 int *p = i; 前者 r 被称为变量 i 的一个别称,它与 i 代表完全相同的对象,这意味着它们有相同的值以及相同的地址,就像下面的程序呈现的那样:

#include <iostream>
using namespace std;
int main() {
    int i = 1;
    int &r = i;
    cout << i << endl;
    // 1
    cout << r << endl;
    // 1
    cout << &i << endl;
    // 0x61fe14
    cout << &r << endl;
    // 0x61fe14
    return 0;
}

而后者,也就是 int *p = i; 则是重新开辟了一个内存区域用来存放变量 i 的内存地址,该地址就是指针 p 的值,也就是说变量 p 的地址是不同于变量 i 的地址的,可以用代码来验证这一点:

#include <iostream>
using namespace std;
int main() {
    int i = 1;
    int *p;
    *p = i;
    i = 1;
    cout << i << endl;
    // 1
    cout << *p << endl;
    // 1
    cout << &i << endl;
    // 0x61fe1c
    cout << &p << endl;
    // 0x61fe10
}

参考:

  • https://www.runoob.com/cplusplus/cpp-references.html
  • https://www.runoob.com/cplusplus/cpp-pointers.html
  • https://stackoverflow.com/questions/4643713/returning-a-reference-to-a-local-variable-in-c

标签:变量,int,C++,引用,指针,定义
From: https://www.cnblogs.com/gaotianchi/p/18158362/the-difference-between-pointers-and-referenc

相关文章

  • 网络实名认证?企业如何实现实名认证?C++身份证实名认证接口
    身份证,大家都不陌生,现如今,我们用到身份证的地方越来越多,人们在办理很多业务时都会要求实名制,比如,电信实名制,火车票,汽车票实名制。为规范网络环境,前段时间国家也出台了相关政策,上网也需要网络实名制,就连大家常用的共享单车在注册时都会要求你实名制,那么,身份证是真是假,是如何确......
  • C++二要素认证,游戏实名认证接口、金融实名认证
    随着移动互联的发展,越来越多的企业在金融市场都想分一杯羹,而哪种理财产品才是人们放心的理财产品呢?我们都知道理财产品开户都需要上传身份证号核验和图像进行验证,以保证个人信息的真实性,那么这些是如何来判别身份证的真伪呢?加入上传一张假的身份证是否也能验证通过呢?翔云身份......
  • vscode 配置c/c++环境,无法生成 *.exe文件
    ​【问题】:    使用vscode配置c/c++环境时,提示无法构建失败。 【解决方案】:    1.当前结合网上找的资料已经检查过,tasks.json和launch.json文件,并无配置错误。    2.F5调试时,终端输出错误调试信息如下:启动调试任务时,执行了2条命令。1)cmd/c......
  • Taurus.MVC 微服务框架 入门开发教程:项目集成:7、微服务间的调用方式(调整):引用程序集及
    前言:今天补充一下 Taurus.MVC微服务教程,介绍一下微服务中针对RPC方面调整或新增的功能。之前系列文章目录:Taurus.MVC微服务框架入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。Taurus.MVC微服务框架入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目......
  • C# 引用程序集编译在非同级目录实现
    情景:A项目是主项目,B项目是引用程序集,众所周知C#项目引用程序集编译时会生成在同一目录如果想让A.exe和B.dll生成不在统一目录,但是又存在依赖关系应该怎么做呢?实现原理分为两步1、配置生成逻辑2、动态加载DLL1、配置生成逻辑:打开A.csproj文件,找到<ProjectReferenceInclude......
  • C++数组的连续性
    虚拟上连续,物理上大概率连续,除非不在同一个物理页上,并且物理页不连续时数组在物理地址空间是否连续,对于用户空间的程序是不需要关心的。另外,对于一个抽象层次很高的编程语言,数组是不是一定要保证虚拟地址空间连续,感觉也是可以研究的。例如,java的数组就不连续?所以array到底是在......
  • Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集
    一、前言用ffmpeg采集本地摄像头,如果不指定格式的话,默认小分辨率比如640x480使用rawvideo格式,大分辨率比如1280x720使用mjpeg格式,当然前提是这个摄像头设备要支持这些格式。目前市面上有一些厂家做的本地设备支持264格式,这个压缩率极高,由于采集到的就是264格式的裸流,所以不用编码......
  • C++基础 变量和基本类型
    一个char类型的大小和一个机器字节一样。char在实现的时候会是unsignedchar和signedchar当中的一种,这与机器有关。wchar_t,char16_t,char32_t为国际化提供支持,这几种字符的字面值需要加前缀。C++标准规定数据的宽度:short<=int<=long<=longlong.当unsignedint和int进行运......
  • C++多态与虚拟:函数重载(Function Overloading)
    重载(Overloading):所谓重载是指不同的函数实体共用一个函数名称。例如以下代码所提到的CPoint之中,有两个memberfunctions的名称同为x():1classCPoint{23public:4floatx();5voidx(floatxval);67};  其两个memberfunctions实现代码如下:1f......
  • 智能指针
    首先理解什么是RAII,RAII(ResourceAcquisitionIsInitialization)是C++中用来管理资源的生命周期的一种技术。在RAII中,资源的获取和释放是在对象的构造函数和析构函数中完成的。当对象被创建时,它的构造函数被调用,从而获取资源;当对象超出作用域时,其析构函数被调用,从而释放资源。......