C语言(11)—— 数组(超绝详细总结)

Hi!冒险者😎,欢迎闯入 C 语言的奇幻异世界🌌!

我是 ankleless🧑‍💻,和你一样的闯荡者~ 这是我的冒险笔记打怪升级之路------C语言之路📖,里面有踩过的坑🕳、攒的技能🌟、遇的惊喜🌈,希望能帮你少走弯路✨。

愿我们在代码山峦⛰各自攀登,顶峰碰拳👊,共赏风景呀!🥳

目录

[1. 数组的概念](#1. 数组的概念)

[2. 一维数组](#2. 一维数组)

[2.1 一维数组的创建](#2.1 一维数组的创建)

[2.2 一维数组的初始化](#2.2 一维数组的初始化)

[2.3 一维数组的类型](#2.3 一维数组的类型)

[2.4 一维数组下标](#2.4 一维数组下标)

[2.5 一维数组元素的输入和输出](#2.5 一维数组元素的输入和输出)

[2.6 一维数组在内存中的存储](#2.6 一维数组在内存中的存储)

[2.7 sizeof操作符](#2.7 sizeof操作符)

[3. 二维数组](#3. 二维数组)

[3.1 二维数组的概念](#3.1 二维数组的概念)

[3.2 二维数组的创建](#3.2 二维数组的创建)

[3.3 二维数组的初始化](#3.3 二维数组的初始化)

[3.3.1 不完全初始化](#3.3.1 不完全初始化)

[3.3.2 完全初始化](#3.3.2 完全初始化)

[3.3.3 按照行初始化](#3.3.3 按照行初始化)

[3.3.4 初始化的省略](#3.3.4 初始化的省略)

[3.4 二维数组下标](#3.4 二维数组下标)

[3.5 二维数组的输入和输出](#3.5 二维数组的输入和输出)

[3.6 二维数组在内存中的存储](#3.6 二维数组在内存中的存储)

1. 数组的概念

数组是一组相同类型元素的集合,他是一种数据结构,用于按顺序存储相同类型的多个数据元素

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

数组中存放的多个数据的类型是相同的。

数组分为一维数组多维数组 ,多维数组一般比较多见的是二维数组

2. 一维数组

2.1 一维数组的创建

我们常常使用下列的代码来创建一个简单的一维数组:

cpp 复制代码
type  arr  [数值常量];
type 为元素类型
arr  为数组名称

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

type指的是数组中存放数据的类型,可以是:char、short、int、float等,也可以是自定义的类型,如结构体;

arr指的是数组名的名字,这个名字我们可以根据数组在程序中的作用进行命名,增强代码可读性;

[ ] 中的常量值用来指定数组的大小,这个数组的大小是根据实际需求指定的,一经创建,他的内存空间就是固定的,这种方法也被称为静态定长数组的创建

比如:我们希望存储10次模拟考试的成绩,我们可以创建如下数组:

cpp 复制代码
int score [10];//score有分数的意思,可以提高代码的可读性

2.2 一维数组的初始化

创建了数组之后,我们还需要对一维数组进行初始化,否则未经初始化得到的内存空间会留有"脏数据 "(如下图)

在数组的创建时,我们需要给他一些初始值,这个操作我们称为数组的初始化

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

2.3 一维数组的类型

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

cpp 复制代码
int arr1[10];//数组类型为int [10]
int arr2[12];//数组类型为int [12]
char ch[5];//数组类型为char [5]

那我们应该如何使用一维数组呢?

2.4 一维数组下标

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

cpp 复制代码
int arr[10] = {1,2,3,4,5,6,7,8,9,10}

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

有了下标 和**[ ]操作符**这两个工具,我们就能快速访问数组中的一个元素,体现了数组的随机访问的特点。

如果我们想输出arr数组中的元素7,就可以使用arr[6];如果我们访问arr[0],得到的元素就是1。

cpp 复制代码
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
		printf("%d ", arr[6]);//7
		printf("%d ", arr[0]);//1
	return 0;
}

2.5 一维数组元素的输入和输出

那么我们应该如何对一个数组进行数据的输入和打印呢,这里我们可以用到for循环、scanf函数、printf函数相结合的方法,具体实现方式如下:

cpp 复制代码
int main()
{
	int arr[10] = {0};
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

2.6 一维数组在内存中的存储

一维数组中的元素在内存中是如何存储的呢?我们可以通过打印他们的地址来进行观察

从输出结果来看,数组随着小标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4,(因为一个整型是4个字节)。所以我们可以知道:数据在内存中是连续存放的

也是因为数组的这个特性,我们可以通过指针的形式来访问它的数据元素,具体讲解见如下文章:C语言(09)------关于指针(逐渐清晰版)_内存指针-CSDN博客

2.7 sizeof操作符

在C和C++中,sizeof是一个操作符,不是函数

sizeof可以用来计算类型或者变量的大小,数组也是一种数据类型,故而使用sizeof我们可以得到数组的大小:

cpp 复制代码
#include <stido.h>
int main()
{
 int arr[10] = {0};
 printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节
 return 0;
}

加上接下来的代码,我们也可以求得数组的元素个数:

cpp 复制代码
printf("%d",sizeof(arr)/sizeof(arr[0]));

3. 二维数组

3.1 二维数组的概念

一维数组的元素都是内置类型的,当我们把一维数组作为数组的元素时,就产生了二维数组 ,二维数组作为数组元素的数组被称为三维数组 ,二维数组以上的数组统称为多维数组

3.2 二维数组的创建

二维数组我们又该如何创建呢?

cpp 复制代码
type arr_name[常量值1][常量值2];

例如:
int arr[3][5];
double data[2][8];

在上述的例子int arr[3][5]中:

3表示数组有3行;

5表示每一行有5个元素;

int表示数组的每个元素都是整型类型;

arr是数组名,可以根据自己的需求制定名字。

3.3 二维数组的初始化

二维数组创建时,我们给他们设置一些初始值,这个过程我们称为二维数组的初始化。

3.3.1 不完全初始化
cpp 复制代码
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
3.3.2 完全初始化
cpp 复制代码
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
3.3.3 按照行初始化
cpp 复制代码
int arr4[3][5] = {{1,2},{3,4},{5,6}};
3.3.4 初始化的省略
cpp 复制代码
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}};

3.4 二维数组下标

类比一维数组,下标在数组中的功能是强大的,那我们应该如何使用下标来确定特定的数组元素呢?二维数组是有行和列的(即下标),只要锁定了行和列就能唯一锁定数组中的一个元素。

cpp 复制代码
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:


图中最右侧绿色的数字表示行号,第一行蓝色的数字表示列号,都是从0开始的,比如,我们说第二行第四列,我们就可以快速定位到数组元素7。

3.5 二维数组的输入和输出

参考一维数组的输入和输出,二维数组的变更就是多了一个下标值的判断,即嵌套一次循环,具体实现方式如下:

cpp 复制代码
#include <stdio.h>
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;
}

3.6 二维数组在内存中的存储

同样地,我们也可以通过对二维数组元素地址的打印来剖析他在内存中的存储方式:

观察输出的结果,我们可以发现每一个内部的元素都是相邻的,地址之间相差4个字节(int类型的空间大小),跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是相差4个字节,所以在二维数组中的每个元素也是连续存放 的,这是数据结构中的顺序存储结构典型表现形式。

附:一些小tips(晚些更新~)

相关推荐
promising-w3 小时前
【嵌入式C语言】六
c语言·开发语言
草莓熊Lotso5 小时前
《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
c语言·开发语言·c++·笔记·其他
野生的编程萌新7 小时前
从冒泡到快速排序:探索经典排序算法的奥秘(二)
c语言·开发语言·数据结构·c++·算法·排序算法
谱写秋天18 小时前
FreeRTOS中断服务程序(ISR)详细讲解
c语言·freertos·isr
GUET_一路向前21 小时前
【C语言】解释形参void *data用法
c语言·开发语言·通用指针
pusue_the_sun1 天前
数据结构——顺序表&&单链表oj详解
c语言·数据结构·算法·链表·顺序表
风铃7771 天前
c/c++ Socket+共享内存实现本机进程间通信
linux·c语言
John.Lewis1 天前
数据结构初阶(15)排序算法—交换排序(快速排序)(动图演示)
c语言·数据结构·排序算法