C++中将递增和递减运算符用于指针

C++中将递增和递减运算符用于指针

指针包含内存地址。例如,程序中的 int 指针包含 0x002EFB34——int 在内存中的地址。 int 本身长 4 字节,因此占用 0x002EFB34~0x002EFB37 的内存。将递增运算符用于该指针后,它指向的并不是 0x002EFB35,因为指向 int 中间毫无意义。
如果您对指针执行递增或递减运算,编译器将认为您要指向内存块中相邻的值(并假定这个值的类型与前一个值相同),而不是相邻的字节(除非值的长度刚好是 1 字节,如 char)。

int age = 30;
int* pointsToInt = &age;

因此, 对于上面的程序中的指针 pointsToInt, 对其执行递增运算将导致它增加4字节, 即sizeof(int)。将++用于该指针相当于告诉编译器,您希望它指向下一个 int,因此递增后该指针将指向 0x002EFB38。同样,将该指针加 2 将导致它向前移动两个 int,即 8 字节。在本文后面,您将看到指针和数组索引之间的关系。
使用运算符–将指针递减的效果类似:将指针包含的地址值减去它指向的数据类型的 sizeof。

将指针递增或递减的结果将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的 sizeof(并不一定是 1 字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。如果声明了如下指针:Type* pType = Address;则执行++pType 后, pType 将包含(指向) Address + sizeof(Type)

以下示例程序演示了对指针递增和添加偏移量的结果:

#include <iostream>
using namespace std;int main()
{cout << "How many integers you wish to enter? ";int numEntries = 0;cin >> numEntries;int* pointsToInts = new int [numEntries];cout << "Allocated for " << numEntries << " integers" << endl;for(int counter = 0; counter < numEntries; ++counter){cout << "Enter number "<< counter << ": ";cin >> *(pointsToInts + counter); }cout << "Displaying all numbers entered: " << endl;for(int counter = 0; counter < numEntries; ++counter)cout << *(pointsToInts++) << " ";cout << endl;// return pointer to initial positionpointsToInts -= numEntries;// done with using memory? release delete[] pointsToInts;return 0;
}

输出:

How many integers you wish to enter? 2
Allocated for 2 integers
Enter number 0: 8774
Enter number 1: -5
Displaying all numbers entered:
8774 -5

再次运行的输出:

How many integers you wish to enter? 5
How many integers you wish to enter? 5
Allocated for 5 integers
Enter number 0: 543
Enter number 1: 756
Enter number 2: 2017
Enter number 3: -101
Enter number 4: 101010012
Displaying all numbers entered:
543 756 2017 -101 101010012

分析:

这个程序询问用户想输入多少个整数,再在第 9 行相应地分配内存。这个程序演示了两种递增指针的方法:一是使用偏移量,如第 15 行所示,它使用偏移量变量 counter 将用户输入直接存储到内存单元中;二是使用运算符++,如第 20 行所示,它将指针包含的地址递增,让指针指向下一个元素。
第 12~16 行的 for 循环让用户输入数字,然后使用第 15 行的表达式将其存储到相邻的位置。这个表达式给指针增加从零开始的偏移量( counter)。第 19 和 20 行的 for 循环与此类似,它显示前一个循环存储的值。
调用 delete[]来释放内存时,必须指定分配内存时 new 返回的指针地址。这个值最初存储在 pointsToInts 中,但第 20 行的运算符 ++ 修改了 pointsToInts,因此第 25 行使用运算符 -= 让 pointsToInts 重新指向原来的地址,再在第 28 行对这个地址调用 delete[]。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作用域 CSS 回来了

几年前&#xff0c;消失的作用域 CSS&#xff0c;如今它回来了&#xff0c;而且比以前的版本要好得多。 更好的是&#xff0c;W3C规范基本稳定&#xff0c;现在Chrome中已经有一个工作原型。我们只需要社区稍微关注一下&#xff0c;引诱其他浏览器构建它们的实现&#xff0c;并…

【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)

图片展示: 背景需求: 本周排到小3班&#xff0c;还没有来得及设计小班主题活动书的内容&#xff0c;于是就把小2班的学号字帖微调一下&#xff0c;做一份竖版2份的学号字帖。 让幼儿熟悉自己的学号&#xff0c;让我也熟悉幼儿的名字和学号 材料准备&#xff1a; 描字写&#…

基于微信小程序的二手闲置交易市场小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【owt-server】fix : node-gyp configure 报错:Error: read ECONNRESET

npm已经设置了registry 还报错 npm config set registry http://registry.npmmirror.comnode-gyp configure 指令 node-gyp configure 报错 read ECONNRESET root@k8s-master-2K4G:~/p2p/zdsvr-20201229# ./scripts/build.js -t mcu --check /root/p2p/zdsvr-20201229/build/li…

【算法分析与设计】动态规划(下)

目录 一、最长公共子序列1.1 最长公共子序列的结构1.2 子问题的递归结构1.3 计算最优值1.4 举例说明1.5 算法的改进 二、最大子段和2.1 代码2.2 最大子段和问题的分治算法2.3 代码2.4 分治算法的时间复杂度2.5 最大子段和问题的动态规划算法 三、凸多边形最优三角剖分3.1 三角剖…

Spring cloud Sentinel介绍和安装

Sentinel介绍和安装 &#x1f308;初识Sentinel&#x1f308;安装Sentinel&#x1f320;docker 安装&#x1f320;下载sentinel镜像&#x1f320;启动sentinel镜像 &#x1f320;windows 安装&#x1f320;下载&#x1f320;运行 &#x1f320;sentinel访问 &#x1f308;微服务…

C++中的悬浮指针

C中的悬浮指针 悬浮指针&#xff08;也叫迷途或失控指针&#xff09; 是C程序内存管理方面一个很重要的问题。 使用 delete 释放后&#xff0c;任何有效指针都将无效。换言之&#xff0c;即便之前指针isSunny 是有效的&#xff0c;调用 delete 后&#xff0c;它也变成无效的了…

Neo4j-双向关系

概述 这是GraphAware中关于双向关系的解释。 网址链接Modelling Data in Neo4j: Bidirectional Relationships | GraphAware 定向关系 Neo4j中的关系必须有一个语义化的类型和方向。 没有方向关系是模棱两可的&#xff0c;上面A队打败B队&#xff0c;如果没有方向&#xff0c…

【数据结构】什么是数据结构?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;数据结构的定义 &#x1f38f;结语 &#x1f38f;数据结构的定义 数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关…

【自监督Re-ID】ICCV_2023_Oral | ISR论文阅读

Codehttps://github.com/dcp15/ISR_%20ICCV2023_Oral 面向泛化行人再识别的身份导向自监督表征学习&#xff0c;清华大学 目录 导读 摘要 相关工作 DG ReID 用于ReID的合成数据 无监督表征学习 Identity-Seeking Representation Learning 结果 消融实验 导读 新角度…

Socket网络编程练习题五:客户端多用户上传文件(多线程版)并使用线程池管理线程

题目 想要服务器不停止&#xff0c;能接收很多客户上传的图片&#xff1f;我们知道是使用循环加多线程的方案来解决&#xff0c;但是如果频繁的创建和销毁线程&#xff0c;是非常浪费系统资源的&#xff0c;那应该怎么办呢&#xff1f; 解决方案 采用线程池&#xff0c;来管…

为什么 0.1+0.2 不等于 0.3

为什么 0.10.2 不等于 0.3 在 JavaScript 中&#xff0c;0.1 0.2 的结果不等于 0.3&#xff0c;这是因为在 JavaScript 中采用的是双精度浮点数格式&#xff08;64 位&#xff09;&#xff0c;而在这种格式下无法精确表示某些小数&#xff0c;因此在进行计算时会出现精度误差。…

Linux常见指令2

Linux常见指令[2] 一.Linux常见指令1.man补充知识:nano 2.cp3.mv4.cat补充知识:echo输出重定向追加重定向回到catcat其他用法 5.less和more补充内容回到less 6.head和tail补充知识:命令行管道 一.Linux常见指令 前言:为了方便我们在Linux中写指令 介绍一下: 1.clear指令: 清屏…

【小沐学C++】C++ 基于Premake构建工程项目(Windows)

文章目录 1、简介2、下载和安装2.1 下载2.3 快速入门 3、使用3.1 支持的工程文件Project Files3.2 构建设置Build Settings3.3 链接Linking3.4 配置Configurations3.5 平台Platforms3.6 过滤Filters3.7 预设值Tokens 4、测试4.1 测试1&#xff1a;入门例子4.2 测试2&#xff1a…

Spring修炼之路(1)基础入门

一、简介 1.1Spring概述 Spring框架是一个轻量级的Java开发框架&#xff0c;它提供了一系列底层容器和基础设施&#xff0c;并可以和大量常用的开源框架无缝集成&#xff0c;可以说是开发Java EE应用程序的必备。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&…

Ubuntu Seata开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建seata.service文件 [Unit] Descriptionalibaba seata Afternetwork.target Documentationhttps://seata.io/zh-cn/[Service] Userroot Grouproot Typeforking Environment"JAVA_HOME/usr/local/programs/jdk-8u333-li…

【CTFHUB】SSRF绕过方法之靶场实践(二)

SSRF POST请求 提示信息&#xff1a; 这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年 首先测试了http的服务请求&#xff0c;出现对话框 输入数值后提示&#xff1a;只能接受来自127.0.0.1的请求 右键查看源码发现key值 通过file协…

一个简单的敏捷开发的例子

敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。 敏捷开发以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。在敏捷开发中&#xff0c;软件项目在构建初期被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备可视…

SpringMVC 学习(八)整合SSM

10. 整合 SSM (1) 新建数据库 CREATE DATABASE SSM;USE SSM;DROP TABLE IF EXISTS BOOKS;CREATE TABLE BOOKS (BOOK_ID INT(10) NOT NULL AUTO_INCREMENT COMMENT 书ID,BOOK_NAME VARCHAR(100) NOT NULL COMMENT 书名,BOOK_COUNTS INT(11) NOT NULL COMMENT 数量,DETAIL VARCH…

C/S架构学习之TCP服务器

TCP服务器的实现流程&#xff1a;一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;通信域选择IPV4网络协议、套接字类型选择流式&#xff1b; int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网络信息结构体&…