C语言 —— 浮生百态 生灭有时 - 数组

news/2025/2/22 13:15:25/

目录

1. 数组的概念

2. ⼀维数组的创建和初始化

2.1 数组创建

2.2 数组的初始化

2.3 数组的类型

3. ⼀维数组的使用

3.1 数组下标的访问

4. ⼀维数组在内存中的存储

5. ⼆维数组的概念

5.1 ⼆维数组的创建

5.2 ⼆维数组的初始化

6. ⼆维数组的使用

6.1 ⼆维数组的下标

6.2 二维数组的存储

7. C99中的变长数组


1. 数组的概念

数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:

     
1. 数组中存放的是1个或者多个数据,但是数组元素个数不能为0  

   
2. 数组中存放的多个数据,类型是相同的

   
3. 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组

   

4. 数组可以没有初始值和大小


2. ⼀维数组的创建和初始化

2.1 数组创建

   
⼀维数组语法形式:

type arr_name[常量值];int arr[20] = {0};

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型

type 指定的是数组中存放数据的类型,如: char、short、int、float 等,也可以自定义类型
arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就行
[] 中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行
int math[20];char ch[8];double score[10];

2.2 数组的初始化

将数据放在大括号中就是数组的初始化

//完全初始化
int arr[5] = { 1,2,3,4,5 };//不完全初始化
//第⼀个元素初始化为1,剩余的元素默认初始化为0
int arr2[6] = { 1 };//错误的初始化 - 初始化项太多
int arr3[3] = { 1, 2, 3, 4 };

2.3 数组的类型
 

数组也是有类型的,数组算是⼀种自定义类型,去掉数组名留下的就是数组的类型

int arr1[10];int arr2[12];char ch[5];

arr1数组的类型是 int [10]        arr2数组的类型是 int[12]        ch 数组的类型是 char [5]

 


 

3. ⼀维数组的使用

我们知道,⼀维数组可以存放数据,存放数据的目的是对数据的操作,那么我们应该如何使用呢?

3.1 数组下标的访问

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号

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

在C语⾔中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符

   
有了下标访问操作符,我们就可以轻松的访问到数组的元素了

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//访问下标为2的元素printf("%d\n", arr[2]);//访问下标为3的元素printf("%d\n", arr[3]);return 0;
}

访问整个数组的内容

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}


4. ⼀维数组在内存中的存储

依次打印数组元素的地址

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;for (i = 0; i < 10; i++){printf("&arr[%d] = %p\n ", i, &arr[i]);}return 0;
}

我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节),所以我们得出结论:数组在内存中是连续存放的


5. ⼆维数组的概念

 

我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组

5.1 ⼆维数组的创建

二维数组语法形式:

   

type arr_name[常量值1][常量值2];例如:
int arr[3][5];
double data[2][8];3表⽰数组有3⾏
5表⽰每⼀⾏有5个元素
int 表⽰数组的每个元素是整型类型
arr 是数组名,可以根据⾃⼰的需要指定名字
data数组意思基本⼀致。

5.2 ⼆维数组的初始化

⼆维数组的初始化和⼀维数组⼀样,也是使⽤⼤括号初始化的

不完全初始化

int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

完全初始化

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

 

2345为第一行,23456为第二行,34567为第三行

初始化时可以省略行,但是不能省略列

int arr5[][5] = { 1,2,3 };int arr6[][5] = { 1,2,3,4,5,6,7 };int arr7[][5] = { {1,2}, {3,4}, {5,6} };


6. ⼆维数组的使用


6.1 ⼆维数组的下标

⼆维数组的访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素

    
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的

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

int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };printf("%d\n", arr[2][4]);printf("%d\n", arr[2][2]);printf("%d\n", arr[1][4]);return 0;
}

 


 打印整个二维数组
   

int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };int i = 0;//遍历⾏//输⼊for (i = 0; i < 3; i++) //产⽣⾏号{int j = 0;for (j = 0; j < 5; j++) //产⽣列号{scanf("%d", &arr[i][j]); //输⼊数据}}//输出for (i = 0; i < 3; i++) //产⽣⾏号{int j = 0;for (j = 0; j < 5; j++) //产⽣列号{printf("%d ", arr[i][j]); //输出数据}printf("\n");}return 0;
}

6.2 二维数组的存储

像一维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址

int main()
{int arr[3][5] = { 0 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

和一维数组一样,⼆维数组中的每个元素也是连续存放的


7. C99中的变长数组

在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小

比如:

int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};

这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够用的

C99中给⼀个变⻓数组(VLA)的新特性,允许我们可以使⽤变量指定数组大小,如:

   

int n = a+b;
int arr[n];

数组 arr 就是变长数组,它的长度取决于变量 n 的值,编译器无法事先确定,只有运行时才能知道n是多少

   

变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化


完结撒花~


http://www.ppmy.cn/news/1574165.html

相关文章

BUUCTF-Web方向16-20wp

目录 [极客大挑战 2019]PHP[ACTF2020 新生赛]BackupFile[RoarCTF 2019]Easy Calc[极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5 [极客大挑战 2019]PHP 由内容提示应该存在源码备份&#xff0c;常见的如下&#xff0c;一个个尝试 后缀&#xff1a;tar tar.gz zip rar 名字&am…

人工智能驱动的自动驾驶:技术解析与发展趋势

&#x1f30d; 人工智能&#xff08;AI&#xff09;正在彻底变革自动驾驶技术。 从感知到决策&#xff0c;从定位到控制&#xff0c;AI 的发展让汽车越来越接近真正的无人驾驶。本文将详细解析 AI 在自动驾驶中的核心应用&#xff0c;深入探讨各个关键技术&#xff0c;并展望未…

小程序的分包

1.分包的概念以及基本用法 2.在小程序项目里面添加自己的分包 3.给分包加上别名 4.查看分包体积大小 5.分包的打包原则 6.分包的引用原则 7.独立分包 8.分包的预下载

[GESP202406 六级] 二叉树

题目描述 小杨有⼀棵包含 n n n 个节点的二叉树&#xff0c;且根节点的编号为 1 1 1。这棵二叉树任意⼀个节点要么是白色&#xff0c;要么是黑色。之后小杨会对这棵二叉树进行 q q q 次操作&#xff0c;每次小杨会选择⼀个节点&#xff0c;将以这个节点为根的子树内所有节点…

C#功能测试

一、List 内部元素为引用 src[0]的Name为"11"&#xff0c;说明修改了引用 List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2"…

一篇文章理解常用的前端设计模式

前端设计模式 一.设计模式概览 设计模式是针对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;每种设计模式都有每种语言中的具体实现方式。学习设计模式更多是理解各个模式的内在思想和解决…

深入了解 mica-auto:自动生成 Java SPI 和 Spring Boot 配置的利器

1. mica-auto 出现的背景 在 Java 开发中,尤其是在构建 Spring Boot 项目和使用 Java SPI(Service Provider Interface)机制时,开发者常常面临配置文件编写的繁琐问题。 1.1 Java SPI 的配置痛点 Java SPI 是一种服务发现机制,允许第三方为程序提供扩展实现。使用 SPI …

基于LangGraph和Ollama实现可调用AI搜索引擎Tavily的Agentic RAG问答机器人

这篇博客将和大家分享如何快速实现一个运行逻辑相较于传统链式RAG&#xff08;用户询问 -> 检索相关信息作为上下文 -> LLM推理回复&#xff09;更为智能、适应性更强的Agentic RAG Chatbot&#xff08;实现思路参考 Langgraph Agentic RAG 实现官方文档教程&#xff09;…