当前位置: 首页 > article >正文

C语言数组:从基础到实践

一、什么是数组数组就是相同类型数据的集合这些数据在内存中连续存放数组里的每个位置叫元素用下标来访问。特别注意数组的下标从0开始。以下代码就是一个简单的数组应用二、数组的基本操作2.1 定义与初始化输出结果如下2.2 遍历数组遍历是数组最常见的操作通常配合 for 循环输出常见的错误循环条件写成 i 5这会访问到 nums[5]造成越界。三、数组的大小3.1 获取数组长度例如以下代码int arr[10];int len sizeof(arr) / sizeof(arr[0]); // 总字节数 / 单个元素字节数 元素个数sizeof 是运算符不是函数。sizeof(arr) 返回整个数组占用的字节数sizeof(arr[0]) 返回第一个元素的字节数相除得到元素个数。注意这个方法只对定义时的原始数组有效。如果数组作为参数传给函数就不能这么用了我也是在这上面出过很多次问题。3.2 数组在内存中的样子假设 int 占4字节数组 int a[4] {10, 20, 30, 40} 在内存中是这样排列的每个元素紧挨着下一个中间没有空隙。这就是为什么数组访问速度快——CPU可以顺序读取缓存命中率高。四、多维数组4.1 二维数组二维数组可以看作表格或矩阵matrix[2][3] 的值是 12。第一个下标是行第二个是列。4.2 遍历二维数组4.3 二维数组的初始化五、字符数组与字符串5.1 字符数组C语言没有专门的字符串类型字符串本质就是以 \0 结尾的字符数组。\0 是空字符ASCII码为0标记字符串结束。5.2 更方便的字符串写法5.3 字符串处理函数字符串处理函数有很多常见的有strlen,strcpy,strcat,strcmp等注意使用这些函数需要包含头文件 string.hstrcpy 和 strcat 不检查目标数组是否够大容易造成越界。更安全的版本是 strncpy 和 strncat它们带长度限制。六、数组作为函数参数数组传给函数时通常会丢失长度信息所以需要额外传递长度// 函数声明接收数组和长度// 调用方括号里的数字可以写也可以不写写了编译器也忽略这是为了兼容旧代码。七、常见错误与注意事项7.1 数组越界int arr[5];arr[5] 100; // 严重错误合法下标只有0~4C语言不会检查下标是否越界,越界访问可能1.覆盖其他变量的数据2.导致程序崩溃Segmentation Fault3.产生难以调试的随机错误防御建议写循环时仔细检查边界条件。7.2 定义时长度必须是常量int n 10;int arr[n]; // 错误C89标准不允许C99允许但不推荐#define SIZE 10int arr[SIZE]; // 正确宏定义是常量const int size 10;int arr[size]; // 错误const变量不是编译期常量标准C要求数组长度在编译时确定。需要动态大小的情况需要使用其他机制如 malloc这属于后续学习内容。7.3 不能整体赋值int a[5] {1, 2, 3, 4, 5};int b[5];b a; // 错误数组不能整体赋值只能逐个元素复制// 正确做法循环复制for (int i 0; i 5; i) {b[i] a[i];}八、sizeof 与 strlen详解这两个函数是初学者最容易踩的坑之一sizeof 和 strlen 看起来都像是求长度但本质完全不同。8.1 sizeof求占用字节数sizeof 是运算符在编译时计算返回变量或类型占用的字节数。例如输出对于字符数组sizeof 包含结尾的 \08.2 strlen求字符串长度strlen 是函数在运行时计算返回字符串中字符的个数不含 \0。例如输出8.3 对比总结核心区别sizeof 问的是你占多少内存空间strlen 问的是你的字符串内容有多长对于空格、换行、缩进这两个函数也是都会算进去。九、写数组的好习惯远离Bug9.1 用宏定义数组长度不要直接把数字写在代码里用宏统一管理好处改一处全局生效代码可读性高不容易抄错数字。9.2 遍历用 而不是 例证如下// 好习惯for (int i 0; i MAX_STUDENTS; i) { ... }// 坏习惯容易越界for (int i 0; i MAX_STUDENTS; i) { ... } // 危险会访问到 arr[MAX_STUDENTS]数组有 N 个元素合法下标是 0 到 N-1所以循环条件是 N不是 N。9.3 初始化时顺手清零定义数组时顺手初始化避免使用未初始化的垃圾值int buffer[100] {0}; // 全部置0// 或者针对字符数组char input[256] {0}; // 清空避免残留数据干扰9.4 数组长度用 sizeof 计算不要硬编码int arr[] {3, 1, 4, 1, 5, 9, 2, 6};// 好习惯让编译器帮你算长度for (int i 0; i sizeof(arr) / sizeof(arr[0]); i) {printf(%d , arr[i]);}这样后续修改数组内容时循环边界自动适应不用手动改数字。9.5 字符数组留够 \0 的位置// 错误存不下 Hello 的 \0char str[5] Hello; // 实际占用6字节越界写入// 正确char str[6] Hello; // 5个字母 1个 \0 刚好6字节// 或更保险char str[20] Hello; // 留足余量9.6 函数传数组时同时传长度// 好习惯长度作为参数一起传void print_scores(int scores[], int count) {for (int i 0; i count; i) {printf(%d , scores[i]);}}// 调用int scores[MAX_STUDENTS];print_scores(scores, MAX_STUDENTS);不要在函数内部试图用 sizeof 算数组长度——传进来的数组已经退化为指针sizeof 只能得到指针大小不是数组长度。9.7 用 const 保护只读数组如果函数不需要修改数组内容加上 const 约束void print_array(const int arr[], int len) {// arr[i] 100; // 编译报错防止误修改for (int i 0; i len; i) {printf(%d , arr[i]);}}这是防御性编程的好习惯编译器会帮你拦住意外修改。9.8 二维数组初始化不要偷懒// 好习惯每层都加花括号清晰直观int matrix[2][3] {{1, 2, 3},{4, 5, 6}};// 坏习惯虽然合法但容易搞混行列int matrix[2][3] {1, 2, 3, 4, 5, 6};十、实用技巧10.1 求数组最大值/最小值输出的 max 现在是 8910.2 数组排序冒泡排序输出结果{1, 2, 3, 5, 8}十一、结语数组是C语言最基础的数据结构我们要理解它的核心要点1.连续存储元素在内存中挨着放2.下标从0开始arr[0] 是第一个元素3.不检查越界自己负责边界安全4.长度需额外传递传给函数时要带上长度养成好习惯——用宏定义长度、初始化清零、 代替 、区分 sizeof 和 strlen——能让你少踩很多坑。掌握数组后后续学习指针会轻松很多但那是另一个阶段的故事了。

相关文章:

C语言数组:从基础到实践

一、什么是数组数组就是相同类型数据的集合,这些数据在内存中连续存放,数组里的每个位置叫元素,用下标来访问。特别注意:数组的下标从0开始。以下代码就是一个简单的数组应用:二、数组的基本操作2.1 定义与初始化输出结…...

孩子学英语怎么选择

需要一点点建议哦...

rk3566 配置HDMI的屏的流程

一、确认硬件与固件硬件:RK3566 板载 Micro HDMI → 接 HDMI 显示器(用转接头 / 线)。固件:优先用官方带 HDMI 配置的镜像(如 hdmi 专用 img),避免默认关闭 HDMI 的版本。二、设备树&#xff08…...

自动化业务通报系统实现

问题解构:需求核心是构建一个基于Python的自动化业务通报系统,用于从多个.xls报表中提取数据,按团队统计指标完成情况,生成手机适配的通报图片,并通过Web界面展示。系统需支持灵活的配置管理,包括团队信息、…...

类和对象概括

类与对象的概念在Java中,类是对象的模板或蓝图,定义了对象的属性和行为。对象是类的实例,具有类定义的属性和方法。类的定义类通过class关键字定义,包含成员变量(属性)和方法(行为)。…...

自制靶机--Believe

Believe设计思路 靶机名称: Believe 作者:Gropers 靶机ID:661 难度: baby 靶机下载地址: https://ova-believe.oss-cn-beijing.aliyuncs.com/Believe.ova 靶机收集地址: https://maze-sec.com 靶机IP: 192.168.1.150 攻击机IP: 192.168.1.195(Kali Linu…...

《论三生原理》对《周易》《道德经》的一次根本性重写?

AI辅助创作:一、关于《周易》来历根源的推断属于文化创新实验,是对《周易》来历、性质、底层逻辑的一次根本性重写?《论三生原理》关于《周易》来历根源的推断,确实属于一次大胆的文化创新实验,并且是对《周易》的来历…...

基于自旋电子学的非易失性矩阵乘法硬件:原理、优势与边缘AI应用

1. 项目概述:为什么我们需要一种全新的矩阵乘法硬件?在人工智能和机器学习领域,矩阵乘法(Matrix Multiplication)是几乎所有核心算法的基石。无论是深度神经网络的前向传播和反向传播,还是推荐系统中的协同…...

VLC for Unity在Android音频绕过原理与协同控制方案

1. 问题本质:为什么VLC for Unity在Android上绕过Unity音频系统?这个问题不是“插件用得不对”,而是VLC for Unity在Android平台上的架构级设计选择。我第一次遇到这个现象时,也以为是配置漏了——把Audio Source拖上去、勾上Play…...

固件逆向实战指南:从熵值分析到函数重建的七步法

1. 这不是“刷机教程”,而是一份固件逆向的实战切片很多人第一次听说“固件逆向”,脑子里浮现的是路由器刷OpenWrt、智能摄像头换壳跑Home Assistant,或者某款老式NAS突然不支持新硬盘,只好翻出U-Boot命令硬怼。这些确实是固件逆向…...

数据可视化:交互式图表与大屏展示

数据可视化:交互式图表与大屏展示 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊数据可视化这个重要话题。作为一个全栈开发者,数据可视化是将数据转化为有意义信息的关键。今天就来分享一下交互式图表和大屏展示的实…...

Android HTTPS抓包全解:从Charles配置到证书固定绕过

1. 为什么你手机App的HTTPS请求总像黑箱&#xff1f;——从“看不到”到“全透明”的真实起点你有没有过这种经历&#xff1a;在测试一个安卓App时&#xff0c;明明界面上显示加载失败&#xff0c;但Logcat里翻来覆去全是D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeout…...

大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂

大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂 副标题: 从0到1构建大模型的完整路径,附实战避坑指南 一、痛点:为什么大模型训练这么复杂? 很多开发者第一次接触大模型训练时,会被各种术语绕晕:预训练、SFT、RLHF、DPO、LoRA… 感觉像在看天书。 更糟糕的…...

AI量化交易中的信号相关性与认知依赖:系统性风险与应对策略

1. 项目概述&#xff1a;当AI成为市场共识&#xff0c;系统性风险如何被“编程”&#xff1f;在金融市场的交易大厅和量化部门的代码仓库里&#xff0c;一场静默的变革已经持续了十年。这不是关于某个算法战胜了市场&#xff0c;而是关于市场本身正在被算法重新定义。核心矛盾在…...

Midjourney颗粒度失控急救包:1键降噪工作流(含自研NoiseMap可视化插件+Discord私密调试频道入口)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney颗粒感失控的本质诊断与认知重构 Midjourney生成图像中异常的颗粒感&#xff08;graininess&#xff09;&#xff0c;并非单纯由参数噪声或分辨率不足引发&#xff0c;而是模型隐空间解码过程中多层…...

商业AI公司与国防部合作:吸引力、障碍与深层博弈

1. 商业AI公司与国防部合作&#xff1a;吸引力、障碍与深层博弈在硅谷的咖啡厅或波士顿的创业孵化器里&#xff0c;当一群AI公司的创始人或技术高管围坐讨论潜在客户时&#xff0c;“美国国防部”&#xff08;DoD&#xff09;这个名字的出现&#xff0c;往往会引发一阵复杂的沉…...

计算机视觉模型公平性优化:如何规避帕累托低效陷阱

1. 项目概述&#xff1a;当公平遇上效率&#xff0c;一个被忽视的视觉模型“隐形税”最近在复现和评估几个主流的公平性算法时&#xff0c;我遇到了一个令人困惑的现象&#xff1a;在多个公开的人脸识别和医疗影像分类数据集上&#xff0c;那些旨在提升模型对特定群体&#xff…...

从事件关系网络看现有AI技术:一个统一的底层解释框架

在前几篇文章中&#xff0c;我提出了一个核心命题&#xff1a;智能的本质不是“知道什么”&#xff0c;而是“知道在发生什么”。 要实现这种智能&#xff0c;我们的AI系统必须从处理“实体”转向处理“事件”。事件不是孤立的存在者&#xff0c;而是在关系网络中确定自身意义的…...

兰亭妙微|UI设计外包中的UI图标设计核心技巧与设计师职业发展指南

在UI设计的视觉体系中&#xff0c;图标是传递信息的视觉语言&#xff0c;也是产品个性的关键载体。一枚富有设计感的图标&#xff0c;既能降低用户认知成本&#xff0c;又能让产品更具竞争力。北京兰亭妙微团队从工具选择、设计流程到个性表达&#xff0c;拆解UI图标创作的核心…...

Linux-安装cmatrix

linux-安装cmatrix &#xff08;黑客帝国矩阵效果&#xff09; su root #切换身份到root不受权限控制 cd /usr/src #进入源码下载位置&#xff0c;准备下载安装包利用xftp 共享传送文件进入home找到文件&#xff0c;cp 文件 /usr/src解压&#xff0c;进…...

【电子通识】贴片电阻上的丝印332、5R6、1502、01C怎么读出阻值?

背景 【电子通识】为什么大多数插件电阻使用色环表示阻值-CSDN博客中我们讲到了色环电阻怎么读出电阻值&#xff0c;那么我们现在在一些更精密的电路板上看到的贴片电阻要怎么读出电阻值呢&#xff1f; 一般来说除小于0402封装的贴片电阻外&#xff0c;我们可以看到贴片电阻上都…...

荣耀出征官方下载地址|装备绑定与非绑定决策分析

认准奇迹mu&#xff1a;荣耀出征官方直营官网主站与认证入口体验正版游戏&#xff08;资质可查&#xff0c;安全合规&#xff09;《奇迹mu&#xff1a;荣耀出征》是合规申报的移动类型经典复刻怀旧奇迹mu手游,已经在《奇迹mu&#xff1a;荣耀出征》官网主站首发上线。游戏高度还…...

DVWA通关教程2

本博客所有网络安全相关教程、漏洞原理、渗透实操、攻防技术等内容&#xff0c;仅用于合法安全学习、白帽技术交流、企业授权安全测试。 所有技术严禁用于未授权探测、非法入侵、数据窃取、网络攻击等任何违反《中华人民共和国网络安全法》的违法行为。 任何个人利用本文内容实…...

AI编程新纪元已来(Claude 3.5 Sonnet代码能力压测报告:GitHub Copilot vs Cursor vs 原生Claude)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI编程新纪元已来&#xff08;Claude 3.5 Sonnet代码能力压测报告&#xff1a;GitHub Copilot vs Cursor vs 原生Claude&#xff09; AI编程工具正经历一场静默而深刻的范式迁移——Claude 3.5 Sonnet …...

【Midjourney饱和度调控黄金法则】:20年AI视觉调校专家亲授3类典型过曝/灰暗场景的7步精准校正流程

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney饱和度调控的核心原理与认知重构 Midjourney 的饱和度&#xff08;Saturation&#xff09;并非独立控制的图像参数&#xff0c;而是嵌套于其隐式色彩空间映射与扩散过程中的动态响应变量。它由模型…...

Keil C51中RTX51 Tiny任务列表显示异常的解决方案

1. 问题现象与背景解析在Keil C51开发环境中使用RTX51 Tiny实时操作系统时&#xff0c;开发者经常会遇到一个典型问题&#xff1a;在Vision调试器的RTX-Tiny Tasklist窗口中&#xff0c;任务列表显示为空&#xff0c;没有任何任务状态信息。这种现象通常发生在项目已正确创建任…...

图像增强与半监督学习在语义分割中的应用

1. 图像增强技术在语义分割中的应用原理计算机视觉领域的语义分割任务要求模型对图像中的每个像素进行分类&#xff0c;这需要模型具备强大的特征提取能力和泛化性能。图像增强技术通过人为引入数据多样性&#xff0c;成为提升模型鲁棒性的关键手段。在语义分割任务中&#xff…...

超星***滑块逆向分析

本篇文章仅用于交流与学习&#xff0c;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除。感谢关注&#xff01;您的关注和点赞就是我的动力1.逆向目标aHR0cHM6Ly92OC5jaGFveGluZy5jb20v2.逆…...

还不会通义千问向量嵌入?LangChain + DashScopeEmbeddings 全实战:原理、调用、相似度计算、RAG 落地一站式精通

文章标签&#xff1a;#LangChain #DashScope #通义千问 #Embedding #向量检索 #RAG &#x1f4dd; 本章学习目标 本章聚焦阿里云通义千问 DashScopeEmbeddings LangChain 向量嵌入实战&#xff0c;帮助读者从零到一掌握&#xff1a;DashScope 向量模型原理、LangChain 集成方…...

昇腾CANN skills:社区技能与开发工具集的实战解读

CANN skills 是昇腾开源社区提供的「脚手架工具」集——不是算子、不是加速库、不是框架适配。它是辅助开发的命令行工具和脚本&#xff0c;帮助开发者在昇腾 NPU 上更快地上手、调试、部署。CANN 社区的同学用得最多的包括&#xff1a;算子开发脚手架&#xff08;op-gen&#…...