4-1 指针

发布时间:2026/10/16 12:20:23

4-1 指针 4-1 指针⏱本节预计用时30分钟在讲数组那一节我们对指针做了简单的介绍数组传参传的不是复制品而是存首元素地址的变量也就是指针。指针就是存地址的变量就是这么简单。指针的语法比较绕但我相信学完这一讲你能够看懂大部分使用指针的代码另外的就是熟练度问题了。1 两个符号 和 *1.1—— 取地址每个变量在内存里都有个门牌号之前我们把变量比作格子现在比作房子也就是地址。用变量名就能查到它的数字编号是多少#includestdio.hintmain(){intx42;printf(x 的值%d\n,x);// 42printf(x 的地址%p\n,x);// 0x7ffd...0x开头表示十六进制数// %p 是专门打印地址的格式符。return0;}运行情况每次运行输出地址可能不一样这是因为运行结束之后房子被系统回收了下次它再分配的可能不一样。1.2 声明指针变量声明时在变量名前加个*intx42;int*px;// p 是一张小纸条记下了 x 的门牌号第一次看基本必懵逼别怕继续用房子来想x是一栋房子里面住着42x是这栋房子的门牌号一串地址数字int *p x;的意思是再造一个格子p这个格子专门用来装门牌号现在把x的门牌号塞进去。所以p里装的数字和x完全一样——p就是存着 x 门牌号的那个格子。打个比方x是房子x是门牌号p就是那张记着门牌号的小纸条。在1.1的示例里加入int *p x;printf(x 的地址%p\n, p);#include stdio.h int main() { int x 42; int *p x; printf(x 的值%d\n, x); printf(x 的地址%p\n, x); printf(x 的地址%p\n, p); return 0; }运行情况1.3*—— 解引用*p的意思是顺着纸条找到 x 的房子看里面的住户。不光能看还能改intx42;int*px;printf(%d\n,*p);// 42 —— 看房子的住户*p100;// 把 x 房的值改成 100printf(%d\n,x);// 100 —— x 真被改了所以指针的全部就两件事取地址问门牌号*解引用顺着门牌号找到房子看或改里面的值这里有一个容易乱的点*在1.2是声明用的意思是我要造一个装地址的指针变量和这里的顺着地址去查变量不一样。在1.2的示例里加入printf(x 的值%d\n, *p);#include stdio.h int main() { int x 42; int *p x; printf(x 的值%d\n, x); printf(x 的地址%p\n, x); printf(x 的地址%p\n, p); printf(x 的值%d\n, *p); return 0; }运行情况1.4 野指针 和 NULL野指针就是声明了、却没给它一个明确地址的指针。它里面装着的是一个随机的垃圾编号你根本不知道它指向哪int*p;// p 里是垃圾值野指针*p42;// 顺着一个随机编号去写 42程序很可能崩溃就像你手里有张空白纸条却硬要按上面的门牌号去找房子——大概率走错门甚至闯进别人家。解决办法声明时先把它指向空。C 里用NULL表示这个指针现在谁都不指int*pNULL;// 明确告诉编译器p 现在谁都不指if(p!NULL){// 安全习惯用它之前先问一句你指着没*p42;}NULL就是一个特殊值等于 0意思是空、没有指向。声明指针时赋NULL不给它留下垃圾编号的机会解引用前先判断NULL确认它真的指着东西再动手2 一张图弄清楚地址: 0x100 0x104 0x108 ┌─────────┬─────────┬─────────┐ │ 42 │ │ 0x100 │ └─────────┴─────────┴─────────┘ x p 住户42 记着0x100x住在0x100里面是42p住在0x108里面是0x100就是 x 的门牌号*p 看地址0x100那房子的住户 42*p 100 把0x100那房子改写成100→ x 变成 1003 传地址函数就能改外面的变量回忆函数那章的值传递传进去的是复印件的值函数里改了外面纹丝不动。想把外面的变量也改掉就把门牌号传进去让函数顺着地址改原件#includestdio.hvoidadd10(int*p){*p10;// 顺着 p 改外面那个变量}intmain(){intn5;printf(%d\n,n);// 5add10(n);printf(%d\n,n);// 15return0;}传地址 → 就能通过地址改外面的变量。这也是数组传参能改外面的原因——数组名本身就是首元素地址传数组本质就是传指针。运行情况4 数组名就是指针数组名是存放着首元素地址的指针常量。#includestdio.hintmain(){inta[5]{10,20,30,40,50};printf(%p\n,a);// 数组名 首元素地址printf(%p\n,a[0]);// 和 a[0] 打印出来一样int*pa;// 数组名可以直接塞进指针printf(%d\n,a[2]);// 30printf(%d\n,*(a2));// 30 —— a[2] 就是 *(a2)printf(%d\n,p[2]);// 30 —— 指针也能用 []return0;}运行情况记住三点数组名是首元素的地址a和a[0]是同一个数字所以int *p a;合法。a[i]本质就是*(ai)先首地址加偏移量再解引用。[]只是语法糖——所以只要手里有地址p[2]和a[2]都好使。数组名是指针常量改不了它相当于是const int *a不能a、不能a p门牌号改不了p是变量可以p往后挪。看到数组名就看成首元素的门牌号。以后传数组、遍历数组还有学生系统里scanf(%31s, stu.name)不用写都是因为这个。5 总结概念含义代码地址变量的门牌号x→ 0x7fff…指针存地址的变量int *p x;*p顺着地址看/改房子里的值*p→ 42传地址函数能改外面add10(n);数组名首元素的地址能当指针用int *p a;野指针声明后没赋地址装着垃圾值int *p;别乱用NULL空指针谁都不指int *p NULL;用前先判断指针 存地址的变量本身没魔法取地址*解引用——全部就这两个操作传地址能改外面——数组传参能改外面的本质数组名 首元素地址a[i]就是*(ai)传数组就是传指针声明指针先赋NULL用前先判断躲开野指针的坑到这里你已经会用指针指一个变量、一个数组了。可真实的数据往往不是一个数而是一坨——比如一个学生就有学号、姓名、三门成绩。下一讲我们专门解决这件事用指针指一整个结构体看懂它在内存里怎么摆。学完那一讲我们就正式动手做学生成绩管理系统。
延伸阅读

更多相关文章

2026/10/16 12:20:23

信创编辑器对Word特殊内容粘贴兼容性深度解析

信创办公改造项目里,最容易被反复确认的一个问题,就是从Word复制内容到信创编辑器里,那些“特殊内容”会不会丢。这里说的特殊内容,不只是普通文字和图片,而是公式、表格、脚注、批注、域代码、文本框、嵌入式对象这一…

2026/10/16 12:20:23

DeepSeek网页版使用全攻略:从登录入口到进阶玩法

DeepSeek现在已经成为很多人日常工作、学习中经常使用的AI工具。无论是写文章、整理资料、分析文档,还是编写代码,只要打开浏览器,就能直接与AI对话。 不过,第一次使用DeepSeek,不少人还是会遇到一些问题:…

2026/10/16 13:41:29

人机共生工作流实战:从提示词工程到效率提升的完整方略

1. 为什么“人机共生”不是口号,而是当下最现实的效率命题这两年我身边不少朋友都在焦虑同一件事:AI到底会不会把自己的饭碗抢走。做设计的担心出图工具一键生成海报,做文案的担心大模型三秒写出十版标题,做数据分析的担心自动建模…

2026/10/16 13:41:29

人机共生实战:用五步流程把AI变成效率杠杆

1. 为什么“人机共生”不是口号,而是当下最现实的效率命题“AI技术下的职场与生活方略”这个标题,乍一看像是一篇泛泛而谈的趋势文章,但真正在一线做事的人会明白,它指向的是一个非常具体的困境:工具已经强到超出大多数…

2026/10/16 13:41:29

企业级大模型技术指南:从提示工程到Red Teaming的落地实践

简介:《企业级生成式人工智能LLM大模型技术、算法及案例实战》是一份面向AI技术开发者与科研人员的PDF学习资料,聚焦生成式AI大模型从原理到工业落地的完整链路。内容源自2024年7月线上实训班,覆盖十大模块:Generative AI原理与工…

2026/10/16 13:41:29

PaddleOCR 2.6训练全流程:从环境配置到模型导出的实战指南

简介:面向OCR初学者及需要自定义训练任务的开发者,这份资料基于PaddleOCR 2.6版本梳理了一套完整的实操流程,内容覆盖深度学习环境配置、依赖安装、PPOCRLabel工具标注、识别与检测标签生成、数据集按检测结果划分、YML文件核心参数调整&…

2026/10/16 13:41:29

NeRF-SLAM复现指南:从环境配置到二次开发避坑

简介:这份复现文档面向希望深入理解或动手复现NeRF-SLAM的研究者与工程人员,聚焦神经辐射场与SLAM结合后的稠密三维重建方案。内容围绕Tracking与Mapping两大阶段展开:Tracking部分讲解基于Droid SLAM与RAFT光流估计的协方差计算,…

2026/10/16 13:36:28

语义分割数据增强实战:imgaug图像与掩码同步增强指南

1. 语义分割任务里,数据增强到底在解决什么问题做过语义分割的人都有一个共同感受:模型效果上不去,八成不是网络结构不够花哨,而是标注数据太少、太单一。语义分割和图像分类不一样,分类一张图只有一个标签&#xff0c…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑