C语言——指针(二)

📝前言
上篇文章C语言——指针(一)初步讲解了:
1,指针与指针变量
2,指针变量的基本使用(如何定义初始化引用
这篇文章我们进一步探讨,使用指针中有关指针的运算
1,指针运算
2,指针变量类型对指针使用的影响

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:不管怎么样,明天又是新的一天!

文章目录

    • 一,指针运算
      • 1,指针+-整数
      • 2,指针-指针
      • 3,指针的关系运算
    • 二,指针变量类型对指针使用的影响
      • 1,影响指针解引用权限
      • 2,影响指针+-整数的运算

一,指针运算

指针的基本运算主要分三种,分别是:
1,指针±整数
2,指针-指针
3,指针的关系运算

1,指针±整数

因为数组元素在内存中是连续存放的,那么,我们能不能通过【首地址+偏移量】的方式来得到其他元素的地址呢?
答案是可以的,比如下面的代码:

int main()
{int arr[5] = { 1,2,3,4,5 };  int* p = &arr[0];   //取出首元素的地址放入指针pfor (int i = 0; i < 5; i++){printf("%d ", *(p + i));  //(p+i)就是(指针+整数)的形式}
}

输出结果是:
1 2 3 4 5

也就是说:
(p+i)所代表的地址,随着i每次加1,地址也跳跃到了后面的元素
所以:
**指针±整数**就是:指针为首地址,来计算出偏移量为整数的元素的地址,让指针实现向前和向后的跳跃。

2,指针-指针

前提条件:两个指针必须指向同一块空间(比如,同一个数组)
来看下面代码:

int main()
{int arr[5] = { 1,2,3,4,5 };int* p1 = &arr[0];  //p1存放的是第一个元素的地址int* p2 = &arr[4];  //p2存放的是最后一个元素的地址printf("p1 = %p\n", p1);  //打印指针p1的内容printf("p2 = %p\n", p2);  //打印指针p2的内容printf("p2 - p1 = %d\n", p2 - p1);  //大地址-小地址printf("p1 - p2 = %d\n", p1 - p2);  //小地址-大地址return 0;
}

输出结果:
在这里插入图片描述

我们可以发现:
虽然指针是用16进制数来表示的,但是输出结果并不是将两个16进制数单纯的进行加减运算,输出结果也并不是一个指针。
实际上,指针-指针的绝对值是:指针之间元素的个数

对于指针±整数,指针-指针我们可以类比理解:
日期±天数:得到的是日期
日期-日期:得到的是天数
(在这里,日期就好比地址天数就好比整数

3,指针的关系运算

其实就是指针的大小比较,例如:

int main()
{int arr[5] = { 1,2,3,4,5 };int* p = &arr[0];while (p < arr + 5)  //这里就是比较p和arr+5的(16进制数)大小{printf("%d ", *p);p++;}return 0;
}

输出结果是:
1 2 3 4 5

二,指针变量类型对指针使用的影响

1,影响指针解引用权限

指针的解引用权限通俗来讲就是:一次性能操作几个字节

我们来看下面两段代码:

这里是引用

两段代码都是通过对指针解引用来操作n,给n赋值。区别在于左边的指针变量是int* 类型,但是右边的指针变量是char*类型

我们在调试时观察n的变化:

这里是引用

发现:
用 int* 类型的指针变量时,n被完全改成了0(其实被改了4个字节)
0x11223344 → 0x00000000
用 char*类型的指针变量时,n只被改了一部分(其实被改了1个字节):
0x11223344 → 0x11223300
这就是为什么图左的n值减少了120(转换为10进制)

上述现象都是因为:指针变量的类型决定了指针解引用的权限
char* 的指针解引用只能一次访问1个字节,但是int* 的指针解引用就可以访问4个字节
同理:
double* 可以访问8个字节
short* 可以访问2个字节

2,影响指针±整数的运算

来看下面的代码:

int main()
{int n = 10;char* p1 = (char*)&n;int* p2 = &n;printf("&n   = %p\n", &n);printf("p1   = %p\n", p1);printf("p1+1 = %p\n", p1+1);printf("p2   = %p\n", p2);printf("p2+1 = %p\n",p2+1);return 0;
}

运行结果,我们观察地址的变化:

这里是引用

我们发现:
对于char* 类型的指针变量p1,+1操作让地址向后跳过了1个字节
对于int* 类型的指针变量p2,+1操作跳过了让地址向后跳过了4个字节

这就是指针变量类型不同对指针±整数的影响:
指针变量的类型决定了指针向前或者向后走一步的距离(跳过的字节的大小)

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!最后,☺祝愿大家天天开心!!!

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

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

相关文章

常见树种(贵州省):017柳树、喜树、珙桐、木棉、楝、枫杨、竹柏、百日青、翅荚香槐、皂荚、灯台树

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、柳树 …

idea自动切换输入法Smart Input

idea搜索后下载 红色表示中文输入法 再ideavim场景下会自动切换成英文非常好用强烈推荐下载一个

vue3(一)-基础入门

一、导入vue.js 1.可以借助 script 标签直接通过 CDN 来使用 Vue <!-- <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> -->2.也可以下载vue.global.js文件并在本地导入 <script src"./lib/vue.global.js">&…

代码随想录算法训练营第四十四天|57. 爬楼梯、322.零钱兑换、279. 完全平方数

KamaCoder 57. 爬楼梯 题目链接&#xff1a;题目页面 (kamacoder.com) 这道题使用完全背包来实现&#xff0c;我们首先考虑的是总的楼梯数&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n阶时有多少种方法爬到楼顶&#xff0c;因此&#xff0c;当前n状…

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽&#xff0c;只是可能性的一个子集。目的是描述基于Arm组件的SoC…

LV.12 D19 ADC实验 学习笔记

一、ADC简介 1.1 ADC ADC(Analog to Digital Converter)即模数转换器&#xff0c;指一个能将模拟信号转化为数字信号的电子元件 1.2 ADC主要参数 分辨率 ADC的分辨率一般以输出二进制数的位数来表示&#xff0c;当最大输入电压一定时&#xff0c;位数越高&#xff0c…

逸学java【初级菜鸟篇】10.I/O(输入/输出)

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 1.请重点的掌握I/O的。 场景&#xff1a;最近你在企业也想搞一个短视频又想搞一个存储的云盘&#xff0c;你一听回想到自己对于这些存储的基础还不是很清楚&#xff0c;于是回家开始了…

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别&#xff1f;

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么&#xff1f;二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

NX二次开发UF_CURVE_ask_combine_curves 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_combine_curves Defined in: uf_curve.h int UF_CURVE_ask_combine_curves(tag_t combine_curve_feature, tag_t * first_curve_tag, UF_CURVE_combine_curves_directi…

Pycharm 教育版下载

1 访问 Jetbrains 主站-->Developer Tools-->PyCharm JetBrains: Essential tools for software developers and teams 2 页面往下划找到 PyCharm for Education-->CHECK IT OUT! PyCharm: the Python IDE for Professional Developers by JetBrains 3 点击 Downloa…

水淹七军(递归,又是递归)

北大2023级最强新生问我的&#xff0c;最后他的问题说是重写了一遍就解决了 乐死了&#xff0c;有的时候根本看不出源代码漏了哪里 我的思路是&#xff1a; 一个数组记录本次放水所经过的格子&#xff0c;经过的不再递归 一个数组记录地图上各地点的高度 一个数组记录地图…

vue3 for循环创建的多个e-form 添加校验

v-for 创建 ref <el-form :model"item" :rules"state.rules" :ref"el > getRiskSpreadRef(el, index)" ></el-form>// 定义ref list const riskSpreadRefList ref<HTMLElement[]>([]);// ref存到数组 const getRiskSpread…

物流公司打印用什么软件,佳易王物流运单打印管理系统软件下载

物流公司打印用什么软件&#xff0c;佳易王物流运单打印管理系统软件下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、物流开单打印&#xff0c;可以打印两联单或三联单&#x…

基于Vue+SpringBoot的数字化社区网格管理系统

项目编号&#xff1a; S 042 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S042&#xff0c;文末获取源码。} 项目编号&#xff1a;S042&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 源码 & 项目录屏 二、功能模块三、开发背景四、系统展示五…

c语言:模拟实现各种字符串函数

strlen函数&#xff1a; 功能&#xff1a;获取到\0之前的的字符个数。 代码模拟实现函数&#xff1a; //strlen //这里用了递归法&#xff0c; //如abc&#xff0c;1bc&#xff0c;然后11c&#xff0c;接着111&#xff0c;最后读取到\0&#xff0c;1110&#xff0c;得到结果3…

使用Linux JumpServer堡垒机本地部署与远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装Jump server二. 本地访问jump server三. 安装 cpolar内网穿透软件四. 配…

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…

京东数据采集接口推荐(京东大数据分析工具)

随着京东电商平台的不断发展&#xff0c;平台中店铺数量也越来越多&#xff0c;对于电商卖家而言&#xff0c;在电商运营过程中如何做好数据分析也越来越重要。而电商运营数据往往多而杂&#xff0c;想要高效的完成电商数据分析&#xff0c;品牌需要借助一些电商数据分析软件。…