C语言进阶:数组
C语言进阶数组—— 从一维到多维数组名与指针sizeof 的陷阱前言学完变量、分支和循环之后你第一个遇到的数据结构就是数组。它是 C 语言中最基础、最常用的复合类型——没有之一。但数组也是新手最容易出问题的地方。sizeof 算出来不是你想要的数传个数组进函数结果全乱了二维数组的指针绕得头晕——这些问题几乎每个人都会遇到。这篇我们从头讲清楚数组怎么声明、怎么存、怎么用、sizeof 什么时候背叛你、数组名和指针到底什么关系。一、一维数组从声明到内存1.1 声明与初始化数组就是一组相同类型的变量的集合。声明数组时你需要指定类型、名字和大小int arr[10]; // 10 个 int未初始化char name[20]; // 20 个 char可以存 19 个字符 \0声明时可以同时初始化int a[5] {1, 2, 3, 4, 5}; // 完整初始化int b[5] {1, 2}; // 部分初始化剩余为 0int c[] {1, 2, 3, 4, 5}; // 自动推算大小 5int d[5] {0}; // 全部初始化为 0二、sizeof 的陷阱2.1 sizeof(数组名)sizeof 操作符写在数组名前面时返回的是整个数组占用的字节数——不是元素个数。int arr[10];sizeof(arr); // 4010 个 int × 4 字节sizeof(arr) / sizeof(arr[0]); // 10 —— 这才是元素个数2.2 sizeof 在哪里背叛你当你把数组作为函数参数传递时数组名“退化”为指针。此时 sizeof 计算的是指针大小——在 64 位系统上是 8。void func(int arr[]) { sizeof(arr); } // 8不是 40void func(int arr[], int len) { /* 用 len */ } // 正确三、数组名与指针的区别3.1 三个等价式数组名在大多数上下文中会隐式转换为首元素地址。因此以下三种写法等价arr[i] *(arr i) *(i arr) i[arr]是的i[arr] 也能编译通过——C 语言的 [] 操作符只是 *(ab) 的语法糖。3.2 两个例外① sizeof(arr) —— 返回整个数组的大小不是指针大小。② arr —— 取整个数组的地址类型是 int(*)[N]不是二级指针。int arr[5];int *p arr; // int*1 跳 4 字节int (*q)[5] arr; // int(*)[5]1 跳 20 字节四、二维数组4.1 声明与存储二维数组就是“数组的数组”。在内存中仍然是连续排列的——按行优先存储。int mat[3][4] {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};4.2 二维数组的指针类型对于 int mat[3][4]· mat 的类型是 int(*)[4]——指向“包含 4 个 int 的一维数组”的指针。· mat[0] 的类型是 int*——第一行的首元素地址。· sizeof(mat) 483×4×4sizeof(mat[0]) 164×4。4.3 二维数组传参二维数组传参时第二维的大小必须指定void func(int mat[][4], int rows); // 正确void func(int (*mat)[4], int rows); // 等价为什么因为编译器要知道 mat[i][j] 中 i 跳过多少字节。你不告诉它列数编译器就算不出偏移量。五、常见错误汇总1. 忘记传数组长度——函数里 sizeof(arr) 返回的是指针大小。2. 数组越界——arr[10] 实际上只有 0~9arr[10] 已经越界了。C 语言不检查越界。3. 用 复制数组——arr2 arr1 不会复制内容只是指针赋值。正确用 memcpy 或循环。4. sizeof 和 strlen 搞混——sizeof 编译期算字节数含 \0strlen 运行期算字符数不含 \0。5. 返回局部数组的指针——函数返回后数组被销毁指针变悬空。写在最后数组是简单的——一段连续的内存一个名字一个类型。但它的简单恰恰是它复杂的原因。你不需要记住数组和指针的所有等价变换但你需要知道两件事① sizeof 会背叛你② 数组名在大多数时候等于首元素地址。这两件事记住了至少不会掉进数组最大的坑里。小说就是把自己和别人混在一起。—— 杨德昌《恐怖分子》— END —

相关新闻

颈椎健康互助平台开题报告

颈椎健康互助平台开题报告

一、课题研究背景 随着数字化时代快速发展,智能手机、电脑等电子设备全面普及,久坐办公、线上学习、碎片化刷屏成为大众日常主流生活与工作模式,长期低头、坐姿不规范、颈椎过度劳损、缺乏颈部养护运动等不良习惯,导致当代人群颈椎…

2026/7/19 2:13:24阅读更多 →
STM32外部电源电压检测与分压电路设计

STM32外部电源电压检测与分压电路设计

1. STM32外部电源电压检测的核心原理在嵌入式系统开发中,电源管理是确保系统稳定运行的关键环节。STM32系列MCU内置的12位ADC模块能够实现0-3.3V范围内的电压测量,但实际应用中经常需要监测高于3.3V的外部电源电压(如12V锂电池组)…

2026/7/19 2:13:24阅读更多 →
MTK平台UART调试全攻略:从硬件连接到高级应用

MTK平台UART调试全攻略:从硬件连接到高级应用

1. MTK平台UART调试的核心价值与场景定位在嵌入式开发领域,UART(Universal Asynchronous Receiver/Transmitter)作为最基础的通信接口之一,其重要性不言而喻。特别是在MTK(联发科)平台开发过程中&#xff0…

2026/7/19 2:13:24阅读更多 →
知识库主流分片策略

知识库主流分片策略

1、概述将大文件存入知识库,主流的分片策略大致可以分为五类,它们分别适用于不同的文档类型和业务需求。核心思路是在块的大小、语义的完整性和计算成本之间找到平衡点。2、分片策略下表整理了这几类策略的核心原理、优缺点和典型应用场景,可…

2026/7/19 5:07:40阅读更多 →
时间序列分类变量动态编码:解决静态编码导致的模型失灵

时间序列分类变量动态编码:解决静态编码导致的模型失灵

1. 项目概述:为什么时间序列里的分类变量不能“一码了之”你有没有遇到过这样的情况:模型在训练集上效果不错,但一到真实业务场景里,预测就突然“失灵”?比如零售销量预测,上周刚上线的模型,这周…

2026/7/19 5:07:40阅读更多 →
企业数据分类分级操作指南:合规与安全治理实践

企业数据分类分级操作指南:合规与安全治理实践

这次我们来看企业数据分类分级这个关键的数据治理环节。随着《数据安全法》《个人信息保护法》等法规的实施,企业必须建立科学的数据分类分级体系来满足合规要求。这个操作指引将帮助企业系统化地完成数据资产梳理、分类标准制定、分级保护措施落地等核心工作。数据…

2026/7/19 5:07:40阅读更多 →
DM9000以太网控制器原理与WinCE5.0驱动开发详解

DM9000以太网控制器原理与WinCE5.0驱动开发详解

1. DM9000网络控制器基础认知DM9000是一款高度集成的以太网控制器芯片,广泛应用于嵌入式系统中。作为一款10/100M自适应的物理层芯片,它通过简单的总线接口与主控芯片连接,特别适合在资源受限的嵌入式环境中使用。在WinCE5.0这类嵌入式操作系…

2026/7/19 5:07:40阅读更多 →
鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析

鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析

鸿蒙 ArkTS 实战:Book Summary Card 从智能草稿到保存闭环完整解析 前言 Book Summary Card 是一个面向 读书总结卡片 的鸿蒙 ArkTS 单页工具。它将主题输入、数量统计、提示备注、智能模式和保存状态组织在同一个移动端页面中。 项目服务于 读者根据摘录生成书籍…

2026/7/19 5:07:40阅读更多 →
为什么说“稳,就是最大的冒险”,工作怎么选-永远不要放弃“离开的能力”? 风险和机会并存-在风险中的

为什么说“稳,就是最大的冒险”,工作怎么选-永远不要放弃“离开的能力”? 风险和机会并存-在风险中的

怎么选:体制内的“稳”和私企的“险”,全都是表层假象 真正的代价和收益,都藏在水面之下。 一、先拆穿两个最常见的认知误区 误区1:公务员/事业编=绝对稳定,一劳永逸 很多人考公的底层逻辑是“进去了就一辈子无忧”,这是典型的把“阶段性稳定”当成了“永久安全”。 …

2026/7/19 5:05:39阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →