【C语言进阶】指针和数组(指针与数组名;指针数组,数组指针;数组传参,指针传参;字符指针,函数指针,函数指针数组,回调函数)

发布时间:2026/10/6 20:34:41

【C语言进阶】指针和数组(指针与数组名;指针数组,数组指针;数组传参,指针传参;字符指针,函数指针,函数指针数组,回调函数) 目录一、数组1.数组名2.数组的内存布局二、指针三、指针与数组1.使用方法上的相似点2.指针与数组名的区别3.数组传参4.C语言为什么要将指针和数组的访问方式设计成通用的5.多维数组与指针6.两道经典例题四、字符指针五、指针数组六、数组指针七、数组传参、指针传参八、函数指针九、函数指针数组——无限套娃十、回调函数一、数组1.数组名1.大多数情况数组名都代表的是数组首元素的地址除了Sizeof(数组名)—— 数组名表示整个数组 ——计算的是整个数组的大小单位是字节数组名—— 数组名表示整个数组 ——取出的是整个数组的地址举例验证2.数组只能够进行整体初始化不能整体赋值数组名是地址常量不能作为左值。2.数组的内存布局1.普通单一局部变量的地址从高往低发展栈区空间的特点。2.数组整体开辟空间不同数组的地址从高往低发展。3.数组内部元素的地址连续且随下标递增。二、指针1.32位电脑有32根地址线每根地址线有通(1)断(0)两种状况。因此32位电脑最多可以访问2^32个地址每个地址需要32bit 4byte 存放。又因为一个地址对应一个字节内存所以32位电脑最大可以访问 2^32byte 2^10*2^10*2^10*2^2 4GB 大小的内存空间。2.指针类型的意义决定指针解引用的权限有多大能操作几个字节决定了指针走一步的步长有多大3.指针-指针得到的是两个指针之间元素的个数4.变量的地址是所占内存空间地址最低的字节的地址5.指针的多种表示形式Int arr[10]{0};Int* parr;//arr[2]--*(arr2)--*(2arr)--2[arr]//p[2]--*(p2)--*(2p)--2[p]三、指针与数组首先声明一点指针与数组是两套不同的概念只是因为在使用方法上有相似之处所以经常被初学者搞混。1.使用方法上的相似点指针与数组在访问多个连续元素的时候既可以采用指针解引用的方式也可以采用 [中括号]的 方式。2.指针与数组名的区别数据类型不同指针是保存地址的变量数组是相同类型数据的集合。访问数据的方式利用指针访问数据属于间接寻址本质上是先取p的内容然后加上i*sizeof(类型)字节作为数据真正的地址数组名访问数组元素是直接寻址本质上是arr所代表数组首元素的地址地址常量加上i*sizeof(类型)字节作为数据真正的地址。常用场合指针通常用于动态数据结构数组通常用于存储固定数目且数据类型相同的元素。3.数组传参1.数组传参需要降维成指针。如果不降维就要发生数组拷贝函数调用效率降低。2.所有的数组传参都会降维成指针降维成为指向其内部元素类型的指针。3.函数形参列表中的数组会被解释成指向其内部元素类型的指针因此最高维[中括号]中的数字会被忽略其他维度是指针的类型不能省略。4.C语言为什么要将指针和数组的访问方式设计成通用的C语言是面向过程的语言函数是其核心概念。而在函数调用的过程中数组传参为提高效率会降维成指针。假设指针和数组访问元素的方式不通用程序员需要不断在不同的代码片段处进行习惯的切换增加代码出错的概率。为了让程序员统一使用数组减少出错概率数组和指针的访问方式才设计成通用的。5.多维数组与指针1.在理解上我们甚至可以将所有的数组都当成“一维数组”。三维数组的元素是二维数组二维数组的元素是一维数组......2.多维数组的内存布局也 是“线性连续且递增的”6.两道经典例题1.二维数组的元素是一维数组a[i] --- *(ai)1. **基础大小*** sizeof(a) 为 **48**整个二维数组有 3 行 4 列共 12 个 int 元素12 * 4 48 字节。* sizeof(a[0][0]) 为 **4**单个 int 类型的大小。* sizeof(a[0]) 为 **16**a[0] 是二维数组的第一行本质是一个包含 4 个 int 的**一维数组**所以是 4 * 4 16 字节。2. **指针运算与类型退化关键点*** sizeof(a[0] 1) 为 **4**a[0] 作为数组名在表达式中会退化为指向首元素的指针int*。1 表示向后移动一个 int 的位置所以结果是一个指针的大小在 32 位系统中为 4 字节。* sizeof(*(a[0] 1)) 为 **4**对上述指针进行解引用得到的是具体的 int 元素。* sizeof(a 1) 为 **4**这里的 a 是二维数组名代表指向**行数组**的指针int(*)[4]。a 1 指向第二行依然是一个指针大小为 4。* sizeof(*(a 1)) 为 **16**解引用 a 1得到的是第二行这个一维数组大小为 16 字节。3. **取地址符 的用法*** sizeof(a[0] 1) 为 **4**a[0] 获取的是第一行整个数组的地址类型为 int(*)[4]。1 依然是指针移动所以大小是 4。* sizeof(*(a[0] 1)) 为 **16**解引用后得到的是第二行的数组整体大小为 16。4. **补充说明*** sizeof(*a) 为 **16***a 等价于 a[0]即第一行数组。* sizeof(a[3]) 为 **16**虽然数组 a 只有 3 行下标 0, 1, 2但 sizeof 是编译时求值的。它只关心类型a[3] 在类型上依然是 int[4]所以大小为 16 字节。**注意这里只是计算大小如果真的去访问 a[3] 会导致数组越界。**** 补充提醒**图片中的打印结果如 4 字节是在 **32 位系统**下运行的。如果你在 64 位系统上运行这段代码指针类型如 sizeof(a 1)、sizeof(a[0] 1)的大小会变成 **8 字节**其余结果48、16、4保持不变。2.指针加 i 跳过 i*sizeof(类型) 个字节指针相减代表两个指针之间元素的个数答案FFFFFFFC-4四、字符指针1.两个不同的字符数组在内存中占两块不同的存储空间数组名指向的首元素的地址就不同2.完全相同的常量字符串只开辟一块存储空间因此不同的字符指针指向的地址相同。3.字符数组中的元素是可以改变的而字符串常量是不能改变的五、指针数组1.指针数组的定义指针数组是数组——元素是指针的数组Int *arrp[10];——arrp就是一个指针数组其中的每一个元素都是指针。2.让指针数组中每一个元素都指向一个字符串常量统一处理这些字符串。3..让指针数组中每一个元素都指向一个数组首元素的地址就可以模拟二维数组访问这些数组中的元素。将相同类型的一维数组串联起来。六、数组指针1.数组指针的定义数组指针是指针——执向数组的指针Int (*parr)[10]arr;——parr就是一个数组指针其中存放的是数组的地址4.数组指针的使用所有的数组传参都会降维成指针降维成为指向其内部元素类型的指针。在理解上我们甚至可以将所有的数组都当成“一维数组”。三维数组的元素是二维数组二维数组的元素是一维数组......多维数组传参降维成数组指针。七、数组传参、指针传参1.一维数组传参实参形参Int arr1[10];Int arr[10]形式Int arr1[10];Int arr[]形式Int arr1[10];Int* arr本质Int* arr2[20];Int* arr[20]形式Int* arr2[20];Int* arr[]形式Int* arr2[20];Int** arr本质2.二维数组传参实参形参Int arr[3][5];Int arr[3][5]形式Int arr[3][5];Int arr[][5]形式Int arr[3][5];Int (*arr) [5]本质3.当函数的参数为一级指针的时候可以接受的参数相应变量的地址(a)相应一维数组的数组名(arr)一级指针(p)4.当函数的参数为二级指针的时候可以接受的参数一级指针的地址(p)二级指针(pp)指针数组的数组名(arrp)八、函数指针1.存放函数地址的指针2.数组名VS函数名数组名 ! 数组名函数名 函数名3.定义函数指针返回类型 (*pf)(参数类型……)Int (*pf)(int ,int)add(或add);4.使用函数指针调用函数Int ret add(3,5);//使用函数名调用函数Int ret (*pf)(3,5);//*无实际意义Int ret pf(3,5);//常用5.有趣的代码对类型重定义简化函数声明九、函数指针数组——无限套娃1.存放函数指针的数组int(* pfarr[5])(int,int);在函数指针的基础上加[ ]2.指向函数指针数组的指针十、回调函数举例库函数qsort
延伸阅读

更多相关文章

2026/10/6 20:34:41

二叉树题目记录

二叉树是指度为 2 的树。它是一种最简单却又最重要的树,在计算机领域中被广泛应用。 二叉树的递归定义如下:二叉树是一棵空树,或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树,左子树和右子树…

2026/10/6 20:29:41

开源鸭形双足机器人:强化学习从仿真到硬件部署全解析

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

2026/10/6 22:44:50

角度转弧度节点深度拆解:数学原理、游戏引擎与ComfyUI应用

1. 先把这个“角度转弧度”节点聊明白做可视化编程的朋友,几乎都绕不过DegreesToRadians这个节点。不管你是玩Unreal蓝图、Unity的Visual Scripting、Godot的可视化脚本,还是用ComfyUI搭图像处理工作流,只要涉及旋转、朝向、圆形分布这类数学…

2026/10/6 22:44:50

Kafka事务机制核心解析:从幂等到端到端恰好一次

1. 从“消息不丢”到“端到端恰好一次”:Kafka 事务要解决的根本问题1.1 三种投递语义的边界:为什么 Kafka 不能天然保证不重不漏很多人第一次听到“Kafka 事务机制”时,以为它是用来解决消息丢失的。这个理解不算错,但太宽泛了。…

2026/10/6 22:44:50

健身房预约小程序开发实战:Spring Boot+Vue+微信小程序全解析

很多人一看“健身房预约小程序”这个题目,第一反应是“又一个烂大街的课设项目”。说实话,这类系统在技术圈确实不算新鲜,Spring Boot Vue 小程序的组合,几乎是国内Java开发者的标准起手式。但真要把这套东西从零搭出来、跑通、…

2026/10/6 22:44:50

Label Studio Source Storage 数据源接入:从原理到配置完全指南

1. 为什么需要搞懂 Source Storage 先聊个实际场景。做数据标注项目的朋友应该都有过这种经历:项目建好了,标注界面也配置完了,结果往里面导数据的时候傻眼了——几百上千张图片、一大摞文本文件,如果靠网页端一个文件一个文件地上…

2026/10/6 22:44:50

vLLM启动后如何调用API?接口清单、OpenAI兼容用法与排障指南

很多人第一次部署 vLLM 都会经历这样一个瞬间:屏幕上滚过一大段日志,最后出现 “Application startup complete”,服务确实起来了,但你站在终端前突然不知道下一步该干嘛——这个 HTTP 服务到底暴露了哪些接口?用 curl…

2026/10/6 22:39:50

OpenCV 低代码工作流框架的核心思路是:用可视化节点编排代替手写算子代码,用工作流文件(.vm)承载算法逻辑,上层应用只负责加载和执行

OpenCV 低代码工作流框架的核心思路是:用可视化节点编排代替手写算子代码,用工作流文件(.vm)承载算法逻辑,上层应用只负责加载和执行。目前有两类实现路径,各自适合不同的工程阶段。 路径一:Ope…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

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

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

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