编程仙尊——深入理解指针(1)

news2024/12/26 3:51:27

目录

1.认识指针

2.指针变量和地址

2.1取地址操作符(&)

2.2 指针变量和解引用操作符

2.3 指针变量的大小

3.指针类型的意义

3.1指针的解引用

3.2 指针+-整数

3.3 void*指针



1、认识指针

在生活中,一栋楼的每个房间都会有房间号

有了房间号,就能提高效率,很容易的找到房间

而在C语言中,也会有这样一个个的 “房间” ,我们将它称为地址,有了这些地址,我们就很容易找到我们所创建的变量

同时,在C语言中,我们给地址起了一个新的名字,也叫做--指针

指针==地址==内存编号

我们知道,CPU和内存之间是有大量的数据交互的

而内存也被划分为一个个的单元,1个内存单元大小是1个字节(1个字节拥有1个地址)

每个内存单元都会拥有一个编号,这个编号就是地址,C语言中也把地址称作为指针



回到C语言

我们在编程中,每一次创建新的变量,其实就是在向内存中申请新的空间

如下图:在我们 int a 时,因为 int 是4个字节,所以我们会向内存中申请四个字节的地址

而这四个字节中每一个字节都会有属于自己的地址

下图中 int 申请的四个字节中,地址分别是

0*000000765F4FFC34        0*000000765F4FFC35

0*000000765F4FFC36        0*000000765F4FFC37

4394c41dca864de196e2935c72a2a394.png

2、指针变量和地址

2.1取地址操作符(&)

那么,如何在编程中取出我们的地址呢?

这时就要用到取地址操作符(&)

有了取地址操作符,我们就可以将变量的地址取出来,那么,&该如何使用呢,只需要在 & 后加入你想取出地址的变量,就可以取出变量的地址

022dd08dec4d498881be43e50c4cc778.png

如上图,&a就可以将变量a的地址取出来,取出来的地址会是4个字节中地址较小的字节的地址

虽然整型变量占用了4个字节,但是只要我们知道了第一个字节的地址,顺藤摸瓜访问到4个字节的数据也是可以的



2.2 指针变量和解引用操作符

2.2.1指针变量

既然我们可以将地址取出来,那么有没有一种方式,可以将我们的地址存放起来,方便我们以后利用这个地址呢?

其实是有的,那就是我们的指针变量

指针变量是一种专门用来存放地址的变量

比如:

adc6d2dda78948b0858da31835c219a7.png

在这里,我们利用指针变量pb,将a的地址存放在pb中,这样以后我们想利用 a 的地址时,我们只需要利用 pb 就可以访问到a的地址


2.2.2 如何理解指针变量

5746588069e44c3d86ec14736175c62c.png

在指针变量 int * pb 中,*是在说明 pb 是一个指针,int 是在说明 pb 所指向的指针是整型类型的内容

*的位置并不重要,无论是int* pb,还是int *pb,在这里的意义都是等价的

指针变量pb,它的类型是 int* 类型,这就像 int  a 中 a 的类型是int,去掉变量名就是变量的类型


2.2.3 解引用操作符

在指针变量中,我们可以利用地址来进行变量内容的更改,这种更改就需要运用解引用操作符(*)

通过解引用操作符(*),我们就可以实现变量内容的更改

比如:

fd5662171eb14a8f87590c387b70728d.png

这里就通过解引用操作符,实现了 a 内容的更改

通过解引用操作符,*pb 就等于从 a 的较小字节的地址开始,进行4个字节的解析,进而得到 a 的全部内容

通过指针对a的修改,就多了一种修改内容的途径,写代码就会更加灵活


2.3 指针变量的大小

32位平台下地址是32个bit位,指针变量大小是4个字节

64位平台下地址是64个bit位,指针变量大小是8个字节

8c7774cc0fe948fdaae4247ad77a05c1.png7d511544a0f74b05b0aa4f5560823a3e.png

无论是哪种类型的指针类型,它们的字节在平台下都是一致的

结论:

指针变量的大小和类型是无关的,只要指针类型的变量在相同的平台下,大小都是相同的


3. 指针类型的意义

3.1指针的解引用

ef505acc848443c4886416d324ba4140.png170e532f4c0f46b091774a4c18023e6c.png

a4b08345b9784411b5c42be809225cf4.png1e6ec26b05674e0d880138ba2d56854d.png

调试后可以发现,上面的代码会将4个字节全部更改为0,而下面的代码只会将第一个字节更改为0

结论:指针的类型决定了,对指针解引用的时候有多大的权利(一次能操作几个字节)

比如对(char*)类型的解引用就操作了1个字节,对(int*)类型的解引用就操作了4个字节

4cebaa327a304558a67c7e30a20f5244.png

这里 a 的数值是287454020,pa存放的是a的地址,pb存放的也是a的地址

但是对 pa 解引用就会访问4个字节的内容,但对 pb 解引用就只会访问1个字节的内容

这是因为 pa 与 pb 的指针类型不同


3.2 指针+-整数

指针+-整数运行代码如下

2433c1a04d3e472fb6748c45faaa0f0d.pngb0928004ee8443ccb7a83ed0be1a6799.png

可以发现指针+-整数,得到的地址发生了改变

而不同类型的指针,+-整数所得到的地址,跳过的字节是不一样的

int*类型的指针变量+1或者-1都是跳过了4个字节,只不过+1是向前4个字节,-1是向后4个字节

char*类型的指针变量+1或者-1都是跳过了1个字节,只不过+1是向前1个字节,-1是向后1个字节

因此我们可以得出结论:

指针的类型决定了指针向前或者向后走一步有多大(距离 / 字节)

这里跳过的其实是n*sizeof(int)/ n*sizeof(char) ,这里n代表指针 +- 的整数(n)

通用公式为  n*sizeof(类型)


3.3 void*指针

当我们使用void指针时,通常是在实现函数功能时,所接受的地址不确定是什么类型的,有可能是int*类型,也有可能是char*类型,或者其他类型时,我们就会使用void*指针

比如:

54bfdaeb49c04ed5b09b6c3cd81c49a6.png

这时函数不确定接受的指针类型,就可以使用 void* 指针

void*指针是无法实现指针+-整数的,因为void是没有字节大小的,所以无法确定跳过几个字节

当我们想要void*指针+-整数时,系统就会报错,比如 :

2419f044d0eb4779b57dea94a03559f6.png

不过我们可以通过强制转化,间接实现指针+-整数,比如:

6e08750723244f2d9292bd56e6aea53b.png

可以看到即是是 void* 类型的指针,它也确实存进去了a的地址

将void*强制转化为int*,是可以实现指针+-整数的

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

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

相关文章

OpenGL实现3D游戏编程【连载5】——纹理坐标、纹理贴图

OpenGL实现3D游戏编程【连载5】——纹理坐标、纹理贴图 欢迎来到zhooyu的专栏。 个人主页:【zhooyu】 文章专栏:【OpenGL实现3D游戏编程】 本专栏内容: 我们从游戏的角度出发,用C去了解一下游戏中的功能都是怎么实现的。这一切还…

六、前后端分离通用权限系统(6)

🌻🌻 目录 一、用户管理1.1、代码生成器1.2、用户管理后端 CRUD1.2.1、controller1.2.2、service 接口1.2.3、service 接口实现1.2.4、mapper1.2.5、xml1.2.6、knife4j 测试 1.3、用户管理前端 CRUD1.3.1、添加路由1.3.2、定义基础 api1.3.3、实现页面功…

架构设计(5)服务网格(Service Mesh)

服务网格(Service Mesh)是一个专门设计的基础设施层,用于管理和处理微服务架构中服务间的通信。服务网格通过在服务间插入代理,提供了一种透明的方式来控制、监控和管理服务之间的流量。以下是关于服务网格的详细介绍,…

( 基于SystemView软件)AM调制与解调仿真实验

一、实验目的: 熟悉使用SystemView软件,了解各部分功能模块的操作和使用方法。 通过实验进一步观察、了解模拟信号AM调制、解调原理。 掌握AM调制信号的主要性能指标。 比较、理解AM调制的相干解调原理。 二、实验器材: 装有SystemView…

【有道云-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

WLAN网络优化,还得看这三剑客!

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 晚上好,我的网工朋友。 WLAN网络成为了企业网络接入的主要手段之一,用户对于WLAN网络的体验性也有了更高的要求。 对于W…

雷达水位监测站低功耗及免维护设计

QY-15雷达水位监测站采用非接触雷达,无磨损无污染产品概述 雷达水位监测站是一款高精度且具有水面波动滤波处理的地表水水位测量产品。它采用喇叭天线的设计,降低功耗,宽范围的输入电压,专门设计于适合野外无人值守的野外自动站应…

图像噪声与被污染图像的恢复

系列文章目录 文章目录 系列文章目录前言一、图像退化模型二、图像噪声2.2 图像噪声的分类2.2.1 加性噪声2.2.2 乘性噪声 三、图像噪声的概率密度函数3.1 高斯噪声3.2 瑞利噪声3.3 均匀分布噪声3.4 脉冲噪声3.5 图像信噪比 四、图像噪声的概率密度函数 前言 数字图像常会因受一…

Elasticsearch之DSL查询语法

​ 前言 在上一篇文章中,我们通过RestClient的Bulk操作导入了大量的hotel数据到elasticsearch,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。本篇文章会通过使用DSL来介绍elasticsearch的搜索功能。 1. DSL查询分…

C++ 类和对象 3

构造函数扩展 构造函数体内的赋值:构造函数一般是用于类对象的初始化的,但严谨来说并不是成员变量的初始化,内置类型的初始化是在生成的同时赋值而且仅有一次,但是在构造函数体内是能对成员变量进行多次赋值的。所以在函数体内的…

GeoStudio2024:地质工程的瑰宝下载安装介绍

引言 青山隐隐,流水潺潺,吾心所向,乃地质之奥秘。GeoStudio2024,如同一卷古籍,蕴藏无尽智慧,助吾等探寻地质之真谛。今以李白之笔,述其妙用,愿与君共赏。 初识GeoStudio2024 初见…

优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策

Web层缓存对于提高应用性能至关重要,它通过减少重复的数据处理和数据库查询来加快响应时间。例如,如果一个用户请求的数据已经缓存,服务器可以直接从缓存中返回结果,避免了每次请求都进行复杂的计算或数据库查询。这不仅提高了应用…

【iOS】iOS中简单的网络请求

目录 前言认识API和RULAPIURL两者的联系 简单的网络请求1. 创建URL对象2. 创建URLRequest对象3. 设置请求头(如果需要)4. 发送请求异步请求同步请求 5. 处理请求结果6.启动数据任务完整代码示例及运行结果: 关于同步请求和异步请求同步请求异…

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…

MySQL(五)——表设计(约束、范式、表关系)

文章目录 表设计约束非空约束&#xff08;NOT NULL&#xff09;唯一约束&#xff08;UNIQUE&#xff09;主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;默认值约束&#xff08;DEFAULT&#xff09;检查约束&#xff08;CHECK&#x…

考研数学最迟什么时候要结束强化?10月才做真题是不是晚了?

已经快9月了&#xff0c;很多同学的考研数学的强化也接近尾声&#xff0c;这个时候要注意两个事情&#xff1a; 1、如果你还有很多没学完&#xff0c;不要强行收尾&#xff0c;稳扎稳打的把强化给结束了。 2、强化结束之前&#xff0c;要清理完所有在强化阶段产生的错题&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

应用层与传输层

1.应用层 很多时候这一层的协议是程序员自定义的应用层协议&#xff08;相当于一种约定&#xff0c;约定数据如何进行传输&#xff09;。 eg&#xff1a; 实现登录的场景&#xff1a; 此时前端就需要与后端约定请求&#xff08;假设约定使用ajax请求&#xff09;中的一些参…

接口自动化测试面试题目详解

1、get和post区别是什么&#xff1f; 答&#xff1a;POST和GET都是向服务器提交数据&#xff0c;并且都会从服务器获取数据。 区别&#xff1a; &#xff08;1&#xff09;传送方式&#xff1a;get通过地址栏传输&#xff0c;post通过报文传输 &#xff08;2&#xff09;传…

c语言 自定义类型--枚举 、联合 #枚举类型的定义 #枚举的优点 #枚举的使用 #联合类型的定义 #联合的特点 #联合大小的计算

文章目录 前言 一、枚举 (一)、枚举类型的定义 (二)、枚举的优点 (三)、枚举的使用 二、联合 (一)、联合类型的定义 (二)、联合的特点 (三)、联合大小的计算 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 枚举、联合跟结构体很像&#xff0c;想要细致地了…