C语言指针学习的第一天
指针是C语言的灵魂也是其最强大、最灵活的特性之一。理解指针是掌握C语言编程的关键一步。本文将带你系统性地学习指针从基础概念到高级应用助你彻底征服这个“C语言最难的部分”。一、指针的重要性与功能1. 为什么需要指针指针之所以成为C语言的核心主要因为它提供了以下不可替代的能力直接内存操作指针允许程序直接访问和操作计算机的物理内存地址这是许多底层系统编程如操作系统、驱动程序的基础。高效的数据传递传递指针地址而非整个数据副本极大提升了函数调用和数据处理的效率尤其在处理大型结构体或数组时。动态内存管理通过指针程序可以在运行时动态地申请和释放内存malloc,free实现灵活的数据结构如链表、树。实现复杂数据结构指针是构建链表、二叉树、图等动态数据结构的基础。函数回调与多态通过函数指针可以实现回调机制和一定程度的运行时多态。2. 指针带来的优势代码更加简洁高效避免不必要的数据拷贝提升程序性能。可以直接操作内存空间实现对硬件、操作系统接口的直接交互。二、指针基础概念1. 地址 (Address)计算机内存被划分为无数个连续的字节Byte单元。为了精确找到每个字节系统为每个字节分配一个唯一的编号这个编号就是内存地址。内存寻址范围在64位系统中内存地址空间极大理论上从0x0000000000000000到0xFFFFFFFFFFFFFFFF。地址的本质一个无符号的整数值通常用十六进制表示如0x7ffeebd29a8c。2. 指针 (Pointer)地址等价于指针指针等价于地址。指针就是内存地址的另一种称呼。但指针比单纯的地址多了一个关键属性类型。指针的类型决定了通过这个指针访问内存时一次读写操作所涉及的内存字节大小以及对数据的解释方式。例如一个int *类型的指针告诉编译器“我指向的内存区域存放的是一个int型数据”。当解引用该指针时编译器知道要读取4个字节假设int为4字节并按整数格式解释。3. 指针变量专门用来存放内存地址的变量日常交流中简称为“指针”。intnum10;int*p;// p 是一个指针变量用于存放一个int类型变量的地址pnum;// 将变量num的地址存入指针变量p中三、指针的两个核心运算符1.取地址运算符 (Address-of Operator)作用获取一个变量的内存首地址。操作对象只能是左值即可以出现在赋值号左边的实体如变量。常量如5或表达式如ab不能取地址。类型升级变量的结果类型是“指向该变量类型的指针”。例如numnum为int的类型是int *。intnum0;int*p_numnum;// 获取num的内存首地址并赋值给指针变量p_numprintf(变量num的地址是%p\n,(void*)num);2.*取值运算符/解引用运算符 (Dereference Operator)作用取出指针所指向的内存地址中存储的数据。操作对象只能用于指针类型。类型降级*指针的结果类型是指针所指向的类型。例如*p_nump_num为int *的类型是int。可作为左值*指针不仅可以读取值还可以被赋值从而修改其指向的内存内容。intnum0;int*pnum;*p100;// 通过解引用将num的值修改为100printf(num %d\n,num);// 输出num 100printf(*p %d\n,*p);// 输出*p 100四、指针变量的定义与特性1. 定义语法数据类型 *变量名;int*p;// 定义一个指向int类型的指针变量pchar*ch_p;// 定义一个指向char类型的指针变量ch_pfloat*f_p;// 定义一个指向float类型的指针变量f_pdouble*d_p;// 定义一个指向double类型的指针变量d_p// 同时定义多个指针变量每个变量前都需要*int*p1,*p2,*p3;// p1, p2, p3 都是 int * 类型int*p,q;// p 是 int * 类型q 是 int 类型注意区别2. 指针变量的大小所有指针变量在当前系统中占用的内存大小是相同的与其指向的数据类型无关。这个大小由系统的寻址能力决定32位系统指针通常为4字节。64位系统指针通常为8字节。printf(sizeof(int*) %zu\n,sizeof(int*));// 输出 8 (64位系统)printf(sizeof(char*) %zu\n,sizeof(char*));// 输出 8printf(sizeof(void*) %zu\n,sizeof(void*));// 输出 83. 特殊指针a) 野指针 (Wild Pointer)指向不可知或已无效内存区域的指针。成因指针变量未初始化。指针指向的内存已被释放free但指针未置空。危害访问野指针指向的内存是未定义行为可能导致程序崩溃、数据损坏或安全漏洞。预防定义指针时立即初始化为NULL。b) 空指针 NULL一个特殊的指针值表示“不指向任何对象”。在C语言中通常用宏NULL定义其值为0地址0x0。特性0x0地址通常受操作系统保护不允许读写。解引用空指针会导致程序崩溃段错误。用途作为指针的初始值或用于判断指针是否有效。int*pNULL;// 良好的初始化习惯if(p!NULL){*p10;// 安全操作}else{printf(指针为空不能解引用\n);}五、指针类型与操作含义指针定义含义int *p指针p指向一块用于存放int类型数据的内存空间。char *p指针p指向一块用于存放char类型数据的内存空间。float *p指针p指向一块用于存放float类型数据的内存空间。double *p指针p指向一块用于存放double类型数据的内存空间。核心区分两个操作操作指针本身 (p)修改的是指针变量里存储的地址值。inta1,b2;int*pa;pb;// 操作指针本身让p改为指向变量b操作指针指向的内存 (*p)修改的是指针所指向的内存空间里存储的数据值。inta1;int*pa;*p99;// 操作指向的内存将变量a的值改为99六、指针的算术运算指针的加减运算以所指向类型的大小为基本单位进行移动。/--(自增/自减)指针向高/低地址方向移动**一个“元素”**的距离。intarr[3]{10,20,30};int*parr;// p 指向 arr[0]p;// p 现在指向 arr[1] (地址增加了 sizeof(int) 字节)printf(%d\n,*p);// 输出 20 n/- n指针向前或向后移动 n 个元素。int*parr;int*qp2;// q 指向 arr[2]printf(%d\n,*q);// 输出 30*p运算符优先级后缀优先级高于*。*p等价于*(p)即先取p当前指向的值再将p向后移动一个元素。intarr[]{1,2,3};int*parr;intvalue*p;// value 1, 然后 p 指向 arr[1]指针相减两个同类型指针相减结果是它们之间相隔的元素个数而不是字节数。intarr[10];int*parr[2];int*qarr[8];ptrdiff_tdiffq-p;// diff 6 (中间相隔6个int元素)七、指针基础操作示例#includestdio.hintmain(){inta100;intb200;int*pa;// p 指向 aint*qb;// q 指向 bprintf(初始状态: a%d, b%d, *p%d, *q%d\n,a,b,*p,*q);// 1. 修改指针存储的地址让 p 指向 bpb;printf(操作1 (pb)后: *p%d (现在是b的值)\n,*p);// 2. 指针赋值将 q 中存储的地址拷贝给 p (两者现在都指向b)pq;// 等价于 p b;printf(操作2 (pq)后: *p%d, *q%d\n,*p,*q);// 3. 给 p 指向的空间赋值 (即修改 b 的值)*p999;printf(操作3 (*p999)后: b%d, *p%d, *q%d\n,b,*p,*q);// 4. 将 q 指向的值拷贝到 p 指向的空间 (本例中p和q指向同一处无变化)// 假设我们让p重新指向apa;*p*q;// 将 b 的值(999) 赋给 aprintf(操作4 (*p*q)后: a%d, b%d\n,a,b);return0;}八、指针作为函数参数1. 值传递 (Pass by Value)函数接收参数的一份拷贝。函数内部对形参的修改不会影响外部的实参。voidswap_by_value(intx,inty){inttempx;xy;ytemp;}intmain(){inta5,b10;swap_by_value(a,b);printf(a%d, b%d\n,a,b);// 输出 a5, b10未交换}2. 地址传递/指针传递 (Pass by Pointer/Address)将变量的地址传入函数。函数通过指针地址直接操作原始变量。优势允许函数修改外部多个变量实现“多返回值”效果。本质传递的仍然是值地址值但由于获得了地址从而获得了修改该地址处数据的“权限”。voidswap_by_pointer(int*px,int*py){inttemp*px;// 解引用获取px指向的值(a)*px*py;// 将py指向的值(b)赋给px指向的内存(a)*pytemp;// 将temp赋给py指向的内存(b)}intmain(){inta5,b10;swap_by_pointer(a,b);// 传入地址printf(a%d, b%d\n,a,b);// 输出 a10, b5成功交换}九、一维数组与指针的关系在C语言中数组名在大多数情况下会被编译器转换为指向其首元素的指针常量。intarr[5]{1,2,3,4,5};int*parr;// 等价于 int *p arr[0];核心等价关系对于数组访问arr[n]以下四种写法完全等价arr[n]// 数组下标法*(arr n)// 指针算术解引用法*(p n)// 通过指针变量p[n]// 指针下标法printf(%d\n,arr[2]);// 3printf(%d\n,*(arr2));// 3printf(%d\n,*(p2));// 3printf(%d\n,p[2]);// 3重要注意事项数组名是指针常量arr的值首地址不能改变arr some_other_var;是错误的。两个例外数组名不代表指针sizeof(arr)返回的是整个数组占用的字节大小如5 * sizeof(int)而不是指针大小。arr得到的是“指向整个数组的指针”其类型是int (*)[5]与int *不同。arr 1会跳过整个数组。十、一维数组作为函数参数当数组作为函数参数传递时它退化为指向其首元素的指针。因此以下三种函数声明是等价的// 写法1数组形式最直观但长度信息已丢失voidprintArray(intarray[],intlen){for(inti0;ilen;i)printf(%d ,array[i]);}// 写法2指定数组容量编译器忽略无实际约束作用voidprintArray(intarray[5],intlen){// 这里的5会被忽略for(inti0;ilen;i)printf(%d ,array[i]);}// 写法3标准指针形式最本质推荐voidprintArray(int*parray,intlen){for(inti0;ilen;i)printf(%d ,parray[i]);// 仍可用下标}调用方式intmain(){intmyArr[5]{1,2,3,4,5};printArray(myArr,5);// 传递数组名即首地址return0;}关键点函数内对数组元素的修改如parray[i] 10;会直接作用于外部的原始数组因为操作的是同一块内存。总结指针是C语言赋予程序员的“内存地图”和“遥控器”。初学可能感到畏惧但理解其“地址-类型-解引用”的核心逻辑后便能体会到其带来的强大控制力与效率。掌握指针是迈向C语言高手之路的必经关卡。后续我们将深入探讨指针与字符串、多级指针、指针数组、动态内存分配等高级主题。练习建议多写代码使用调试器观察指针变量的地址和值的变化画出内存示意图是理解指针最有效的方法。

相关新闻

MP4Box.js:浏览器端MP4处理的革命性突破

MP4Box.js:浏览器端MP4处理的革命性突破

MP4Box.js:浏览器端MP4处理的革命性突破 【免费下载链接】mp4box.js JavaScript version of GPACs MP4Box tool 项目地址: https://gitcode.com/gh_mirrors/mp/mp4box.js 在前端开发领域,处理多媒体文件一直是个技术挑战——服务器端依赖、网络传…

2026/8/1 5:23:56阅读更多 →
毕业论文终检前夕,如何快速搞定高重灾区与AI嫌疑句?

毕业论文终检前夕,如何快速搞定高重灾区与AI嫌疑句?

毕业论文终检前夕的 48 小时,大概是每个毕业生最焦虑、最折磨的生死关头。学校的通知往往来得很突然,要求在规定时间内提交最终的查重与 AIGC 检测报告,并且增加了严苛的 AIGC 检测红线指标。很多同学看着手里红红绿绿、查重率和 AI 率双双超…

2026/8/1 5:23:56阅读更多 →
LLM 代码生成评测基准:如何科学比较编程助手

LLM 代码生成评测基准:如何科学比较编程助手

LLM 代码生成评测基准:如何科学比较编程助手 一、选型不能靠体感投票 团队要选 AI 编程助手,最容易滑向"谁用着顺手选谁"。但顺手是主观的,场景是多样的。今天写脚本顺手,明天改复杂类型可能翻车。 科学的选型需要基…

2026/8/1 5:21:56阅读更多 →
除了WPS自带的模板,还有没有别的插件能提供更多好看的PPT模板?

除了WPS自带的模板,还有没有别的插件能提供更多好看的PPT模板?

周三下午组长过来说:明早客户到,把方案做成 PPT。内容我有,Word 里写得明白,可要把一堆文字变成能见人的 PPT,我只剩大半个下午。WPS 自带那几套模板翻来翻去,要么太花、要么套进去不搭。那天是靠不坑盒子救…

2026/8/1 6:28:23阅读更多 →
换季鼻炎难受,别硬扛 科学营养养护改善反复发作

换季鼻炎难受,别硬扛 科学营养养护改善反复发作

换季鼻炎难受,别硬扛,很多人每到春秋换季都会被鼻痒、阵发性打喷嚏、流清涕、鼻塞等问题反复折磨,不少人要么选择硬扛发作期,要么只依赖药物临时缓解症状,却忽略了从鼻腔黏膜修护和机体免疫调节层面进行长期养护&#…

2026/8/1 6:28:23阅读更多 →
深入解析Adafruit_NeoPixel库:从时序原理到实战避坑指南

深入解析Adafruit_NeoPixel库:从时序原理到实战避坑指南

1. 从点亮第一颗灯珠到玩转灯带:为什么你需要吃透Adafruit_NeoPixel库 如果你玩过WS2812B、SK6812这类智能RGB灯带或灯环,那你大概率听说过Adafruit_NeoPixel这个库。它几乎是Arduino生态下控制这类可寻址LED的“标准答案”。很多新手拿到灯带&#xff0…

2026/8/1 6:28:23阅读更多 →
若依前后端分离部署Nginx代理配置详解:解决401认证失败与验证码加载问题

若依前后端分离部署Nginx代理配置详解:解决401认证失败与验证码加载问题

1. 问题现象与根源初探最近在部署若依前后端分离系统时,踩了一个典型的坑:前端页面能打开,但验证码图片死活加载不出来,浏览器开发者工具里报一个/prod-api/captchaImage接口401认证失败的错误。当你硬着头皮输入账号密码点登录&a…

2026/8/1 6:28:22阅读更多 →
如何在移动端实现快速目标检测:MobileNet-Yolo完整指南 [特殊字符]

如何在移动端实现快速目标检测:MobileNet-Yolo完整指南 [特殊字符]

如何在移动端实现快速目标检测:MobileNet-Yolo完整指南 🚀 【免费下载链接】MobileNet-Yolo MobileNetV2-YoloV3-Nano: 0.5BFlops 3MB HUAWEI P40: 6ms/img, YoloFace-500k:0.1Bflops 420KB:fire::fire::fire: 项目地址: https://gitcode.com/gh_mirro…

2026/8/1 6:28:22阅读更多 →
UE5蓝图可视化脚本:零代码实现螺旋桨旋转动画与物理逻辑详解

UE5蓝图可视化脚本:零代码实现螺旋桨旋转动画与物理逻辑详解

1. 项目概述:从死记硬背到可视化创造每次看到别人在虚幻引擎5(UE5)里做出酷炫的动态效果,自己却只能对着代码望而却步,或者死记硬背一堆自己也不理解的节点连接,是不是感觉特别挫败?尤其是像螺旋…

2026/8/1 6:26:21阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →