从零理解 C 指针:内存、地址、运算全梳理

张开发
2026/4/14 20:28:27 15 分钟阅读

分享文章

从零理解 C 指针:内存、地址、运算全梳理
C语言指针1一.内存和地址1.1内存是什么1.2计算机存储单位1.3地址 指针二.计算机编址原理三.指针变量和地址3.1取地址操作符 3.2指针变量3.3指针类型拆解3.4解引用操作符 *四.指针变量的大小五.指针变量类型的意义5.1解引用权限5.2指针 - 整数步长5.3void* 泛型指针六.指针三大运算6.1指针 - 整数6.2指针 - 指针6.3指针关系运算七.本文总结必背接下来为 C 语言指针系列第一篇从零拆解内存编址、指针本质、指针类型意义与核心运算适合新手小白入门到进阶系统学习。前言指针是 C 语言的灵魂也是很多初学者的难点。只有真正理解内存 — 地址 — 指针的关系才能写出高效、灵活的 C 代码。本文从最基础的内存与地址讲起带你一步步吃透指针核心概念。一.内存和地址1.1内存是什么例如生活中宿舍楼给房间编号就能快速找到目标计算机管理内存也是同样逻辑。CPU 处理数据时必须从内存读取数据处理完再写回内存。内存被划分为一个个内存单元每个内存单元大小 1 字节Byte。1.2计算机存储单位1Byte8bit1KB1024Byte1MB1024KB1GB1024MB1TB1024GB1PB1024TB1.3地址 指针每个内存单元都有唯一编号那这个编号就是内存单元编号 地址 指针有了地址CPU 就能快速定位内存空间。二.计算机编址原理大概了解一下即可没有深究的必要CPU 与内存通过地址总线通信原理32 位机器32 根地址总线 → 可表示 2^32 个地址 → 地址占4字节64 位机器64根地址总线 → 可表示 2^64 个地址 → 地址占8字节三.指针变量和地址3.1取地址操作符 创建变量 向内存申请空间。用可以取出变量的起始地址低地址字节如下所示#includestdio.hintmain(){inta10;printf(%p\n,a);//打印变量a的地址return0;}运行结果3.2指针变量那么地址是一个数值需要专门变量存放这种变量叫指针变量。inta10;int*paa;//pa是指针变量存储a的地址3.3指针类型拆解根据上面给的int* pa我们对它进行拆解int*pa 类型 指针变量名*说明这是指针变量int说明指针指向int 类型数据同理char*、double*、float*3.4解引用操作符 *通过指针找到并操作目标变量使用解引用*。如下所示#includestdio.hintmain(){inta100;int*paa;*pa0;//等价于a 0;printf(%d\n,a);return0;}运行结果由此我们可以得知*pa就是a本身。四.指针变量的大小结论指针大小只与平台有关与类型无关32 位平台所有指针都是 4 字节64 位平台所有指针都是 8 字节如下所示#includestdio.hintmain(){printf(%zd\n,sizeof(char*));printf(%zd\n,sizeof(short*));printf(%zd\n,sizeof(int*));printf(%zd\n,sizeof(double*));return0;}运行结果这是在 x64 环境下运行的结果如果换成 x86 环境下运行结果又会有所不同如下图所示五.指针变量类型的意义类型不影响大小但决定两件事解引用能操作多少字节指针 ±1 能走多远5.1解引用权限举例int*解引用操作4个字节#includestdio.hintmain(){inta0x11223344;int*paa;*pa0;//4字节全改为0return0;}同理char*解引用只操作一个字节只改第一个字节5.2指针 ± 整数步长char*1--跳过1字节int*1--跳过4字节double*1--跳过8字节指针 -1 跳过一个指向类型的大小5.3void* 泛型指针可以接收任意类型地址无警告不能直接解引用不能直接 ± 整数void*泛型指针常用于函数参数实现泛型编程void*paa;//合理//*pa 10;//不合理非法间接寻址六.指针三大运算6.1指针 ± 整数遍历数组最常用方式#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};int*parr;for(inti0;i10;i){printf(%d ,*(pi));}return0;}6.2指针 - 指针必须指向同一块内存结果为中间元素个数。手写 strlen函数intmy_strlen(char*s){char*ps;while(*p)p;returnp-s;}6.3指针关系运算指针可以比较大小!常用于遍历。如下所示while(parr10){printf(%d ,*p);}七.本文总结必背内存编号 地址 指针取地址*解引用32 位指针 4 字节64 位指针 8 字节指针类型决定解引用权限 步长指针三大运算± 整数、- 指针、关系比较如果你觉得本篇对你有帮助欢迎点赞、收藏、关注我会持续更新 C 语言硬核干货

更多文章