C语言指针学习
一、指针基础概念1. 内存、地址、指针、指针变量区分内存程序运行时可访问的存储空间计算机以 1 字节为单位给内存编号。地址内存字节的唯一编号用来定位内存空间。指针 地址指针就是内存编号代表一块内存的位置。指针变量专门存储地址的变量本身也要占用内存空间。2. 指针变量定义语法格式基类型 *变量名;基类型指针指向空间存储的数据类型int/char/float/void 等决定解引用时读取多少字节。*类型标识说明该变量是指针不是普通变量。示例int *pint; // 指向 int 类型的指针 char *pch; // 指向 char 类型的指针 int *pi, *pj; // 同时定义两个 int 指针3. 指针变量占用空间64 位系统所有指针统一占 8 字节32 位系统所有指针统一占 4 字节sizeof(任意指针)只和系统架构有关和指向类型无关。4. 指针初始化与赋值int num 100; int *p NULL; // 初始化为空指针推荐避免野指针 int *p2 num; // 取普通变量地址赋值 p num; // 先定义后赋值NULL等价 0代表指针不指向任何有效内存。野指针未初始化、指向已释放内存、越界地址的指针操作会段错误。规避方案定义时赋值 NULL 或合法变量地址。5. 两大核心运算符 取地址、* 解引用1 取地址运算符作用获取变量首字节地址规则只能对变量取地址不能对常量、表达式、寄存器变量取址。int a; a; // 合法取 a 的地址 100; // 非法2* 解引用间接访问运算符作用通过指针保存的地址访问对应内存里的数据规则*指针等价于基类型变量读写该内存的值。读取字节数由基类型决定char *p*p只操作 1 字节int *p*p操作 4 字节double *p*p操作 8 字节int num 10; int *p num; *p 20; // 等价 num 20; 修改原变量值6. 指针算术运算指针仅支持/--/整数/-整数/指针-指针*/%无意义。指针 ± 整数偏移整数 × sizeof(基类型)字节char *pc; pc1; // 向后偏移 1 字节 int *pi; pi1; // 向后偏移 4 字节指针 1 - 指针 2结果是两个地址之间间隔的元素个数公式元素个数 (地址差值) / sizeof(基类型)前提两个指针指向同一块连续内存数组才有意义。二、指针作为函数参数地址传递核心1. 值传递 vs 地址传递普通值传递实参拷贝一份给形参形参是独立空间无法修改主函数变量指针地址传递实参传变量地址形参指针接收地址*形参直接操作主函数原变量可修改外部变量2. 指针传参三大用途在被调函数修改主调函数的普通变量函数需要返回多个计算结果传递数组避免完整拷贝数组节省内存。3. 二级指针传参场景如果要修改主函数里的指针变量本身不是指针指向的数据需要传指针的地址形参用二级指针接收。void fun(char **pstr) { *pstr new string; // 修改外部一级指针 pstr 的指向 } int main() { char *p hello; fun(p); // 传指针变量的地址二级指针接收 }三、指针与一维数组1. 数组名本质数组名 a 是数组首元素地址常量等价a[0]不能被赋值右值。下标语法和指针语法完全等价a[0] *a; a[1] *(a1); a[n] *(an); a[n] a n;2. 一维数组作函数参数两种写法完全等价// 写法 1数组形式 void print_arr(int a[], int len); // 写法 2指针形式推荐底层理解 void print_arr(int *pa, int len);注意函数内部sizeof(pa)得到的是指针大小8 字节不是数组总长度所以必须手动传长度参数。3. 字符数组 / 字符串指针char str[] hello;str str[0] char *字符串以\0结尾函数传参不需要额外传长度遍历至*str \0停止。自定义字符串库函数mystrlen/mystrcpy 等形参都可用char str[]或char *str。四、数组指针 vs 指针数组极易混淆重点1. 数组指针int (*p)[5]本质指针指向一整个数组括号不能省略()优先级高于[](*p)代表 p 是指针[5]代表指向含 5 个 int 的数组运算特性p1一次性偏移整个数组大小5×420 字节适用场景接收二维数组数组名int a[5] {1, 2, 3, 4, 5}; int (*p)[5] a; // a 是整个数组的地址匹配数组指针类型2. 指针数组int *p[5]本质数组数组里每个元素是int *指针[]优先级高于*先定义数组数组存储指针内存占用64 位系统 5×840 字节典型用途存储多个字符串节省空间// 指针数组存放 5 个字符串常量地址仅存指针不存字符串本体 char *str_arr[5] {aa, bb, cc};3. 指针数组 vs 二维字符数组对比char str1[3][100] {a, b, c}; // 二维数组存储字符串本体总 300 字节 char *str2[3] {a, b, c}; // 指针数组仅存地址总 24 字节二维字符数组开辟连续内存存完整字符串可修改每个字符指针数组仅存字符串常量区地址字符串常量只读不可修改字符。五、指针与二维数组二维数组名 a 是数组指针int (*)[列数]指向第一行一维数组等价a[0]int a[2][3] {1, 2, 3, 4, 5, 6}; a 1; // 跳过一整行3 个 int12 字节二维数组元素访问等价写法a[m][n] *( *(am) n )二维数组传参两种等价写法列数必须指定行数可省略void print2D(int a[][3], int row); void print2D(int (*pa)[3], int row);六、二级指针类型 **p定义保存一级指针变量的地址的指针int num 10; int *p num; int **pp p; // pp 是二级指针存储一级指针 p 的地址两大核心使用场景函数内修改外部一级指针变量前文示例接收指针数组数组名指针数组名 str_arr 等价char **二级指针。char *str[3] {a, b}; void func(char **p); func(str); // 数组名是二级指针直接传参七、指针函数 vs 函数指针区分难点1. 指针函数返回值为指针的函数格式基类型 *函数名(形参)char *get_str() { static char buf[] test; return buf; // 允许返回 static/全局/字符串常量/堆内存地址 // 禁止返回局部栈数组地址函数结束内存销毁变成野指针 }返回地址合法性规则✅ static 静态变量地址 / 全局变量地址 / 字符串常量地址 / 堆 malloc 地址 / 参数传入地址❌ 函数内普通局部变量、局部数组地址2. 函数指针指向函数入口地址的指针格式返回值 (*指针名)(形参列表)// 加法函数 int add(int a, int b) { return a b; } // 定义匹配 add 的函数指针 int (*pfun)(int, int) NULL; pfun add; // 函数名 函数入口地址赋值给函数指针 // 通过指针调用函数 int res pfun(1, 2);核心用途回调函数将函数作为参数传给其他函数解耦代码。八、void* 万能指针定义void *p可以接收任意类型数据的地址通用地址容器限制不能直接解引用*p运算前必须强制转换为对应类型指针典型场景malloc/free、通用工具函数参数。int a 10; void *vp a; int *p (int *)vp; // 强制转换后才能解引用 printf(%d, *p);九、指针核心易错点汇总数组名是地址常量不能a、a pa是数组指针和 a 类型不同sizeof(数组名)只有两种情况代表数组总大小单独sizeof(a)、a作为函数参数时退化为指针野指针、悬空指针不要解引用程序崩溃指针定义默认赋 NULL区分int (*p)[5]数组指针 /int *p[5]指针数组 /int **p二级指针函数返回指针禁止返回栈局部变量地址一级指针传参只能修改指向的数据二级指针才能修改外部指针本身指针算术偏移由基类型字节大小决定不是单纯 ±1 字节字符串常量存在只读段char *p abc;不可写p[0]x字符数组char str[]abc可修改。

相关新闻

AI Agent架构选型实战指南:从需求分析到生产部署

AI Agent架构选型实战指南:从需求分析到生产部署

1. 项目概述:为什么“架构选择”是Agent落地的第一道坎? 最近和几个做AI应用的朋友聊天,发现大家不约而同地卡在了同一个问题上:想法很酷,大模型能力也够用,但真要把一个能自主思考、执行任务的智能体&…

2026/10/10 15:26:40 阅读更多 →
磐图起源:AI智能拍鸟系统实战,从部署到出片全解析

磐图起源:AI智能拍鸟系统实战,从部署到出片全解析

最近在整理手机相册时,发现了一个有趣的现象:拍风景、拍人像的照片,大多都躺在角落里吃灰,唯独那些偶然抓拍到的鸟类照片,每次翻看都让我忍不住嘴角上扬。一只歪头盯着镜头的麻雀,一只在枝头“吵架”的喜鹊…

2026/10/11 17:16:19 阅读更多 →
Android性能优化:adb shell CPU核监控命令实战指南

Android性能优化:adb shell CPU核监控命令实战指南

1. 从一次性能排查说起:为什么需要关注CPU核那天下午,测试同事抱着一台测试机过来,眉头紧锁:“这个App在后台跑着跑着,手机就烫得不行,前台操作也卡顿,你看看是不是哪里死循环了?” …

2026/10/15 19:14:37 阅读更多 →

最新新闻

PS5远程串流优化实操:第三方客户端与参数调校完全指南

PS5远程串流优化实操:第三方客户端与参数调校完全指南

说到PS5远程串流,我估计大多数人的第一反应都是官方那个Remote Play App。能用,但也仅仅是“能用”。画面偶尔糊成一团、延迟飘忽不定、支持设备被卡得死死的,明明手里一台旗舰手机、一台轻薄本,结果玩起来跟十年前云游戏似的。我…

2026/10/15 23:23:42 阅读更多 →
AnyPS5串流方案从零搭建:让任意屏幕变成PS5显示器的完整指南

AnyPS5串流方案从零搭建:让任意屏幕变成PS5显示器的完整指南

AnyPS5这个项目,第一次看到标题时我以为是哪个硬件大神的魔改作品,把PS5塞进某个便携盒子之类的。研究了一圈才发现,它真正想表达的是“Any Device, PS5”——让你手头任何一块屏幕,都能变成PS5的显示器和控制器。说白了&#xff…

2026/10/15 23:23:42 阅读更多 →
本地AI绘图环境搭建全攻略:从硬件选型到性能优化

本地AI绘图环境搭建全攻略:从硬件选型到性能优化

1. 为什么要在本地搭一套AI绘图环境很多人第一次接触AI绘图,都是从网页版或者在线服务开始的。输入一段提示词,点一下生成,几秒钟就能拿到图。方便是真方便,但用久了问题就来了:免费额度用完了要充值,生成队…

2026/10/15 23:23:42 阅读更多 →
吃透Java面向对象四大基石:类、封装、继承、多态实战指南

吃透Java面向对象四大基石:类、封装、继承、多态实战指南

写 Java 的人应该都有过这么一段:键盘敲得飞快,类一个接一个往外蹦,可回过头看自己的代码,总觉得哪里不对劲。说不上是坏,但就是“味道”不对。后来能带新人了,我才慢慢想明白,问题不是语法不熟…

2026/10/15 23:23:42 阅读更多 →
前端多文件上传删除失效?FileList只读机制与解决方案

前端多文件上传删除失效?FileList只读机制与解决方案

1. 表单里那个“删不掉”的文件:一个前端老手也翻过车的经典场景如果你写过带文件上传的表单,大概率遇到过这种让人抓狂的情况:用户选了三个文件,点掉其中一个的删除按钮,界面上那个文件确实消失了,可一点提…

2026/10/15 23:23:42 阅读更多 →
2025前端十大语言与技术栈盘点:从JavaScript到全栈选型指南

2025前端十大语言与技术栈盘点:从JavaScript到全栈选型指南

聊前端语言的排行榜,在圈子里一向容易变成辩论赛。JavaScript、TypeScript、React、Vue、Svelte……每个人心里都有一杆秤,真排起名次来谁也说服不了谁。但对刚入行的人来说,这种争论反而很折磨——他们没有判断基准,只知道到处问…

2026/10/15 23:22:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →