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

8级-数组

前情回顾:在7级的时候,我们学习了如何定义、使用函数


目录

概念

什么是数组?

一维数组

声明

初始化

访问元素

 计算数组长度

二维数组

 声明

 初始化

访问元素

思考

一维数组在内存中如何存储?

二维数组在内存中如何存储?


概念

什么是数组?

答:数组是一种线性数据结构,它用于存储一组相同类型的数据元素。它将多个具有相同数据类型的数据元素存储在一个连续的内存空间中。这些数据元素可以通过一个统一的名字(数组名)和索引来访问,即连续存储方式。数组的分配方式有:静态分配和动态分配。本章都是静态分配。


一维数组

声明

数据类型 数组名[数组大小];

 例如:

int arr[5]; // 声明一个包含5个整型元素的数组
float prices[10]; // 声明一个包含10个浮点型元素的数组
char name[20]; // 声明一个包含20个字符的数组

初始化

数组可以在声明时初始化,也可以部分初始化,然后在后续的代码中逐个赋值。

int arr[5] = {1, 2, 3, 4, 5}; // 初始化一个包含5个整数的数组
char str[10] ="HelloWorld"; // 初始化一个字符串

除了指定数组长度外,还有一种方式:数组长度根据初始化元素个数来决定,如下:

int arr[] = {1, 2, 3, 4, 5}; // 初始化一个整数数组,数组长度5个
char str[] ="HelloWorld"; // 初始化一个字符串,数组长度即是字符串长度

当数组元素为同一个数组时,可以采用统一初始化的方式,如下:

int arr[5] = {0};

访问元素

        数组元素可以采用下标访问。数组的元素在内存中是连续存放的,并且随着数组下标的增长,地址也是由低到高增长的。格式:数组名[下标]

接下来,使用for循环语句对数组进行遍历访问,如下:

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5}; //数组的初始化 //数组的遍历 for(int i=0;i<5;i++)printf("%d\n",arr[i]);return 0;
}

结果:

遍历访问数组元素,也可以实现逐个初始化。如下:

#include <stdio.h>int main() {int arr[5]; //数组的定义 //数组的遍历 for(int i=0;i<5;i++)arr[i] = i;    //元素赋值return 0;
}

 计算数组长度

当拿到某个数组时,不清楚其长度,可以用sizeof()函数来计算该数组的长度。

数组长度==数组总大小/数组元素大小

例程:

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5}; //数组的初始化 int len = sizeof(arr) / sizeof(arr[0]); //数组长度=数组总大小/数组元素大小 printf("arr数组长度:%d",len);return 0;
}

结果:


二维数组

 声明

 二维数组可以看作是一个矩阵,其中的每个元素可以通过两个索引(行索引和列索引)来访问。

数据类型 数组名[行数][列数];

例如:

int arr[3][4];//创建一个3行4列的整形二维数组
char arr[3][5];//创建一个3行5列的整形二维数组
double arr[2][4];//创建一个2行4列的浮点型形二维数组

 初始化

 二维数组同一维数组类似,初始化同样可以全部初始化、部分初始化和统一初始化。

二维数组全部元素初始化,如下:

int arr[3][2] = {{1,2},{4,5},{6,7}};

二维数组部分元素初始化,如下:

int arr[3][2] = {{1,2},{4,5}};

统一初始化二维数组中的所有元素,如下:

int arr[3][2] = {0};

二维数组定义时可以省略行长度,但不能省略列长度!如下:

int arr[][2] = {{2,3},{4,5}};

访问元素

 格式:数组名[行号][列号]

接下来使用for嵌套循环来实现二维数组的遍历,如下:

#include <stdio.h>int main() {int arr[3][2] = {{1,2},{3,4},{5,6}};	//二维数组的初始化 //二维数组遍历 for(int i=0;i<3;i++){for(int j=0;j<2;j++){printf("%d ",arr[i][j]);}printf("\n");} return 0;
}

结果: 


思考

一维数组在内存中如何存储?

答:数组在内存中都是连续存储的,以下为例

int arr[10]={1,2,3,4,5,6,7,8,9,10};

 解析:数组名为arr,数组长度为10,数据类型为int类型,int类型占4B。

步骤:

(1)根据数组长度10,及int类型占4B(32bit),所以为该数组分配10×32=320bit的连续内存空间

(2)将初始值一一转成补码形式,逐个放入每个元素的内存空间中


二维数组在内存中如何存储?

虽然我们的二维数组逻辑上看成是3行4列,但这只是为了便于理解,它真正在内存中的存放还是连续的。

int arr[3][4];

解析: 二维数组数组名为arr,数据类型为int类型,int类型占4B。在其内存为存储为一维数组形式,arr转一维数组长度为3×4=12。如下图所示:

拓展: 由于二维数组在内存中是转一维数组形式存储的,所以对二维数组遍历时,采用按行遍历速度更快。


         在该系列中,文章的前部分采用简短的白话文讲解用法,而后部分采用更深入的角度讲解原理。思考是人类的结晶~如果你觉得有用,给我个点赞、收藏+关注哦~持续更新         

http://www.lryc.cn/news/2384911.html

相关文章:

  • 大模型 Agent 就是文字艺术吗?
  • YOLOv8检测头代码详解(示例展示数据变换过程)
  • JUC并发编程1
  • 消息队列RabbitMQ与AMQP协议详解
  • Day 29 训练
  • STM32开发环境配置——VSCode+PlatformIO + CubeMX + FreeRTOS的集成环境配置
  • Profibus转Profinet网关赋能鼓式硫化机:智能化生产升级的关键突破
  • redis 缓存穿透,缓存雪崩,缓存击穿
  • JAVA8怎么使用9的List.of
  • 告别手动测试:AUTOSAR网络管理自动化测试实战
  • BUCK电路利用状态空间平均法和开关周期平均法推导
  • MongoDB 用户与权限管理完全指南
  • C++滑动门问题(附两种方法)
  • 基于ITcpServer/IHttpServer框架的HTTP服务器
  • 初识main函数
  • FPGA高效验证工具Solidify 8.0:全面重构图形用户界面
  • SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全
  • java中string类型的list集合放到redis的5种数据类型的那种比较合适呢,可以用StringRedisTemplate实现
  • PyQt学习系列09-应用程序打包与部署
  • 实现图片自动压缩算法,canvas压缩图片方法
  • 《数据结构笔记三》:单链表(创建、插入、遍历、删除、释放内存等核心操作)
  • 光伏行业如何利用SD-WAN优化分布式网络:替代MPLS、VPN、4G/5G的网络架构升级与云安全方案全解析
  • 2025电工杯数学建模A题思路数模AI提示词工程
  • LLM | 论文精读 | NAACL 2025 | Clarify When Necessary:教语言模型何时该“问一句”再答!
  • 嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现
  • MDK的编译过程及文件类型全解
  • socc 19 echash论文部分解读
  • Linux Shell编程(八)
  • AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型
  • 手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)