C++原始指针的补充

曾经沧海难为水,除却巫山不是云。
取次花丛懒回顾,半缘修道半缘君。

                                                       ——《离思五首·其四》【元稹〔唐代〕】

目录

回忆:

正文: 

1. const的先后问题:

例子:

代码演示:

提升拓展:左值和右值:

左值:

右值:

2.指向指针的指针:

下期预告:C++指针的基本操作(1)


回忆:

上次的C++原始指针我们没有说完,今天算是上一期的补充。在开始之前大家请回忆回忆我们上期讲到的三个原始指针都是什么,都分别有什么作用。现在让我们一起想一想,我们上期一共说了【一般指针,指针数组,数组指针】;其中需要重点记忆和理解的是数组指针,和指针数组(它们之间的区别和概念,所表达的有什么区别)。

记不清的同学可以看一看我上一期的内容:C++中一般指针,指针数组,数组指针

正文: 

现在我们来开始今天的内容:

1. const的先后问题:

我相信大家一定见过const。不管是写代码,还是看代码,const都是一个很常见的符号。首先我们要清楚const其实就是对编译器说我们要编写的这个东西是常量,不能在后续的代码过程中改变它的内容。这就引出了我们的第一个问题:const的先后问题。由于我们讲的是指针,指针有指向和其指向的内容两部分。所以我们的const的位置就有三种情况(大家可以打开脑洞想一想,学习新知识就是这样,要有自己的思考,然后再学习知识就会简单很多)。

例子:

char s[]={"my name is sam"};

char const*a="my name is sam";

char* const b="my name is sam";

char const*const c="my name is sam";

判断:

a=s;

b=s;

c=s;

大家看一下上面的例子,猜一猜下面三行代码有几个是对的,有几个是错的。

现在揭晓:只有a=s;是对的,剩余的两个都是错的。下面就来讲一讲我们const具体的用法。

关于const起作用的部分:

1.看左侧最近的部分。

2.如果我们没有左侧,那就看右侧的。

这下我们再来看上面的代码,我们来逐行分析:首先我们定义了一个名为s的字符数组,并初始化对其赋值。然后我们再定义三个字符指针然后赋值。不同地就是const的位置。指针a我们的const修饰的是左侧的char,这就导致我们无法修改指针a指向的值(也就是我们无法修改"my name is sam"),但是我们可以修改a的指向,所以我们只有a=s;是正确的。在指针b中我们的const也是中间,修饰的同样是左侧,但是我们的左侧换成了char*,是指针,这就导致我们无法修改指针b的指向,我们只能修改其指向的值,所以b=s;是错的。指针c我们发现有两个const,其实就是上面两种方法的结合,指针c我们无法修改其指向,也无法修改其指向的值(算是融合怪)。

代码演示:
include<iostream>
using namespace std;
int MAX_LEN;
int main()
{
char s[]={"my name is sam"};char const*a="my name is sam";  //const char*char* const b="my name is sam"; char const*const c="my name is sam";  //const char* consta=s;//b=s;  错误//c=s;  错误int len=strlen_s(b,MAX_LEN);
cout<<len;
for(int i=0;i<len;++i)
{
//a=s[i]+1;值无法改变
b=s[i]+1;
//c=s[i]+1;值无法改变
}
return 0;
}

大家看上面的代码,我们在下方又写了一部分代码,我们先利用安全级高的strlen_s来求出b的长度,因为指针的初始化都是相同的,所以他们的大小长度也是一样的。然后我们用一个循环验证我们上面说到的解析。我们的a和c是无法改变其值,但是b可以改变。如果我们不注释那几行代码的话,我们就会看到编译器提醒我们要写一个左值。

提升拓展:左值和右值:

左值:

1. 左值的基本概念
定义:左值(lvalue)是C++中的一个表达式,它表示一个对象的位置,且该位置在表达式的求值过程中保持不变。简单来说,左值指的是可以出现在赋值语句左边的实体,代表一块有名字的、可以取地址的内存。
2. 左值的特性与要求
特性:左值具有持久性和可定位性。持久性意味着左值不是临时的,它在内存中有明确的存储位置;可定位性则意味着可以通过取地址操作符(&)获取其内存地址。
要求:为了成为一个左值,一个表达式必须能够标识一个具体的内存位置,以便可以对其进行赋值或其他操作。
3. 左值在C++中的使用场景
赋值操作:左值最常见的用途是作为赋值语句的左侧操作数,用于接收右侧操作数的值。例如,在语句“int a; a = 5;”中,“a”就是一个左值。
引用绑定:在C++中,引用(reference)必须与左值进行绑定。这是因为引用需要提供一个持久的内存位置来存储其引用的对象的地址。
4. 与左值相关的其他概念
右值(rvalue):与左值相对的是右值,它表示一个临时的、不可定位的值。右值通常出现在赋值语句的右侧,用于提供要赋给左值的值。例如,在语句“int a = 5;”中,“5”就是一个右值。
左值引用(lvalue reference):左值引用是C++11引入的新特性,用于绑定到左值上。左值引用允许我们创建一个别名来访问已经存在的对象,从而可以更方便地操作这些对象。
右值引用(rvalue reference):同样是在C++11中引入的,右值引用允许我们绑定到右值上,从而可以实现对临时对象的移动语义和完美转发等高级功能。这有助于提高代码的性能和灵活性。

右值:

1. C++右值的基本概念
定义:在C++中,右值(rvalue)是指那些只能出现在赋值操作或其他表达式右边的值。它们通常表示临时的、不可寻。
与左值的区别:与左值(lvalue)相比,右值不代表内存中持久的对象,而是临时的、在表达式结束后就可能被销毁的值。
2. 右值的特性与分类
特性:
临时性:右值往往是表达式计算过程中临时产生的值。
不可寻址性:无法获取右值的内存地址,即不能使用取地址操作符(&)。
分类:
纯右值(Pure Rvalue):如字面量(如42、'a')或临时对象(如函数返回的临时对象)。
将亡值(Xvalue):一种特殊的右值,表示即将被移动的对象。它可以通过std::move函数从左值转换而来。
3. 右值在C++中的用途与优势
用途:
支持移动语义:通过移动构造函数和移动赋值运算符,可以安全地“窃取”右值的资源,从而提高代码性能。
完美转发:在模板编程中,右值引用可以与std::forward结合使用,实现参数的完美转发。
优势:
性能提升:通过减少不必要的拷贝操作,右值引用可以显著提高程序的性能。
资源管理:右值引用提供了一种更安全、更高效的方式来管理资源,如动态分配的内存。
4. 与右值相关的C++特性
右值引用(Rvalue Reference):C++11引入的新特性,用于绑定到右值上。它允许我们定义专门处理右值的函数重载,从而实现移动语义和完美转发。
移动语义(Move Semantics):通过移动构造函数和移动赋值运算符,可以将资源从一个对象“移动”到另一个对象,而不是进行拷贝。这通常涉及将源对象的内部指针或句柄设置为nullptr,并将这些资源转移到目标对象中。
std::move函数:一个标准库函数,用于将其参数转换为右值引用。它本身并不移动任何数据,而是提供了一种方式来指示编译器应该使用移动语义而不是拷贝语义。需要注意的是,std::move并不总是安全的或合适的,应谨慎使用。

上面就是关于左值,右值的一些基本知识,大家理解性记忆。

2.指向指针的指针:

例子:

int a=123;

int*b=&a;

int**c=&b;

规则:

*操作符具有从右向左的结合性:

**c这个表达式相当于*(*c),必须从这里想外逐层求解。

*c得到的其实就是b,也是&a。

**c得到的是*b,也就是a的值。

表达式表达式的值
a123
b&a   123
*ba      123
c&b     
*cb      &a
**c*b     a     123

这就是双重指针的基本规则,其实就是嵌套指针。


🆗到这里,这篇关于:C++原始指针的补充就说完了,求一个免费的赞,感谢阅读。

下期预告:C++指针的基本操作(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146998.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

RecyclerView的notifyDataSetChanged和notifyItemRemoved之间的区别

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 RecyclerView 提供了多种方法来通知适配器&#xff08;Adapter&#xff09;数据集发生变化&#xff0c;其中 notifyDataSetChanged() 和 notify…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

【AcWing】875. 快速幂

#include<iostream> using namespace std; typedef long long LL;LL qmi(int a,int b,int p){LL res1%p;//%p是为了p1的时候&#xff0c;余数是0while(b){if(b&1) resres*a%p;//位数是1的b>>1;aa*(LL)a%p;//a*a再modp是为了防止溢出}return res; }int main(){i…

【动态规划】(三)动态规划——完全背包

动态规划——完全背包 完全背包理论基础零钱兑换Ⅱ组合总和Ⅳ爬楼梯&#xff08;进阶版&#xff09;零钱兑换完全平方数单词拆分背包问题总结 完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

零食店小程序发展客户转化运营

零食店、折扣店近些年市场中跑出了不少区域性、多地化的品牌&#xff0c;直营及加盟模式&#xff0c;还有各种超市、商场、街边小店等&#xff0c;零食基本没有年龄群体限制&#xff0c;又属于常消费品&#xff0c;线上线下生意都可以进行发展。 线下客户到店&#xff0c;线上…

链表数据结构

链表可以解决顺序表的缺点 我们今天简单引用下链表 这边是代码讲解 头文件 #pragma once #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; typedef struct student {union {int data;int len;};s…

【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构

从零开始掌握序列化与反序列化 1 初识序列化与反序列化2 再谈Tcp协议3 程序重构3.1 Socket类3.2 回调函数设计3.3 最终的Tcp服务器类 1 初识序列化与反序列化 在刚学习计算机网络时&#xff0c;我们谈到过网络协议栈&#xff0c;其中最上层的就是应用层&#xff0c;那么这个应…

Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)

文章目录 1. Rosetta 介绍2.下载2. Rosetta 安装3. 验证安装 1. Rosetta 介绍 很久很久之前就对Rosetta有所耳闻&#xff0c;有一篇文章叫做denovo protein design&#xff0c;说的就是用rosetta来设计蛋白质。 rosetta是david baker团队设计的软件&#xff0c;早期只是一个蛋…

【Godot4.3】胶囊形的偏移获取法

概述 之前用半圆弧拼接的方式求过胶囊形&#xff0c;在逐渐熟练使用Geometry2D的过程中&#xff0c;发现通过线段求端点是圆角类型的偏移多边形&#xff0c;获得的就是胶囊形。 所以我们有了第二种胶囊形求法。 测试代码 tool extends Node2D## 横向宽度 export var width:…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

SQL server学习01-SQL server环境配置

目录 一&#xff0c;手动下载及安装 microsoft .net framework 3.5 1&#xff0c;下载 2&#xff0c;安装 二&#xff0c;安装SQL server2014 1&#xff0c;下载 2&#xff0c;安装 3&#xff0c;启动SQL server服务 三&#xff0c;下载及安装Microsoft SQL Server…

C Prime Plus 第6章习题

你该逆袭了 红色标注的是&#xff1a;错误的答案 蓝色标注的是&#xff1a;正确的答案 绿色标注的是&#xff1a;做题时有疑问的地方 橙色标注的是&#xff1a;答案中需要着重注意的地方 练习题 一、复习题1、2、3、4、5、我的答案&#xff1a;错误正确答案&#xff1a; 6、7、…

ubuntu 安装minikube,并拉取k8s镜像

不要使用最新版&#xff0c;重要的事情说三遍&#xff0c;刚开始也是最求新一点的版本&#xff0c;但问题很多&#xff0c;主要是版本之间的依赖问题&#xff0c;不是某个依赖的版本不支持某些功能&#xff0c;就是依赖之间的版本不能对应上&#xff0c;所以就降低几个版本&…

行业人工智能研究-Python自监督方式学习图像表示算法

学术界人工智能研究落后于工业界 摘要 行业或工业界在人工智能研究上超出学术界&#xff0c;并占据着大量的计算力&#xff0c;数据集和人才诱人的薪水和明朗的预期吸引大量人才离开学术界&#xff0c;涌入行业或工业界即使&#xff0c;比如Meta开源其人工智能模型&#xff0…

实验:WLAN无线综合实验

无线综合实验的概述&#xff1a; WLAN无线综合实验是一种针对无线网络技术的综合性实验&#xff0c;旨在通过实践操作加深对无线局域网&#xff08;WLAN&#xff09;技术的理解和应用能力。以下是对该实验的详细概述&#xff1a; 实验目的 掌握认证AP上线的配置方法&#xff…

[SAP ABAP] 创建域

我们可以使用事务码SE11创建域 输入要创建的域的名称&#xff0c;然后点击创建 输入简短描述&#xff0c;选择数据类型和输入字符数 激活并保存域&#xff0c;创建的域才能够生效

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

Spring Boot 入门:解锁 Spring 全家桶

前言 Spring 全家桶是现代 Java 开发者不可或缺的工具集&#xff0c;它提供了从轻量级的框架到微服务架构的完整支持。本文将带你快速了解 Spring 框架、核心概念如 IoC&#xff08;控制反转&#xff09;和 AOP&#xff08;面向切面编程&#xff09;&#xff0c;并深入介绍 Sp…