C语言【基础篇】之数组——解锁多维与动态数组的编程奥秘

news2025/2/11 9:15:39

数组

  • 🚀前言
  • 🦜数组的由来与用途
  • 🌟一维数组详解
  • 🖊️二维数组进阶
  • 💯动态数组原理
  • 🤔常见误区扫盲
  • 💻学习路径建议
  • ✍️总结

🚀前言

大家好!我是 EnigmaCoder。本文收录于我的专栏 C,感谢您的支持!

  • 前文我们介绍了C语言中的流程控制。
  • 链接: C语言【基础篇】之流程控制——掌握三大结构的奥秘
  • 本文我们将介绍C语言中的重要篇章——数组。

在这里插入图片描述


🦜数组的由来与用途

  • 1.1 为什么要用数组?
    想象一个现实案例:学校图书馆需要管理5000本图书的借阅状态。如果使用单变量存储:
int book1_status, book2_status, ..., book5000_status; 
  • 这种方式存在三个致命缺陷
      1. 变量命名工作量巨大
      1. 无法通过循环批量处理
      1. 内存分配零散难维护

数组的出现完美解决这些问题:

int book_status[5000]; // 一条语句声明全部状态变量 

1.2 内存组织形式
数组的每个元素在内存中按顺序紧密排列,假设声明int arr[5]

内存地址 | 元素值 
0x1000  | arr[0]
0x1004  | arr[1]
0x1008  | arr[2]
0x100C  | arr[3]
0x1010  | arr[4]

这种连续存储特性带来两个优势:

  • 快速定位:通过首地址+偏移直接访问任何元素
  • 批量处理:适合循环结构统一操作

🌟一维数组详解

  • 2.1 定义语法
元素类型 数组名[元素个数];
  • 元素类型:确定每个存储单元占用的内存大小(如int占4字节)

  • 元素个数:必须是常量表达式(C99后支持变量长度数组)

  • 示例:

    /* 完全初始化 */
    int primes[5] = {2,3,5,7,11};
    
    /* 自动补齐初始化 */
    double measures[3] = {1.5}; // 剩余元素自动补0.0 
    
    /* 省略长度声明 */
    char colors[] = {'R','G','B'}; // 编译器自动计算为3元素 
    
  • 2.2 安全访问机制

核心隐患:数组越界
下图展示一个典型越界错误的内存覆盖场景:

[合法区域] | arr[0] | arr[1] | arr[2] | ...
地址         0x1000   0x1004   0x1008 
索引越界访问arr[3] → 侵入0x100C未知区域 

防范措施:

// 使用安全范围检测 
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
 
for(int i=0; i<ARRAY_SIZE(arr); i++){
    // 安全操作 
}

🖊️二维数组进阶

  • 3.1 多维的本质
    二维数组两种的理解视角:

      1. 矩阵视角:表格式数据排列,适合表达行列表格数据
    int matrix[3][4]; // 3行4列矩阵 
    
      1. 数组的数组:本质是嵌套的一维数组,每个元素为一维数组
    // 等价写法 
    typedef int Row[4];
    Row matrix[3];
    
  • 3.2 初始化差异分析
    完全初始化与分行初始化的区别:

// 紧凑方式初始化 
int a[2][3] = {1,2,3,4,5,6};
 
// 分行初始化(推荐)
int b[2][3] = {
    {1,2,3},
    {4,5,6}
};
 
// 验证排列顺序 
printf("%d", a[1][2]); // 输出6 
printf("%d", b[1][2]); // 同样输出6 

💯动态数组原理

  • 4.1 内存生命周期管理

对比三种数组存储期特性:

数组类型存储位置声明周期使用场景
全局数组数据段程序运行全程配置参数
局部静态数组数据段函数调用保持持久缓存
局部自动数组栈空间函数退出释放临时缓冲区
动态分配数组堆空间手动控制释放大数据存储
  • 4.2 动态扩容标准范式
    六步骤保证内存安全:
int *arr = NULL;    // Step1: 初始化指针为NULL 
int size = 0;
 
// 初始分配 
arr = malloc(5*sizeof(int)); // Step2: 首次分配 
size = 5;
 
// 扩容操作 
int *temp = realloc(arr, 10*sizeof(int)); // Step3: 使用中间变量 
if(temp == NULL) {   // Step4: 检测分配结果 
    free(arr);       // Step5: 原保留内存 
    exit();
1}
 =arr temp;          // Step6: 安全替换指针 
size = 10;

🤔常见误区扫盲

Q1:数组名是常指针吗?

  • 正确理解:数组名在多数场景可视为指向首元素的指针常量,但sizeof(arr)会返回数组总长度而非指针大小,这体现了类型系统的抽象层级。

Q2:数组作为参数传递的本质?

// 函数声明等效写法 
void func(int arr[]);
void func(int *arr); 

数组参数实际传递的是指针,因此修改形参会影响实参数组内容。

Q3:为何下标可以是变量?
编译原理层面,数组访问会被转换为指针运算:

arr[i] 等价于 *(arr + i)

只要i在合法范围内,允许运行时动态计算索引。


💻学习路径建议

理论到实践步骤:

  1. 手工绘制内存图:理解数组物理存储形态
  2. 调试观察地址变化:验证元素地址计算规则
  3. 手写模拟数组操作:不使用[]实现数组访问

进阶学习方向:

  • 数组与指针的交集与差异
  • 数组在处理字符串中的特殊应用
  • 动态数组与链表结构的优劣比较

✍️总结

本文主要讲解C语言中数组的相关知识,包括一维数组二维数组以及动态数组。如果对您有帮助,不妨点个赞👍👍👍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2295519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握API和控制点(从Java到JNI接口)_38 JNI从C调用Java函数 01

1. Why? 将控制点下移到下C/C层 对古典视角的反思 App接近User&#xff0c;所以App在整体架构里&#xff0c;是主导者&#xff0c;拥有控制权。所以&#xff0c; App是架构的控制点所在。Java函数调用C/C层函数&#xff0c;是合理的。 但是EIT造形告诉我们&#xff1a; App…

windows蓝牙驱动开发-蓝牙 LE 邻近感应配置文件

邻近感应检测是蓝牙低功耗 (LE) 的常见用途。 本部分提供了创建可用于开发 UWP 设备应用的邻近感应配置文件的设备实现的指南。 在开发此应用之前&#xff0c;应熟悉蓝牙 LE 函数和蓝牙 LE 邻近感应配置文件规范。 示例服务声明 蓝牙低功耗引入了一个新的物理层&#xff0c;…

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …

C++:类和对象初识

C&#xff1a;类和对象初识 前言类的引入与定义引入定义类的两种定义方法1. 声明和定义全部放在类体中2. 声明和定义分离式 类的成员变量命名规则 类的访问限定符及封装访问限定符封装 类的作用域与实例化类的作用域类实例化实例化方式&#xff1a; 类对象模型类对象的大小存储…

伪分布式Spark3.4.4安装

参考&#xff1a;Spark2.1.0入门&#xff1a;Spark的安装和使用_厦大数据库实验室博客 我的版本&#xff1a; hadoop 3.1.3 hbase 2.2.2 java openjdk version "1.8.0_432" 问了chatgpt,建议下载Spark3.4.4&#xff0c;不适合下载Spark 2.1.0: step1 Spark下载…

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…

【R语言】数据分析

一、描述性统计量 借助R语言内置的airquality数据集进行简单地演示&#xff1a; 1、集中趋势&#xff1a;均值和中位数 head(airquality) # 求集中趋势 mean(airquality$Ozone, na.rmT) # 求均值 median(airquality$Ozone, na.rmT) # 求中位数 2、众数 众数&#xff08;mod…

传输层协议 UDP 与 TCP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 前置复盘&#x1f98b; 传输层&#x1f98b; 再谈端口号&#x1f98b; 端口号范围划分&#x1f98b; 认识知名端口号 (Well-Know Port Number) 二&#xf…

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…

即梦(Dreamina)技术浅析(六):多模态生成模型

多模态生成模型是即梦(Dreamina)的核心技术之一,旨在结合文本和图像信息,生成更符合用户需求的视觉内容。多模态生成模型通过整合不同类型的数据(如文本和图像),能够实现更丰富、更精准的生成效果。 1. 基本原理 1.1 多模态生成模型概述 多模态生成模型的目标是结合不…

递增三元组(蓝桥杯18F)

暴力求解&#xff1a; #include<iostream> using namespace std; int main() {int N;cin >> N;int* A new int[N];int* B new int[N];int* C new int[N];for (int i 0; i < N;i) {cin >> A[i];}for (int i 0; i < N; i) {cin >> B[i];}for…

计算机毕业设计SparkStreaming+Kafka广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

FreeCAD创建零件(系列1)

1、新建草图绘制1个矩形 2、画1个半圆弧 3、增加一个约束点 4、标注距离 5、将线段转为辅助线 将图中的线段切换为辅助线,线条颜色之后转为蓝色线。 6、离开草图

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…

mes系统对工业数字化转型起到重要作用,它的实际应用有哪些

一、生产计划与调度 在工业数字化转型中&#xff0c;MES 系统能够对生产计划进行高效的管理和调度。通过与企业资源计划&#xff08;ERP&#xff09;系统的集成&#xff0c;MES 可以获取生产订单信息&#xff0c;并根据生产设备的状态、人员安排以及物料供应情况等因素&#x…