c语言:指针运算

news2024/11/24 2:59:37

目录

指针类型与整型进行加减

规律

同类型指针减法运算

其他类型的指针运算


一个数据对象的内存位置有两个重要信息:

  1. 数据对象的首地址
  2. 数据对象占用存储空间大小

指针类型的值存储的是内存地址。内存地址是从0开始,依次加1的整型数据。 


指针类型与整型进行加减

我们让指针变量从地址100开始加减,看看能不能成功。如果可以,计算后的结果是什么。

 

 

编译后,我们发现编译器提示我们,不能将int类型转换为指针类型。

这个错误应该是意料之中的,指针类型可以记录两种信息,一个是首地址,一个是目标数据空间大小。

而整型数据的值可以被当作首地址,但是目标数据空间大小却无法表示。赋值操作符两边提供的信息不统一,那么肯定无法成功赋值。

既然无法直接赋值,我们将整型转换为对应的指针类型后,再进行赋值。

现在编译可以通过了,让我们仔细观察结果。

所有的指针内保存的首地址一开始均为100,加1后,现在变成了不同的值。与初始值相比,分别移动了:1244848

sizeof(char) = 1

sizeof(short) = 2

sizeof(int) = 4

sizeof(long) = 4 sizeof(long long) = 8 sizeof(float) = 4

sizeof(double)

指针类型加1后,将首地址向后移动了 sizeof(目标数据对象) 字节。我们再让指针加2试试看?

 

与初始值相比,分别移动了:248816816

指针类型加2后,将首地址向后移动了两个 sizeof(目标数据对象) 字节。

pc = pc - 1;

ps = ps - 1;

pn = pn - 1;

pl = pl - 1;

pll = pll - 1;

pf = pf - 1;

pd = pd - 1;

指针类型与整型也可以进行减法运算。指针类型减1后,将首地址向前移动了 sizeof(目标数据对象) 字节。 


规律

sizeof(目标数据对象) 被称作步长。

指针类型加 n 后。其首地址向后移动 n * 步长 字节。

指针类型减 n 后。其首地址向前移动 n * 步长 字节。


n1n2n3n4之间的首地址刚好相差 sizeof(int)

那么我们是否可以通过指针与整型加减来访问它们呢?

接着,我们使用取值运算符*,将指针指向的目标数据对象进行修改。

*p = 111 ,使得 p 指向的数据对象改为111

*(p - 1) = 222 ,使得 p - 1 指向的数据对象改为222

*(p - 2) = 333 ,使得 p - 2 指向的数据对象改为333

*(p - 3) = 444 ,使得 p - 3 指向的数据对象改为444

n1n4被修改为了111444

注意,表达式 p - 1 必须先被括号包裹,再使用取值运算符*。这是因为取值运算符*的优先级高于算术运算符。

我们需要先让首地址移动,再进行取值操作。

若不使用括号, *p 会先被取值,之后值再被加1

不使用括号:

*p 的值为111*p - 1 的结果为110

使用括号:

(p - 1) 使得首地址移动到n2*(p - 1) 得到结果为222

请格外注意,函数内声明的变量在内存中不一定是首尾相接的。受到内存对齐的影响,它们有可能不连续。这个例子仅仅是为了让读者理解指针与整型加减运算,请勿在实际使用中使用这种写法

另外,数组可以保证各元素在内存中首尾相接,各元素连续分布在内存上。所以,C语言中可以使用指针与整型加减运算访问和修改数组元素。我们将在下一节中讨论使用指针访问数组。

 


同类型指针减法运算

 

第一个元素 arr[0] 的首地址为20970856。第六个元素 arr[5] 的首地址为20970876

&arr[5] - &arr[0] 进行减法运算后,结果居然是5

类比于指针类型与整型加减,这里肯定也受到了步长影响。步长为目标类型所占空间大小,步长为 sizeof(int)

arr[5] 的首地址减 arr[0] 的首地址为20970876 - 20970856 = 20。两首地址差值除以步长刚好为5。这里的5意义为:第一个元素与第六个元素之间相隔了5个元素。

规律

sizeof(目标数据对象) 被称作步长。

指针类型与指针类型相减后,其结果为两首地址差值除以步长。


其他类型的指针运算

上面我们介绍了两种有指针类型参数的运算:

  1. 指针类型与整型加减。
  2. 同类型的指针相减。

它们的运算结果都在内存上拥有实际的意义。还有另外几种运算:

  1. 指针类型与整型进行乘除运算。
  2. 同类型的指针相加。
  3. 同类型的指针乘除。

这些运算结果都没有实际意义,在C语言中无法通过编译。

 

 

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

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

相关文章

单元测试二(实验)-云计算2023.12-云南农业大学

1、实践系列课《深入浅出Docker应用》 https://developeraliyun.com/adc/scenarioSeries/713c370e605e4f1fa7be903b80a53556?spma2c6h.27088027.devcloud-scenarioSeriesList.13.5bb75b8aZHOM2w 容器镜像的制作实验要求 创建Dockerfile文件: FROM ubuntu:latest WORKDIR data…

Git应用——代码提交规范 feat ,fix ,style

当前使用 feat 增加新功能fix 修复问题/BUGstyle 代码风格相关无影响运行结果的perf 优化/性能提升refactor 重构revert 撤销修改test 测试相关docs 文档/注释chore 依赖更新/脚手架配置修改等workflow 工作流改进ci 持续集成types 类型定义文件更改wip 开发中 别处看到 fea…

玩转大数据14:分布式计算框架的选择与比较

1. 引言 随着大数据时代的到来,越来越多的企业和组织需要处理海量数据。分布式计算框架提供了一种有效的方式来解决大数据处理的问题。分布式计算框架将计算任务分解成多个子任务,并在多个节点上并行执行,从而提高计算效率。 2. 分布式计算…

【操作系统导论】内存篇——分页

引入 采用 「分段」 的方式,将空间切成 不同长度的分片,会出现 碎片化 问题,随着时间推移,分配内存会越来越困难。 因此,值得考虑「分页」的方法: 将空间分割成 固定长度的分片 ; 将物理内存…

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的,最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”(美洲斑马或者克文斑马),学名为“Equussimplicidens”&…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展,家具家电企业正迎来“精品制造”的时代,业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率,企业亟需加强对自主品牌的安全建设,确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

Docker真的好难用啊,为什么说它移植性好啊?

看起来你对Docker有点困惑和挑战呀。Docker刚开始确实有点难以入门,但是一旦掌握了它的核心概念和操作,你会发现它其实非常强大和便利。 接下来我会根据你提出的问题和场景,详细地解答。 关于你的实际问题: 刚接触时的困难是正。…

如何实现服务注册与发现?

本文主要讲解如何实现服务注册与发现。 在分布式服务中,服务注册和发现是一个特别重要的概念,为什么需要服务注册和发现?常用的服务发现组件有哪些?服务注册和发现对一致性有哪些要求呢?下面我们就来学习服务发现相关的知识。 …

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

用XAMPP在Windows系统构建一个本地Web服务器

用XAMPP在Windows系统构建一个本地Web服务器 Build a Local Web Server for Windows with XAMPP By JacksonML 本文简要介绍如何获取和安装XAMPP以实现Windows环境下本地Web服务器的过程,希望对广大网友和学生有所帮助。 所谓本地Web服务器,即使用本地…

Python框架篇(5):FastApi-中间件使用

1.介绍 1.1 官网介绍 "中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作. 它接收你的应用程序的每一个 请求. 然后它可以对这个 请求做一些事情或者执行任何需要的代码. 然后它将 请求传递给应用程序的其他部分 (通过某种 路径操…

slurm 23.11.0集群 debian 11.5 安装

slurm 23.11.0集群 debian 11.5 安装 用途 Slurm(Simple Linux Utility for Resource Management, http://slurm.schedmd.com/ )是开源的、具有容错性和高度可扩展的Linux集群超级计算系统资源管理和作业调度系统。超级计算系统可利用Slurm对资源和作业进行管理&a…

变电站蓄电池在线监测系统(论文+源码)

1. 系统设计 本次课题为变电站蓄电池在线监测系统的设计,其系统架构如图3.1所示,包括了主控制器STC89C52单片机,液晶显示器LCD1602,模数转换器ADC0832,电流传感器ACS712,分压电阻,蜂鸣器以及温度传感器。在…

Amazon SageMaker: 拓展机器学习边界,塑造未来创新趋势

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 近期在 re:Invent 2023 大会上,亚马逊云科技发布了一…

如何将Galaxybase图数据库应用于电力设备管理

导读 近日,受强冷空气影响,部分北方地区出现不同程度的降雪,并持续降温。据国家电网发布的预警通知,要求启动预警响应和应急机制,密切跟踪灾害预警信息和应急响应情况,滚动研判分析覆冰、积雪、低温等对电…

vite+vue3+electron搭建项目

编辑器使用vscode,打开一个空文件夹 第一步 初始化vite项目 初始化vite项目,命令 npm init vite 第二步 下载依赖 进入新建的项目,下载依赖,命令 cd vite-projec npm i第三步 使用cnpm下载 electron依赖 新建一个终端&#…

雪花算法详细讲解

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

HNCTF

[Week1]Interesting_http 题目提示:Give me your want! POST方式传参want参数,先随便传want1; 题目问你想要什么,肯定是flag呗,传参wantflag;提示不是admin 将数据包中的Cookie:usernotadmin修…

C# 实现图片的压缩和改变大小png、jpg和gif

环境 .net6 Magick.NET-Q16-AnyCPU 13.5 Magick.NET源码 代码 using ImageMagick;namespace ImageCompress {internal class Program{static void Main(string[] args){string inputPath "imgloading.gif"; // 输入的GIF文件路径 string outputPath "im…

ChatGPT Plus重新开启订阅

12月14日凌晨,OpenAI首席执行官Sam Altman在社交平台宣布,终于找到了更多的GPU算力,重新开启订阅ChatGPT Plus。 上个月15日,OpenAI就因为算力不足,以及用户激增等原因暂停了ChatGPT Plus订阅。 Sam表示,在…