救命!分不清数组指针和指针数组,函数指针和指针函数?这篇一次性讲透

发布时间:2026/9/28 18:25:30

救命!分不清数组指针和指针数组,函数指针和指针函数?这篇一次性讲透
一、指针数组主体是数组数组元素为指针1. 概念定义语法格式基类型 * 数组名[长度];[]优先级高于*变量先与[]结合形成数组数组内每一个元素都是对应类型的指针64 位系统单个指针占 8 字节数组总字节 指针大小 × 数组长度。2. 示例代码#include stdio.h int main() { char *pstr[3] {Hello, World, C Language}; printf(指针数组整体占用字节%ld\n, sizeof(pstr)); printf(单个数组元素(指针)占用字节%ld\n, sizeof(pstr[0])); for (int i 0; i 3; i) { printf(pstr[%d] %s 地址%p\n, i, pstr[i], pstr[i]); } char **p pstr; printf(二级指针访问字符串%s\n, *p); return 0; }3. 使用场景存储多组字符串、命令行参数char *argv[]、批量管理地址集合。二、数组指针主体是指针指向一整个数组1. 概念定义语法格式基类型 (*指针名)[数组长度];()强制*与变量名绑定主体为指针该指针专门指向完整数组指针1会一次性偏移整个数组的内存大小指针本身固定占 8 字节64 位系统与数组长度无关arr是数组首元素地址int*arr是数组整体地址数组指针int (*)[N]。2. 示例代码#include stdio.h int main() { int a[5] {10, 20, 30, 40, 50}; int (*p)[5] a; printf(数组指针自身字节%ld\n, sizeof(p)); printf(数组首地址%pp1地址%p\n, a[0], p 1); for (int i 0; i 5; i) { printf(%d , *(*p i)); } printf(\n); int two[2][3] {{1, 2, 3}, {4, 5, 6}}; int (*p2)[3] two; printf(二维数组元素%d\n, *(*p2 1)); return 0; }3. 使用场景二维数组函数传参、批量操作整块连续数组内存。三、指针函数主体是函数返回值为指针1. 概念定义语法格式基类型 * 函数名(形参列表);主体是函数函数执行完成后返回一个对应类型的指针禁止返回局部栈变量、局部数组地址函数结束栈内存释放产生野指针合法返回全局变量地址、static 静态变量地址、字符串常量、堆内存地址、传入参数地址。2. 示例代码#include stdio.h // 指针函数返回char*字符串指针 char *getWord(int num) { if (num 1) return Apple; else if (num 2) return Banana; else return Orange; } int *getStaticNum() { static int num 999; return num; } int main() { char *str getWord(2); printf(指针函数返回字符串%s\n, str); int *p getStaticNum(); printf(指针函数返回数值%d\n, *p); return 0; }3. 错误示例野指针char *badFunc() { char buf[] test; return buf; }4. 使用场景封装获取内存地址的逻辑、字符串处理、动态内存封装。四、函数指针主体是指针存储函数入口地址1. 概念定义语法格式返回值类型 (*指针名)(形参类型列表);主体是指针用于存放函数的入口地址函数名本身就是地址指针匹配固定返回值、固定参数列表的函数核心用途回调函数、函数数组、动态切换执行逻辑。2. 基础示例代码#include stdio.h int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int main() { int (*pfun)(int, int) NULL; pfun add; printf(10 5 %d\n, pfun(10, 5)); pfun sub; printf(10 - 5 %d\n, pfun(10, 5)); int (*funArr[2])(int, int) {add, sub}; printf(20 3 %d20 - 3 %d\n, funArr[0](20, 3), funArr[1](20, 3)); return 0; }3. 进阶回调函数示例#include stdio.h void calc(int a, int b, int (*func)(int, int)) { printf(计算结果%d\n, func(a, b)); } int mul(int a, int b) { return a * b; } int main() { calc(6, 7, mul); // 将函数作为参数传入回调执行 return 0; }4. 使用场景回调函数、插件化开发、状态机、函数批量调度。五、四大概念对比表名称本质标准语法核心特征64 位系统内存大小指针数组数组元素全为指针int *arr[5];[]优先级高存储多个内存地址5 × 8 40 字节数组指针指针指向完整数组int (*p)[5];()包裹 *指针偏移跳过整个数组固定 8 字节指针函数函数返回指针类型int *func();调用后返回内存地址禁止返回局部栈地址无占用代码存文本段函数指针指针存储函数入口地址int (*p)(int);可赋值函数、用作回调参数固定 8 字节六、快速区分口诀运算符优先级()[]*先绑定变量名的符号决定主体int *a[5]先a[5]数组元素int*→指针数组int (*a)[5]先*a指针指向int[5]数组 →数组指针int *a()a()是函数返回int*→指针函数int (*a)()*a是指针指向无参 int 函数 →函数指针。七、总结四类概念是 C 指针进阶核心分水岭区分关键在于运算符优先级数组相关分清「存放指针的数组」和「指向数组的指针」函数相关分清「返回指针的函数」和「指向函数的指针」开发实操指针数组多字符串管理数组指针二维数组传参指针函数封装地址返回逻辑函数指针回调解耦、动态逻辑调度。

相关新闻

树莓派5安装配置VSCode全攻略:ARM64架构优化与远程开发实践

树莓派5安装配置VSCode全攻略:ARM64架构优化与远程开发实践

2026/9/24 15:27:10

1. 为什么要在树莓派5上折腾VSCode? 如果你刚拿到树莓派5,兴奋地装好了Raspberry Pi OS,打开默认的Thonny或Geany编辑器,可能会觉得差点意思。尤其是当你习惯了在主力电脑上用VSCode那种丝滑的代码补全、集成的终端和丰富的插件生…

交通行业AI落地,企业为什么需要一个“多模型API网关“?

交通行业AI落地,企业为什么需要一个“多模型API网关“?

2026/9/5 23:51:45

本文为行业技术科普,聚焦交通行业AI落地的工程化痛点与选型思路,不含任何具体产品实现细节。一、交通行业正在用AI做什么 从城市交通大脑到高速公路巡检,AI在交通领域的落地场景越来越实。归纳下来,主要有这几类: 视频…

【C++】023、移动语义深拷贝

【C++】023、移动语义深拷贝

2026/8/12 10:36:58

一、移动语言是如何解决深拷贝的性能问题?深拷贝会复制整个底层数据,让源对象和目标对象都拥有自己独立的堆内存空间移动语义是转换底层资源的所有权,将源对象的指针指向目标对象,而不赋值底层数据,时间复杂都为1移动语…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/28 16:01:49

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

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

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

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/28 16:01:48

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/28 16:01:48

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…