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">&…

Java中HashMap、Hashtable和ConcurrentHashMap的区别

介绍&#xff1a; 在Java编程中&#xff0c;HashMap、Hashtable和ConcurrentHashMap都是用于存储键值对的常见数据结构。尽管它们在表面上看起来很相似&#xff0c;但实际上它们之间存在一些重要的区别。本文将深入探讨HashMap、Hashtable和ConcurrentHashMap的区别&#xff0c…

代码随想录算法训练营第四十四天|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…

LeetCode90. Subsets II

文章目录 一、题目二、题解 一、题目 Given an integer array nums that may contain duplicates, return all possible subsets (the power set). The solution set must not contain duplicate subsets. Return the solution in any order. Example 1: Input: nums [1,2…

逸学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 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

Python逆向全版本MagicNumber表

参考pycdc的项目源码https://github.com/zrax/pycdc enum PycMagic {MAGIC_1_0 0x00999902,MAGIC_1_1 0x00999903, /* Also covers 1.2 */MAGIC_1_3 0x0A0D2E89,MAGIC_1_4 0x0A0D1704,MAGIC_1_5 0x0A0D4E99,MAGIC_1_6 0x0A0DC4FC,MAGIC_2_0 0x0A0DC687,MAGIC_2_1 0x0A…

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…

PHP 逻辑运算符 学习资料

PHP 逻辑运算符 在 PHP 中&#xff0c;逻辑运算符用于对布尔值进行逻辑操作&#xff0c;包括与、或、非等操作。以下是 PHP 中常用的逻辑运算符的介绍和示例&#xff1a; 与运算符 逻辑与运算符 && 或 and 用于判断多个条件是否同时为真。如果所有条件都为真&#x…

Jenkins 保姆级教程

一、什么是流水线 jenkins 有 2 种流水线分为声明式流水线与脚本化流水线&#xff0c;脚本化流水线是 jenkins 旧版本使用的流水线脚本&#xff0c;新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。 声明式流水线 在声明式流水线语法中&#xff0c;流水线过程定…

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

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

uni-app - 去除隐藏页面右侧垂直滚动条

全局配置 "globalStyle": { //全局配置 "scrollIndicator":"none", // 不显示滚动条 "app-plus":{ "scrollIndicator":"none" // 在APP平台都不显示滚动条 } }局部配置 "path": "pages/ind…