指针的运算

news2025/2/24 21:03:49

 

在C语言中,指针是一个非常重要的概念。指针可以用来访问和修改内存中的数据,也可以用来进行指针的运算。在本篇博客中,我们将探讨指针的解引用、指针与整数的加减运算、同类型指针间的减法运算和指针的关系运算。

指针的解引用

在C语言中,指针可以用来访问内存中的数据。通过*(解引用操作符),可以根据指针中存储的首地址和空间大小找到目标数据对象。这个过程称为指针的解引用。在C语言中,我们可以使用*运算符来进行指针的解引用,例如:

#include <stdio.h>

int main()
{
    int x = 10;
    int *ptr = &x;

    printf("x = %d\n", x);
    printf("*ptr = %d\n", *ptr);

    *ptr = 20;

    printf("x = %d\n", x);
    printf("*ptr = %d\n", *ptr);

    return 0;
}

在这个例子中,我们定义了一个整数变量x,并将其赋值为10。然后,我们定义了一个指向整数的指针ptr,并将其初始化为x的地址。我们可以通过指针访问x的值,例如,*ptr就是x的值。我们还可以通过指针修改x的值,例如,*ptr = 20就是将x的值修改为20。

指针与整数的加减运算

 

在C语言中,指针可以进行与整数的加减运算。指针与整数的加减运算实际上是指针的地址值与整数的乘积或除积。例如:

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;

    printf("ptr = %p\n", ptr);
    printf("ptr + 1 = %p\n", ptr + 1);
    printf("ptr + 2 = %p\n", ptr + 2);

    return 0;
}

在这个例子中,我们定义了一个整数数组arr,并将其初始化为{1, 2, 3, 4, 5}。然后,我们定义了一个指向整数的指针ptr,并将其初始化为arr的地址。我们可以通过指针访问arr中的元素,例如,*ptr就是arr[0]的值。我们还可以通过指针进行加减运算,例如,ptr + 1就是arr[1]的地址。同理,ptr + 2就是arr[2]的地址。

同类型指针间的减法运算

在C语言中,同类型的指针可以进行减法运算。同类型两指针相减后,其结果为两首地址差值除以步长。(步长是指数组中相邻元素之间的距离)例如:

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr1 = &arr[0];
    int *ptr2 = &arr[3];

    printf("ptr1 = %p\n", ptr1);
    printf("ptr2 = %p\n", ptr2);
    printf("ptr2 - ptr1 = %ld\n", ptr2 - ptr1);

    return 0;
}

在这个例子中,我们定义了一个整数数组arr,并将其初始化为{1, 2, 3, 4, 5}。然后,我们定义了两个指向整数的指针ptr1和ptr2,并分别将它们初始化为arr[0]和arr[3]的地址。我们可以通过指针之间的减法运算来计算它们之间的距离,例如,ptr2 - ptr1就是3,表示ptr2和ptr1之间有3个整数。

指针的减法运算需要指针类型相同,且两指针指向同一段连续的内存空间,这样的减法才有意义,其减法的结果就是两指针之间的元素个数

指针的关系运算

在C语言中,指针可以进行关系运算。指针的关系运算包括相等运算、大于运算和小于运算。指针的关系运算实际上是指针之间的地址值的比较。例如:

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr1 = &arr[0];
    int *ptr2 = &arr[3];

    if (ptr1 == ptr2)
    {
        printf("ptr1 and ptr2 are equal\n");
    }
    else if (ptr1 < ptr2)
    {
        printf("ptr1 is less than ptr2\n");
    }
    else if (ptr1 > ptr2)
    {
        printf("ptr1 is greater than ptr2\n");
    }

    return 0;
}

在这个例子中,我们定义了一个整数数组arr,并将其初始化为{1, 2, 3, 4, 5}。然后,我们定义了两个指向整数的指针ptr1和ptr2,并分别将它们初始化为arr[0]和arr[3]的地址。我们可以通过指针之间的关系运算来比较它们之间的大小关系,例如,ptr1 < ptr2就是true,表示ptr1的地址值小于ptr2的地址值。

需要注意的是。根据C语言的标准规定,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。这是因为指向第一个元素之前的那个内存位置的指针是未定义的行为,可能会导致程序崩溃或其他不可预测的结果。

例如,考虑以下代码:

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr1 = &arr[0];
    int *ptr2 = &arr[4];
    int *ptr3 = &arr[-1];

    if (ptr1 < ptr2)
    {
        printf("ptr1 is less than ptr2\n");
    }

    if (ptr1 < ptr3)
    {
        printf("ptr1 is less than ptr3\n");
    }

    return 0;
}

在这个例子中,我们定义了一个整数数组arr,并将其初始化为{1, 2, 3, 4, 5}。然后,我们定义了三个指向整数的指针ptr1、ptr2和ptr3,并分别将它们初始化为arr[0]、arr[4]和arr[-1]的地址。根据C语言的标准规定,ptr1和ptr2之间的比较是合法的,因为它们都指向数组元素,而ptr1和ptr3之间的比较是不合法的,因为ptr3指向数组第一个元素之前的内存位置。

因此,编写程序时,我们应该遵循C语言的标准规定,避免使用指向数组第一个元素之前的内存位置的指针进行比较,以确保程序的正确性和可移植性。

总结

指针是C语言中非常重要的概念,掌握指针的运算对于编写高效的程序和理解计算机工作原理非常重要。本篇博客介绍了指针的解引用、指针与整数的加减运算、同类型指针间的减法运算和指针的关系运算,并提供了相应的C语言代码示例。希望本篇博客能够帮助您更好地理解指针的运算。

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

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

相关文章

网络安全运维人员面临的痛点分析

1. 工作压力大&#xff1a;网络安全运维人员需要时刻关注系统的安全状况&#xff0c;发现并修复漏洞&#xff0c;保护系统免受攻击和数据泄露的风险。这需要他们不断学习新知识、掌握新技能&#xff0c;并且在短时间内快速响应和处理各种安全问题&#xff0c;这种高强度的工作压…

Arcgis小技巧【12】——ArcGIS标注的各种用法和示例

标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节&#xff0c;内容比较杂&#xff0c;想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】&#xff0c;在【标注】选项卡下勾选【标注此图层中的的…

pr 是什么——可以做什么

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

Boosting算法预测银行客户流失率

Boosting算法预测银行客户流失率 描述 为了防止银行的客户流失&#xff0c;通过数据分析&#xff0c;识别并可视化哪些因素导致了客户流失&#xff0c;并通过建立一个预测模型&#xff0c;识别客户是否会流失&#xff0c;流失的概率有多大。以便银行的客户服务部门更加有针对…

TS+Axios的封装(vue3.x环境)

1. 创建axios实例 # 项目src下新建utils/request.ts # npm i axios 是必须滴 import axios from axiosconst baseURL https://ilovesh.com // 基地址 const instance axios.create({baseURL,timeout: 3000 // 请求超时时间 (3秒超时) })export { baseURL, instance } 2. 添加…

龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席

近日&#xff0c;开放原子开源基金会举办了技术监督委员会&#xff08;以下简称“TOC”&#xff09;第六十九次全体会议&#xff0c;会上针对新一届 TOC 成员改选进行了公正公平的投票&#xff0c;龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席。 &#xff08;图左二/龙…

(排序8)归并排序(非递归实现),归并排序的外部排序应用(文件排序)的简单了解

归并排序递归版本 void _MergeSort(int* arr, int left , int right, int* tmp) {if (left > right){return;}int mid (left right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid 1, right, tmp);int begin1 left;int end1 mid;int begin2 mid 1;int e…

一文掌握 Python、Anaconda、PyCharm 的安装和使用

本文将介绍一个较为全面的 Python 开发环境的搭建与基本使用&#xff0c;包括 Python 解释器的安装使用、PyCharm 编辑器的安装使用、Anaconda 的安装使用和库管理工具 pip 的使用。 PyCharm Anaconda 是一个很完备的 Python 开发环境&#xff0c;也是绝大多数开发者使用的开发…

E6410安装PVE直通显卡安装LibreELEC系统

文章目录查看cpu是否支持直通音频笔记本关盖设定BIOS设定启动内核IOMMU支持添加驱动黑名单绑定核显到vfio模块然后新建一个虚拟机安装LibreELEC注意事项重启 VM 时 GPU 直通失败如果直通后遇到问题了&#xff0c;开机出现各种问题&#xff0c;进不去系统&#xff0c;或者网页进…

【MySQL数据库原理】数据库批量导入美团NLP分类数据集Meituan-Dianping/asap

目录 数据集简单介绍完整代码实现参考资料数据集简单介绍 美团点评数据集 (Meituan-Dianping/asap) 是一个中文自然语言处理 (NLP) 数据集,由美团点评公司收集和发布。该数据集用于评估和开发中文文本分类和情感分析模型,包括情感极性分类、食物安全文本分类和自定义分类等任…

【分布式应用】Zabbix——安装

目录 第一章zabbix概述 1.1.什么是监控概念 1.2.zabbix概述 1.3.zabbix 主要特点 1.4.zabbix主要功能 1.5.zabbix运行机制 1.6.zabbix 监控原理 1.7zabbix的架构&#xff0c;数据流向以及原理在图中做总结 1.8.数据采集模式 1.9.zabbix监控模式 第二章.安装 部署 za…

Hyper-v下安装CentOS-Stream-9

1、我不想要动态扩展的硬盘&#xff0c;固定大小硬盘性能更高&#xff0c;所以这里我先创建一个固定硬盘&#xff08;如果你想用动态扩展的硬盘&#xff0c;那么可以省略前面几步&#xff0c;直接从第7步开始&#xff0c;并在第12步选择创建可动态扩展的虚拟硬盘&#xff09;&a…

JAVA开发(神乎其神的区块链概念和技术)

由于我最近需要做一个关于区块链的项目&#xff0c;所以想写篇博文记录一下自己的一些疑惑。区块链技术最火爆的时间应该是2016年和2017年。它产生的背景是B特币兴起&#xff0c;一时间说虚拟货币将取代所有实物货币炒的沸沸扬扬。它的主要思想思想是去中心化。网络上给了很多概…

ubuntu虚拟机下搭建zookeeper集群,安装jdk压缩包,搭建Hadoop集群与spark集群的搭建【上篇】

系列文章目录 在vmbox里面安装Ubuntu16.04并且配置jdk以及Hadoop配置的教程【附带操作步骤】 虚拟机vmware下安装Ubuntu16.04修改屏幕尺寸与更新源&#xff0c;以及对应的安装vim和vim常见的操作 Hadoop与主机连接以及20版本的Hadoop配置网络的问题_hadoop连不上网 Hadoop升…

英文文档翻译软件-汉语文章翻译成英语

免费文章翻译软件的主要优点包括&#xff1a; 方便快捷&#xff1a;在线免费文章翻译软件使得翻译变得更加方便和快速&#xff0c;只需要将需要翻译的文本复制粘贴到输入框中&#xff0c;即可获取翻译结果。 费用低廉或免费&#xff1a;相对于一些专业的翻译服务或软件&#x…

AcWing语法基础班 1.1 变量、输入输出、表达式和顺序语句

预备知识 首先先来了解一下最简单的C代码。 本文的所有代码操作均在AcWing的AC Editor中 #include <iostream>using namespace std;int main(){cout << "Hello World" << endl;return 0; }然后使用编译&#xff08;点击调试&#xff0c;再点击运…

(3)基础强化:静态类静态成员,静态构造函数,抽象类抽象成员,值类型和引用类型,Ref

一、静态成员 1、方法重写注意事项 1&#xff09;子类重写父类方法时&#xff0c;必须与父类保持一致的方法签名与返回值类型。即: 方 法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致] 2&#xff09;“方法签名”:一般是指…

Authing 新增 Gitee 、Github、抖音、快手、华为、小米、Gitlab、Oppo、Amazon、Slack、Line 等多种身份源

Authing 身份源新增&#xff1a; 移动端&#xff1a;Gitee 、Github、抖音、快手、华为、小米、Gitlab、Oppo、Amazon、Slack、LineWeb 端&#xff1a;Amazon 身份源提供商&#xff08;Identity Providers&#xff0c;简称 IdP&#xff09; 是一种身份认证服务&#xff0c;其主…

干货分享!提高项目执行力的六大方法

在当今竞争激烈的商业环境中&#xff0c;企业成功的关键在于实施高效的项目管理。项目执行力是一个企业能否在规定时间内交付高质量成果的重要因素。为了确保项目最终交付&#xff0c;企业需要采取以下措施提高项目执行力。 1、明确项目目标和时间表 首先&#xff0c;企业需要…

理解C语言中的空指针和野指针

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;可以用于操作变量和数据结构。但是&#xff0c;指针也是很容易出错的地方。其中包括两种可能的错误&#xff1a;空指针和野指针。 空指针 空指针指代无效的地址&#xff0c;表示指针不指向内存中的任何一个合法对象…