C语言如何进⾏指针运算?

一、问题

        普通变量可以运算,那么指针可以吗?答案是肯定的。那么如何运算呢,下⾯就来介绍⼀下。

二、解答

        我们知道可以利⽤指针⽅便地对数组元素进⾏⽐较和查找,那么这就需要对指针进⾏运算。

(1)⾃增/⾃减运算。

        对于指针变量可以⾃增/⾃减运算,例如:

p++;

        这样⼀句代码究竟有何意义呢?如果 p 是⼀个普通变量,那么它会根据类型不同⽽⾃增一个单位。那么指针变量呢,也是自增一个单位吗?这个单位又会是多少?

#include <stdio.h>
int main()
{int a = 0, *p;char b = 'a', *q;p = &a;q = &b;printf("指针p指向的地址值是:%d\n", p);printf("指针q指向的地址值是:%d\n\n", q);p++;q++;printf("指针自增一次后的地址值是:%d\n", p);printf("指针自增一次后的地址值是:%d\n", q);return 0;
}

        运⾏结果如图所示。

指针p指向的地址值是:1804809432
指针q指向的地址值是:1804809423指针自增一次后的地址值是:1804809436
指针自增一次后的地址值是:1804809424

        从图中可以看出,int 型的指针在⾃增⼀次后,其地址值增加了 4 ,⽽ char 型指针在⾃增⼀次后,其地址值增加了 1 。我们知道,C语⾔中 int 型数据占 4 个字节的内存单元,⽽ char 型占1 个字节的内存单元。这就不难得出,指针的⾃增和⾃减⼀次,就是指针指向的地址值⾃增或⾃减相对应数据类型所占内存单元的字节数。

        这也就是前⾯提到为什么说在定义指针变量时,指针的类型⾮常重要。若使⽤类型不匹配的指针变量,将得到不可预测的结果。

(2)指针加减⼀个整数。

        指针还可以加减⼀个整数,那么如何操作呢?例如(int 型的指针 p,p初始指向地址为 10000):

p+=3;

        与指针⾃增/⾃减相似,这时指针变量 p 并不是将内存单元增加 3 个字节,⽽是增加 3 个基类数据的字节宽度,也就是相当如下的语句。

p = p + 3 * sizeof(*p)

        即:10000+3*4 = 100012  指针减去⼀个整数与增加类似。

(3)两个指针变量相减。

        指针变量保存的是内存地址,所以将两个指针变量相加是没有意义的。于是,不允许将两个指针变量直接相加,但是允许两个指针相减。

        那么两个指针相减得到什么呢?其实,通过上⾯的内容⼰经不难得出答案,那就是两个指针相减得 到的是两个指针之间相差的内存单元数,如果再除以与指针类型相对的数据类型宽度,就 会得到两个变量相隔多少个数据类型位置。如果是数据,就可以得到两个元素之间相隔⼏个元素。

        其实对于指针的加减⼀个整数和两个指针变量相减,这些对于与它们相关的普通变量意义不⼤,这些主要⽤于后⾯要说的指针操作数组。

(4)指针⽐较。

        指针⽐较是为了判断两个指针在内存中的关系。例如:

p1>p2如果返回值为 true,则表示 p1 在内存中处于⾼位地址。p1==p2如果返回值为 true,则说明这两个指针指向同⼀地址值。还有⼀个就是判断地址值是否为空,即:p==NULL 如果返回值为 true,则说明 p 指针为空。

三、总结

        对于指针运算,要注意的是指针只可以加减⼀个整数,其他任何算术运算都是⾮法的。 这⼀点必须谨记,否则会造成不可预料的错误和后果。

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

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

相关文章

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

redis单线程模型

工作原理 在Redis中&#xff0c;当两个客户端同时发送相同的请求时&#xff0c;Redis采用单线程模型来处理所有的客户端请求&#xff0c;会依次处理这些请求&#xff0c;每个请求都会按照先后顺序被执行&#xff0c;不会同时处理多个请求。使得Redis能够避免多线程并发访问数据…

大语言模型应用指南:以ChatGPT为起点,从入门到精通的AI实践教程

目录 前言ChatGPT问世和发展展望未来大语言模型应用指南 特点大语言模型应用指南 主要内容 前言 在20世纪末和21世纪初&#xff0c;人类经历了两次信息革命的浪潮。 第一次是互联网时代的兴起&#xff0c;将世界各地连接在一起&#xff0c;改变了人们获取信息和交流的方式。 …

Nobe.js的安装与配置

1. **下载**&#xff1a;访问Node.js官网&#xff0c;选择适合自己操作系统的安装包进行下载。 2. **安装**&#xff1a;双击下载好的安装包并按照提示进行安装。在安装过程中&#xff0c;可以选择自定义安装路径&#xff0c;并确保勾选接受许可协议。 3. **环境变量配置**&…

函数式接口及Stream流式计算

一、什么是函数式接口 只有一个方法的接口&#xff0c;例如 FunctionalInterface public interface Runnable { public abstract void run(); }二、Function函数式接口&#xff1a;有一个输入参数&#xff0c;有一个输出 三、断定型接口&#xff1a;有一个输入参数&#xf…

YOLO如何入门?

入门 YOLO 目标检测算法&#xff0c;你可以遵循以下步骤&#xff1a; 1. 理解目标检测的基本概念&#xff1a;了解目标检测在计算机视觉中的作用&#xff0c;以及它如何帮助识别和定位图像中的对象。 2. 学习基础的机器学习和深度学习知识&#xff1a;熟悉基础的机器学习算法…

使用rsync建立MySQL从节点

使用场景&#xff1a;MySQL主节点存储较大&#xff0c;使用xtrabackup会遇到异常的情况 前置条件&#xff1a;node-01 与 node-02 做过ssh互信&#xff0c;rsync客户端均已安装&#xff0c;主节点开启binlog node-01 原主节点&#xff0c;数据存放目录为 /var/lib/mysql node-0…

Bin-什么是wafer sorting及相关方案

在半导体行业中,"wafer分bin"(或称为wafer sorting)是指根据晶圆上的芯片在测试过程中的性能参数,将它们分类到不同的性能等级或"bin"中。这个过程对于确保最终产品的性能和质量至关重要。以下是wafer分bin业务的介绍和相关方案: 01、业务介绍: 1. …

语音驱动AI人脸动画

目录 audio2face FaceFormer 语音驱动 3D人脸动画 MODA 基于人脸关键点的语音驱动单张图数字人生成&#xff08;ICCV2023&#xff09; sadTalker 从音频中生成3DMM的头部姿势和表情 Media2Face 还没开源 audio2face https://github.com/FACEGOOD/FACEGOOD-Audio2Face/tr…

《ElementPlus 与 ElementUI 差异集合》el-select 显示下拉列表在 Cesium 场景中无法监听关闭

前言 仅在 Element UI 时有此问题&#xff0c;Element Plus 由于内部结构差异较大&#xff0c;不存在此问题。详见《el-select 差异点&#xff0c;如&#xff1a;高、宽、body插入等》&#xff1b; 问题 点击空白处&#xff0c;下拉列表可监听并关闭&#xff1b;但在 Cesium…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时&#xff0c;特别是在数据可视化、用户界面设计等应用领域&#xff0c;一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…

数据分析_时间维度对比及变化可视化分析(Pandas和Matplotlib)

数据分析_时间维度对比及变化可视化分析(Pandas和Matplotlib) 分析维度包括: 各年度合计销量 各年度合计销售额 各年度平均每公斤销售额 各月度销量对比 各月度销售额变化 构建测试数据 这里你可以了解到: 如何生成时间相关的数据。 如何从列表&#xff08;可迭代对象…

Linux多进程(二)进程通信方式一 管道

管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质其实就是内核中的一块内存(或者叫内核缓冲区)&#xff0c;这块缓冲区中的数据存储在一个环形队列中&#xff0c;因为管道在内核里边&#xff0c;因此我们不能直接…

Vue 双向绑定、diff和nextTick原理

前言 什么是虚拟dom virtual DOM 虚拟DOM&#xff0c;用普通js对象来描述DOM结构&#xff0c;因为不是真实DOM&#xff0c;所以称之为虚拟DOM。 虚拟 dom 是相对于浏览器所渲染出来的真实 dom而言的&#xff0c;在react&#xff0c;vue等技术出现之前&#xff0c;我们要改变页面…

LabVIEW专栏八、类

该章目的是可以开发仪器类。 一、类的概述 一般来说类有三大特性&#xff0c;封装&#xff0c;继承和多态。 在实际项目中&#xff0c;最主要是继承和多态&#xff0c;要搞清楚这两者的概念和在LabVIEW中是怎样应用的。在LabVIEW中&#xff0c;面向对象编程用到的就是LabVIE…

Mac 上可以使用 ping 端口

在 Mac 上可以使用 ping 命令来检查与另一台计算机或网络设备的连通性。要 ping 一个端口&#xff0c;你需要使用另一个命令 nc&#xff08;也称为 netcat&#xff09;。 例如&#xff0c;假设你想要 ping 端口 8080&#xff08;通常用于 HTTP 代理服务器&#xff09;&#xf…

SAM在低阶自适应航空土地覆盖分类中的应用2024.01

GEOSCIENCE AND REMOTE SENSING LETTERS 2024.01 提出了一种新的语义分割模型&#xff0c;该模型结合了SAM的图像编码器和低秩自适应方法(LoRA)&#xff0c;用于航空图像的特征提取和微调。我们还使用了一个辅助CNN编码器来促进下游适应&#xff0c;并补充ViT编码器在密集视觉…

机器学习模型效果不好及其解决办法

当训练出来的机器学习模型效果不佳时&#xff0c;可能涉及多个方面的原因。为了改善模型的效果&#xff0c;需要系统地检查和分析问题的根源&#xff0c;并采取相应的措施进行优化。 一、数据问题 数据质量 检查数据是否干净、完整&#xff0c;是否存在噪声、异常值或缺失值。…

【MySQL】A01、性能优化-语句分析

1、数据库优化方向 A、SQL及索引优化 根据需求写出良好的SQL&#xff0c;并创建有效的索引&#xff0c;实现某一种需求可以多种写法&#xff0c;这时候我们就要选择一种效率最高的写法。这个时候就要了解sql优化 B、数据库表结构优化 根据数据库的范式&#xff0c;设计表结构&…