C语言复习:深入理解指针(1)
一、内存与地址1.内存CPU处理数据需要从内存中读取数据处理后的数据也会放到内存之中我们买的电脑都是16GB/32GB 那我们内存该如何管理这些数据呢内存分为了一个个的内存单元每个内存单元的大小都为1个字节我们需要对内存空间有一定的概念其中1 byte 8 bite1个比特对应着1个二进制位1个字节对应着8个二进制位我们该如何快速的理解地址呢我们注意内存单元是以字节形式累积的打个比方每个内存单元即字节相当于一个学生宿舍8个比特位就相当于是宿舍里住着8名学生每个内存单元也有自己的编号这个编号就相当于宿舍的门牌号方便CPU快速的找到内存空间在计算机中我们把内存单元编号称作地址C语言中给地址起了个新的名称叫指针我们看这些地址时是不是有些头大为什么是0XFFFFFFFFF的形式其实为了方便存储更大的数字以十六进制编号编号的前两个数字0X说明是十六进制。我们可以发现编号是以0X00000000形式存储的一个十六进制位可以换算成四个二进制位所以0X00000000换算成了32个二进制位换算成4个字节但如果要是用4个字节去存1个字节的数据的话未免太浪费了为了避免这些不必要的浪费计算机并没对这些编号进行存储管理而是通过编址的形式接下来我们将讨论编址的原理2.编址的计算机底层原理我们先弄清楚此通信的原理CPU下达一个命令比如说READ 0x00001001先通过控制总线传达READ读取指令再通过地址总线 到达编号为0x00001001的地址假如这个地址指向的是数据2数据2再通过数据总线传递给CPU这就完成了硬件之间的相互协同。那为什么可以通过地址总线精确到每一个地址呢那生活举例吉他里每一个弦发什么音都是固定的吉他上并没有写具体音符在哪个位置但制造商再设计乐器时已经约定好了本质成为了共识硬件32位机器32根地址总线每一根地址总线只有两态0 和 1 一根地址总线有两种含义那么32根地址总线就有2^32种含义 每一种含义就对应每一个地址地址信息下达给内存内存再数据通过数据总线传达给CPU的寄存器。、二、指针变量和取址10的二进制表示为00000000 00000000 00000000 00001010 为什么是有32位因为一个整数是四个字节有32个二进制位比特位10用十六进制表示为0x00 00 00 0a我们知道计算机内部内存是用0和1存储的但为什么内存的地址和数据会以十六进制的形式显示出来极高压缩率缩率节省屏幕空间一个原本需要 32 位长、顶满屏幕的二进制数用十六进制写出来只需要 8 个字符例如 0x000010101.取地址操作符#includestdio.h int main() { int a 10 ; printf(%d\n,a); }a占用四个字节每个字节都占有地址但是a肯定不能去用四个地址a的地址就是第一个字节的第一个地址我们只要知道了第⼀个字节地址顺藤摸瓜访问到4个字节的数据也是可行的。2.指针变量和解引用操作符*2.1指针变量我们通过取地址得到的数值需要存起来存在哪里呢存在的地方就叫指针变量存放指针变量的值会被称为地址#includestdio.h int main() { int a 10 ; int *p a; printf(%d\n,a); }p代表的是指针变量2.2如何拆解指针类型呢p的类型叫int * * 表示p是指针变量int表示指向的对象类型是int2.3解引用操作符我们把指针保存到指针变量里去以后肯定要用到那未来怎么用呢这就用到解引用操作符了2.4指针变量的大小指针变量的大小取决于存放的是什么因为存放的是地址所以需要考虑地址存放需要多大空间一个地址变量的大小是多少32位机器上地址是32个比特位指针变量需要4个字节的空间来存储。编译器上是X64表示64位机器上地址是64个比特位指针变量需要8个字节的空间来存储。编译器上是X86表示但是指针变量的大小和指针变量的类型无关指针永远都是那么长与其他无关32位机器和64位机器地址长度也有所区别三.指针变量类型的意义3.1指针的解引用结论指针的类型决定了对指针解引用的时候有多大的权限一次能操作多少字节。比如char*的指针解引用就只能访问一个字节int*的解引用可以访问四个字节int*类型char*类型那不同类型指针的解引用有什么意义呢假设我们想要想向后访问4个字节的数据就用int *想要向后访问一个字节的数据就用char*3.2指针加减整数结论指针的类型决定了指针向前或向后一步走了多大的距离char类型指针1指针变量向后走一个字节int类型指针1 指针变量向后走四个字节3.3 void*指针void*是一种特殊的指针void是什么意思void是空的意思我们可以理解为无具体类型的指针泛形指针它可以接受任意类型的指针就好比一个垃圾桶bushi可以接受所有瓶瓶罐罐的东西。但是他也有局限性void*指针不能进行解引用为什么不能呢因为它太能“容”了可以放int char …………把放在这个“容器”里面的这个“垃圾”掏出来它也不知道这个是什么类型的数据或者说它根本没有识别类型的功能。更不要说指针的解引用时的操作权限字节了因此它也没有指数加减整数的功能那么void指针有什么用呢一般void*指针使用在函数参数的部分用来接收不同类型的数据使得一个函数来处理多种类型的数据实现泛型编程。4.指针运算4.1指针-整数因为数组在内存中是连续存放的只要知道第一个元素的地址顺藤摸瓜就能找到所有元素的地址//int main() { // //int a 10 ; // //int *p a; // //printf(%d\n,a); // int a[10]{1,2,3,4,5,6,7,8,9,10}; // int * pa[0]; // for (int i 0;i 9;i) { // printf(%d ,*(p i)); // } //}int main() { int a[10]{1,2,3,4,5,6,7,8,9,10}; int * pa[0]; for (int i 0;i 9;i) { printf(%d ,*p); p; } }有两种方法第一种是p不动i变化第二种是p自己移动4.2指针-指针举个例子在生活中我们会日期加减掉天数得到别的日期也有日期减日期得到天数但是日期减去日期没意义同理指针加减整数得到别的指针指针减指针也能得到整数指针加指针却没有意义int main() { int a[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p a[0]; printf(%d\n,a[9]-a[0]); }指针减指针得到的是之间相隔的元素数而不是相差的字节数。C 语言中的指针减法规则当两个相同类型的指针相减时编译器会自动将“物理字节差”除以“指针所指向类型的大小sizeof”。其计算公式可以理解为指针之差物理地址差指针指向类型的大小36 字节sizeof(int)3649指针之差指针指向类型的大小物理地址差​sizeof(int)36 字节​436​9前提两个指针指向同一块空间数组名是数组首元素的地址自己设置一个函数代替strlen函数用到指针减去指针my_strlen(char* p) { char* start p; while (*p ! \0) p; return p - start ; } int main() { char arr[]abcdef; //[a b c d e f \0] size_t len my_strlen(arr); printf(%zu\n,len); }4.3指针关系运算指针就是地址地址就是编号编号就是数值#include stdio.h int main() { int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p arr[0]; int sz sizeof(arr)/sizeof(arr[0]); while(p arr sz) { printf(%d , *p); p; } return 0; }

相关新闻

免费风扇控制软件FanControl怎么用?3步接管CPU、显卡与机箱风扇的调速权

免费风扇控制软件FanControl怎么用?3步接管CPU、显卡与机箱风扇的调速权

免费风扇控制软件FanControl怎么用?3步接管CPU、显卡与机箱风扇的调速权 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/G…

2026/10/18 4:07:26 阅读更多 →
ST电机库学习记录——配置MC—WorkBench + CuBeMX配置MT6701磁位置传感器

ST电机库学习记录——配置MC—WorkBench + CuBeMX配置MT6701磁位置传感器

选择板卡和驱动电机(电机参数需要自行对照调节)配置一览为了方便测试配置开环调试 串口波特率选择115200配置CuBeMX配置spi读取mt6701配置MISO和CLK配置FOC_L_CS引脚配置LED灯与电机控制引脚(个人配置)Keil5代码移植mian.c/.h中//…

2026/10/18 4:07:34 阅读更多 →
多层板SI信号完整性仿真,深度解析高速信号仿真逻辑

多层板SI信号完整性仿真,深度解析高速信号仿真逻辑

多层板信号完整性 SI 仿真,是高速 PCB 仿真中应用最广泛的模块。很多工程师遇到 DDR 读写出错、高速接口间歇性断连,反复调整上拉电阻、更换芯片,问题依旧存在,根源往往是多层板互连带来的信号反射、串扰、时延偏差。多层板内层带…

2026/10/18 4:08:04 阅读更多 →

最新新闻

随机密码生成器Docker化部署实战:Python Flask与secrets模块

随机密码生成器Docker化部署实战:Python Flask与secrets模块

随机密码生成器这种东西,说实话实现起来并没什么高深算法,但真正到了要部署、要稳定跑起来、要让团队成员顺手用的时候,坑还挺多。最近我把一套随机密码生成器做了Docker化部署,作为内部小工具挂在服务器上,整个过程走…

2026/10/19 5:21:18 阅读更多 →
Spark音乐推荐系统设计与实现:标签画像+ALS混合推荐

Spark音乐推荐系统设计与实现:标签画像+ALS混合推荐

最近被问到最多的一个项目,就是代号 J001S 的“基于 Spark 的音乐推荐系统设计与实现”。这题目一看就是典型的毕业设计/课程设计,但说实话,能把这个题目做出彩的人并不多。核心玩法其实很清晰:歌曲标签加用户画像,再叠…

2026/10/19 5:21:18 阅读更多 →
具身智能的拜师礼:从数据采集到机器人学徒的产业叩问

具身智能的拜师礼:从数据采集到机器人学徒的产业叩问

活动还没开始,场外的自由讨论区就已经吵成了一片。有人围着一条机械臂反复看末端夹爪的开合精度,有人对着投影上的遥操作界面讨论延迟数字,还有人干脆蹲在角落里,拿着笔记本飞速记着什么。我当时站在人群里,听到最频繁…

2026/10/19 5:21:18 阅读更多 →
Kafka生产环境部署与配置避坑指南

Kafka生产环境部署与配置避坑指南

1. 这不是“装个软件”那么简单:Kafka部署背后的真实战场你点开一篇叫《Kafka 的安装、管理和配置》的教程,心里想的可能是:“哦,下载、解压、改几个配置、启动服务——十分钟搞定”。我试过无数次,也带过不少刚接触消…

2026/10/19 5:21:18 阅读更多 →
千元机生态之争:畅享90 Pro Max开售背后的鸿蒙下沉逻辑

千元机生态之争:畅享90 Pro Max开售背后的鸿蒙下沉逻辑

千元档手机市场这几年其实很微妙。过去大家拼的是“跑分高不高、像素大不大、电池够不够”,但最近风向明显变了,越来越多的新机开始把“系统生态”“跨端互联”“全家桶体验”当成核心卖点。畅享90 Pro Max正式开售的消息之所以引发关注,不只…

2026/10/19 5:21:18 阅读更多 →
矩阵分解推荐系统实战:从协同过滤到SGD梯度下降原理与实现

矩阵分解推荐系统实战:从协同过滤到SGD梯度下降原理与实现

如果把推荐系统相关的经典论文排个"被引用最多、被误读也最多"的榜单,这篇《Matrix Factorization Techniques for Recommender Systems》绝对能进前三。我第一次读它的时候刚被各种协同过滤公式折磨完,看完第一反应是:就这么简单&…

2026/10/19 5:20:17 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →