返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 左值引用与一级指针示例详解
  • 416
分享到

C++ 左值引用与一级指针示例详解

2024-04-02 19:04:59 416人浏览 泡泡鱼
摘要

将左值引用用于一级指针时,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa = pa;

左值引用用于一级指针时,有以下几种用法:

//方式一:引用一级指针,常规用法
int a = 5;
int * pa = &a;
int * &rpa = pa;
 
//方式二:引用指向常量的一级指针,以下几种为等效表示
int a = 5;
const int * pa = &a;
const int * &rpac = pa; //方式一
int const * &rpac = pa; //方式二
 
//方式三:引用一级指针的常引用,引用自身为常量
int a = 5;
int * pa = &a;
int * const &crpa = pa;
 
//方式四:引用指向常量的一级指针,且引用自身为常量,以下几种为等效表示
int a = 5;
int * pa = &a;
const int * const &crpac = pa; //方式一
int const * const &crpac = pa; //方式二

在 Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int *& 与 const int *& 等效,除此之外,const int const *& 在 Microsoft Visual Studio 中也与 const int *& 等效,而 int *& const 在 Qt minGW 中将会报错,在 Microsoft Visual Studio 中与 int *& 等效。

各类型引用可修改属性如下表所示:

引用类型修改 *rp修改 rp
int * &rp可以可以
const int * &rp不可以可以
int * const &rp可以不可以
const int * const &rp不可以不可以

若将变量的地址赋予引用(例如 rp=&x),各类型引用可接受的变量地址如下表所示:

引用类型int变量地址const int变量地址
int * &rp不可以不可以
const int * &rp不可以不可以
int * const &rp声明时可以(将创建临时变量)不可以
const int * const &rp声明时可以(将创建临时变量)声明时可以(将创建临时变量)

若将一级指针变量赋予引用(例如 rp=p),各类型引用可接受的一级指针变量如下表所示。若赋值时等号右边是函数返回的临时指针变量(属于右值),则只有当等号左边为 int * const & 以及 const int * const & 类型时不会报错,此时必会创建临时变量(与 const 左值引用性质一致)。

引用类型int *变量const int *变量int * const变量const int * const变量
int * &rp可以不可以不可以不可以
const int * &rp不可以可以不可以不可以
int * const &rp声明时可以不可以声明时可以不可以
const int * const &rp声明时可以(将创建临时变量)声明时可以声明时可以(将创建临时变量)声明时可以

若将引用变量赋予引用(例如 rp=rp2),各类型引用可接受的引用变量如下表所示。比较上下两表可知,左值引用类型变量被初始化完毕后,若要将其赋值给另一引用变量,赋值时的表现与所引用类型的变量相一致。

引用类型int *&变量const int *&变量int * const&变量const int * const&变量
int * &rp可以不可以不可以不可以
const int * &rp不可以可以不可以不可以
int * const &rp声明时可以不可以声明时可以不可以
const int * const &rp声明时可以(将创建临时变量)声明时可以声明时可以(将创建临时变量)声明时可以

补充:c++ (左值)引用和指针简介

1. 引用

引用(reference):引用指向一个左值,并一直与指向的左值绑定(bind)在一起。用《C++ Primer》里面的话说,引用就是“给对象起了另外一个名字”

int ival = 1024;
int &refVal = ival; // refVal引用ival

引用必须被初始化:引用被声明后必须被立刻初始化,否则就会报错

int ival = 1024;
int &refVal = ival; // 顺利引用
int &refVal2;        // 报错,因为没有初始化

引用无法更改指向的左值:引用一旦经过初始化绑定后,就无法更改绑定的对象
引用不是对象:引用只是一个对象的别名,自身不是对象。你对引用的赋值,取值实际上等于对其引用的对象的赋值,取值

int ival = 1024;
int &refVal = ival;
refVal = 2;            // 等于对ival赋值
int ii = refVal;    // 等于将ival的值赋给ii

一个对象多个引用:这是允许的,一个对象可以拥有多个”别名“

int ival = 1024;
int &refVal = ival;
int &refVal2 = ival;    // refVal2作为ival的第二个引用

2. 指针

指针(Pointer):指针用于存储一个对象的地址,我们称为“指向”某个对象。通过指针,我们可以访问到对象在内存空间中的地址以及对象本身存储的值

int *p;    // 定义一个指针

2.1. 获取地址与访问对象

利用指针获取对象地址:由于指针本身是“存储地址的对象”,我们不能直接让指针存储对象本身,这时候就需要用取地址符(&)来提取对象的地址

int ival = 42;
int *p = &ival;        // 让指针p指向ival的地址

利用指针访问对象:直接访问指针的话,得到的是地址。要访问实际对象,就要用到解引用符(*)。解引用只适用于指向某个对象的有效指针

int ival = 42;
int *p = &ival;
int ival2;        // 新定义整数类型变量ival2
ival2 = *p;        // 将ival2赋值为p指向的值(也就是ival的值)

2.2. 指针的特殊状态

空指针(Null Pointer):一个值为0,不指向任何对象的指针

// 以下三行代码本质相同,都是初始化一个空指针
int *p1 = nullptr;    
int *p2 = 0;
int *p3 = NULL;

未初始化的指针:未指向任何地址,并且也不是空指针的指针是忌使用的。这样的指针由于指向的位置不确定,访问时有可能会造成未定义行为(Undefined Behaviour)。所以在定义指针时,一定要进行初始化,即便现在不会立刻使用,也要初始化为空指针

2.3 void* 指针

void类型:void被称之为“空类型”,它一般被用与没有返回值的函数上。
void*指针:一个void类型的指针同样能指向一块内存地址,但因为类型是空,我们没有办法知晓指向的类型,以至于不知道该类型占用的内存大小,因此无法访问指向的对象本身。

3. 引用和指针的复合使用

引用的引用:不合法。因为引用本身不是对象,所以无法使一个引用绑定另一个引用
引用的指针:不合法。因为引用本身不是对象,所以无法使一个指针指向一个引用
指针的引用:合法。指针本身是对象,引用可以绑定指针

int i = 42;
int *p = &i;
int *&r = p;    // r引用指针p

指针的指针:合法。指针本身是对象,指针可以指向指针

int i = 42;
int *p = &i;    // p指向i
int **p2 = &p;    // p2指向p

std::cout << **p2 << std::endl;    // 两次解引,输出“42”

到此这篇关于C++ 左值引用与一级指针的文章就介绍到这了,更多相关C++ 左值引用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 左值引用与一级指针示例详解

本文链接: https://lsjlt.com/news/168019.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++ 左值引用与一级指针示例详解
    将左值引用用于一级指针时,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa = pa; ...
    99+
    2024-04-02
  • C++指针与引用的区别案例详解
    C++中指针和引用的区别 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是...
    99+
    2024-04-02
  • C++之值传递&指针传递&引用传递的示例详解
    目录1.函数基础2.值传递3.指针传递4.引用传递1.函数基础 一个函数由以下四部分组成: 返回类型函数名参数(0个或多个)函数体 其中,函数的参数叫做形参,函数执行的操作的语句块叫...
    99+
    2022-11-13
    C++值传递 指针传递 引用传递 C++ 值传递 C++ 指针传递 C++ 引用传递
  • 实例详解C++中指针与引用的区别
    目录前言1、指针的声明2、使用new来分配内存3、malloc 与 new 的区别4、引用的声明与本质总结前言 在计算机存储数据时必须要知道三个基本要素:信息存储在何处?存储的值为多...
    99+
    2024-04-02
  • 详解C++ 左值引用与 const 关键字
    左值引用是已定义的变量的别名,其主要用途是用作函数的形参,将 const 关键字用于左值引用时,其在初始化时可接受的赋值形式变得更加广泛了,这里来总结一下。 左值引用是已定义的变量的...
    99+
    2024-04-02
  • C++中常量与指针的示例详解
    前言 和指针联用有佷微妙的地方,之前一直佷晕,现在来继续研究下。诸如以下: int const; const int; const int* p; int const* p; i...
    99+
    2024-04-02
  • C++中指针引用的示例分析
    这篇文章主要介绍C++中指针引用的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。首先,引用不可以为空,但指针可以为空...
    99+
    2023-06-25
  • C++的指针,引用和STL详解
    目录指针、引用指针引用STLSTL中六大组件常用容器用法介绍vec.front(), vec.back()        返回vector的首...
    99+
    2024-04-02
  • C语言指针教程示例详解
    目录指针内存指针类型指针运算二级指针指针数组指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作...
    99+
    2024-04-02
  • C++左值与右值,右值引用,移动语义与完美转发详解
    目录C++——左值与右值、右值引用、移动语义与完美转发一、左值和右值的定义二、如何判断一个表达式是左值还是右值(大多数场景)三、C++右值引用四、std::m...
    99+
    2024-04-02
  • 智能指针与弱引用详解
    在android 中可以广泛看到的template<typename T> class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针。智能指针是c++...
    99+
    2022-11-15
    智能指针 弱引用
  • C++智能指针hared_ptr与右值引用的方法
    本篇内容主要讲解“C++智能指针hared_ptr与右值引用的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++智能指针hared_ptr与右值引用的方法”吧!目录 介绍 初始化方法1 通...
    99+
    2023-06-20
  • C/C++指针介绍与使用详解
    目录什么是指针定义指针变量间接引用指针常or常常指向指针的指针指针与数组指针的运算堆内存分配C语言C++语言指针与函数数组名作为函数的入口参数函数名作为参数传入其他函数使用指针修改函...
    99+
    2024-04-02
  • C++超详细讲解引用和指针
    目录引用概念定义步骤引用必须初始化引用初始化后不能更改引用作为函数的参数可以替代指针变量常引用引用作为函数的返回值类型引用的本质指针的引用(了解)指针和引用的区别引用概念 引用的本质...
    99+
    2024-04-02
  • C++中指针,引用和STL的示例分析
    这篇文章主要介绍C++中指针,引用和STL的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对象的定义:对象是指一块能存储数据并具有某种类型的内存空间一个对象a,它有值和地址;运行程序时,计算机会为该对象分配存...
    99+
    2023-06-29
  • C语言指针与引用的区别以及引用的三种用法案例详解
    1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名。 下面引自://www.jb51.net/article/221791.htm 从概念上讲。指针从本质上讲就是...
    99+
    2024-04-02
  • 详解C语言中二级指针与链表的应用
    目录前言二级指针讲解链表的应用 定义双链表的结构体创建双链表前言 这篇文章即将解决你看不懂或者不会写链表的基本操作的问题,对于初学者而言,有很多地方肯定是费解的。比如函数的...
    99+
    2024-04-02
  • C语言结构体指针引用详解
    目录指向结构体变量的指针指向结构体数组的指针结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。 指向结构体变量的指针 前面我们通过“结构体变量名.成员名”的方式引用结构...
    99+
    2024-04-02
  • C语言 指针的初始化赋值案例详解
    目录1、指针的初始化2、指针的赋值3、指针常量4、指针初始化补充5、void *型指针6、指向指针的指针1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够...
    99+
    2024-04-02
  • C语言指针引用数组案例讲解
    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作