C语言——指针(二)

news2024/12/25 8:54:01

📝前言
上篇文章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];   //取出首元素的地址放入指针p
	for (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.coloradmin.cn/o/1250185.html

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

相关文章

【漏洞复现】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上传漏洞 附POC

漏洞描述 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财务、供…

原始类型 vs. 对象实践应用

● 首先是原始类型的例子 let lastName Williams; let oldLastName lastName; lastName Davis; console.log(lastName.oldLastName);● 然后是对象的例子 const jessica {firstName: Jessica,lastName: Williams,age: 27, }; const marriedJessica jessica; marriedJess…

docker部署phpIPAM

0说明 IPAM&#xff1a;IP地址管理系统 IP地址管理(IPAM)是指的一种方法IP扫描&#xff0c;IP地址跟踪和管理与网络相关的信息的互联网协议地址空间和IPAM系统。 IPAM软件和IP的工具,管理员可以确保分配IP地址仍然是当前和足够的库存先进的IP工具和IPAM服务。 IPAM简化并自动化…

2023.11.25-istio安全

目录 文章目录 目录本节实战1、安全概述2、证书签发流程1.签发证书2.身份认证 3、认证1.对等认证a.默认的宽容模式b.全局严格 mTLS 模式c.命名空间级别策略d.为每个工作负载启用双向 TLS 2.请求认证a.JWK 与 JWKS 概述b.配置 JWT 终端用户认证c.设置强制认证规则 关于我最后 本…

居家适老化设计第三十条---卫生间之坐便

以上产品图片均来源于淘宝 侵权联系删除 在居家适老化中&#xff0c;马桶是非常重要的设施之一&#xff0c;它能够提供方便、安全、舒适的上厕所体验。以下是一些居家适老化中常见的马桶设计和功能&#xff1a;1. 高度合适&#xff1a;为了方便老年人坐起和站起&#xff0c;马…

js逆向-JS加密破解

一、常见五种js加密手段 &#xff08;一&#xff09;加密位置&#xff1a; 1.Request Payload 加密 2.Request Headers 加密 3.Request URL params 参数加密 4.Response Data 数据加密 5.JS代码混淆加密 &#xff08;二&#xff09;加密算法 base64 编码 哈希算法&…

【从删库到跑路 | MySQL总结篇】数据库基础(增删改查的基本操作)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 重点放前面&am…

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

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

Ubuntu服务器/工作站常见故障修复记录

日常写代码写方案文档&#xff0c;偶尔遇上服务器出现问题的时候&#xff0c;也需要充当一把运维工程师&#xff0c;此帖用来记录服务器报错的一些解决方案&#xff0c;仅供参考&#xff01; 文章目录 一、服务器简介二、机箱拆解三、基本操作3.1 F2进入BIOS3.2 F12进入Boot Me…

sql 动态语句

批量删除用的 foreach

剑指offer(C++)-JZ43:整数中1出现的次数(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个整数 n &#xff0c;求 1&#xff5e;n 这 n 个整数的十进制表示中 1 出现的次数 例如&#xff0…

Spring原理——基于xml配置文件创建IOC容器的过程

Spring框架的核心之一是IOC&#xff0c;那么我们是怎么创建出来的Bean呢&#xff1f; 作者进行了简单的总结&#xff0c;希望能对你有所帮助。 IOC的创建并不是通过new而是利用了java的反射机制&#xff0c;利用了newInstance方法进行的创建对象。 首先&#xff0c;我们先定义…

医学检验(LIS)管理系统源码,LIS源码,云LIS系统源码

医学检验(LIS)管理系统源码&#xff0c;云LIS系统全套商业源码 随着全自动生化分析仪、全自动免疫分析仪和全自动血球计数器等仪器的使用&#xff0c;检验科的大多数项目实现了全自动化分析。全自动化分析引入后&#xff0c;组合化验增多&#xff0c;更好的满足了临床需要&…

抵御网络威胁的虚拟盾牌:威胁建模

威胁建模是一个允许您管理因日益复杂且不断变化的 IT 安全威胁而产生的风险的过程。为了保护敏感系统和数据&#xff0c;主动了解和应对这些威胁至关重要。 威胁建模是识别、评估和减轻这些威胁的关键过程&#xff0c;确保组织准备好面对不断出现的新的复杂挑战。 本文将详细…

RTL8762x芯片避坑总结之1——用GPIO模拟I2C

1. 使用GPIO模拟I2C&#xff1a; 1.1 按常规逻辑 在输出第1个数据&#xff0c;切换为输入读取ACK后&#xff0c;切回输出无效&#xff0c;不能输出数据&#xff1a; 1.2 在切换输入输出前&#xff0c;需要对Pad重新进行配置 重新配置后&#xff0c;输入输出切换成功&#xf…

笔记本电脑可以投屏到电视吗?Win、Mac、Linux分别怎么投屏?

如果你的电视是安卓电视&#xff0c;那么答案是&#xff1a;完全可以&#xff01; 不管你的笔记本电脑是Windows系统、macOS系统还是Linux系统&#xff0c;你都可以借助AirDroid Cast的电脑客户端或网页版&#xff0c;将电脑屏幕投屏到安卓智能电视上。 首先&#xff0c;你需要…

数据链路层-以太网协议

目录 数据链路层的作用认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程ARP协议ARP协议作用ARP数据报的格式ARP协议的工作流程 数据链路层的作用 我们知道数据能在网络中从一台主机发送到另一台主机…

【Proteus仿真】【STM32单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能&#xff1a; 系统运行后&…

极智项目 | 实战实时、多人2D人体姿态识别之OpenPose

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍 实战实时、多人2D人体姿态识别之OpenPose。 本文介绍的 实战实时、多人2D人体姿态识别之OpenPose&#xff0c;提供完整的可以一键执行的项目工程源码&…

android实战项目之二十二---如何快速APP中集成支付宝和微信支付功能

效果图 实现方案 jcenter 集成方式 implementation com.xgr.easypay:EasyPay:2.0.5 // 基类库&#xff0c;必选 implementation com.xgr.easypay:wechatpay:2.0.5 // 微信支付&#xff0c;可选 implementation com.xgr.easypay:alipay:2.0.5 // 支付宝支付&#xff0c;可…