文章目录
- 一、数组的概念
- 二、一维数组
- 1. 创建、初始化、类型
- 2. 数组的下标
- 3. 数组的输入
- 4. 计算数组元素个数
- 三、二维数组
- 1. 多维数组的概念
- 2. 二维数组的创建与初始化
- 3. 二维数组的下标
- 4. 二维数组的输入和输出
- 四、变长数组
- 五、数组练习
一、数组的概念
数组的概念是:一组相同类型元素的集合
其中值得注意的是:
- 数组中存放至少一个元素,不能是0个
- 数组中存放的所有数据,类型是相同的
数组一般分为一维数组和多维数组,多维数组中常用的是二维数组
二、一维数组
1. 创建、初始化、类型
一维数组创建的基本语法为:
type name[常量值];
type为数组中存放数据的类型,也就是数组的类型,比如 int,float,char 等。
name是数组的名字,可以根据实际情况任起。
[ ]中的常量值是用来规定数组大小的,一般会根据实际需求决定。
如果只是这么写的话也可以,代价是数组中所有数据一开始默认都是0,所以有时候我们需要对它进行初始化,可以使用大括号并将数据写在里面。
int arr[5] = {1,2,3,4,5};
- 当{ }里的元素个数不到[ ]里规定的个数时,系统还会把剩下的空缺部分初始化为0。
- 如果{ }里已经写定了几个数据,那么[ ]里就可以不用写东西,数组的大小就是写定数据的个数
int arr[] = {1,2,3,4,5};
//与上面等价
而数组的类型,就是指它的元素类型和大小,比如上面的数组 arr ,它的类型就是 int [5]
再比如,创建一个数组:char arr2[10];
,它的类型就是 char [10]
2. 数组的下标
C语言规定了数组是有下标的,它相当于数组中每个元素的编号,从0到 n-1(n是数组元素的个数)
比如创建一个数组char arr[5] = {'a','b','c','d','e'};
就有:
数据元素 | a | b | c | d | e |
---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 |
有了下标,我们就能访问数组中的某个特定元素了,比如我们想打印出这个数组中的字符c,它的下标是2,就可以写成:
#include<stdio.h>
int main()
{
char arr[5] = {'a','b','c','d','e'};
printf("%c\n", arr[2]);
return 0;
}
而假如想打印出这个数组中的所有数据,怎么办呢
乂~~循环语句嘛
#include<stdio.h>
int main()
{
char arr[5] = {'a','b','c','d','e'};
for(int i=0 ; i<=4 ; i++)
printf("%c ", arr[i]);
printf("\n");
return 0;
}
非常好理解叭!
3. 数组的输入
明白了数组的下标和访问,我们也可以根据具体需求,给数组输入想要的数据
#include <stdio.h>
int main()
{
int arr[10];
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4. 计算数组元素个数
在遍历数组时,我们有时会需要知道数组中的元素个数,怎么做到呢?我们可以使用 sizeof
sizeof 是C语言中的一个关键字,可以计算类型、变量、数组的大小。
举个栗子
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}
运行后屏幕上会打印出40—— int 类型的数据会占4个字节的内存,arr 中有十个 int 元素,就是40个字节了。
又因为数组中所有元素类型都是相同的,所以我们只要算出数组所占的总内存,除以该类型的数据应占的内存,不正是这个数组里的元素个数了吗?
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
//arr的总内存除以下标为0的元素的内存
printf("%d\n", sz);
return 0;
}
结果是10
听懂掌声
三、二维数组
1. 多维数组的概念
前面我们了解了一维数组,如果把一维数组作为数组的元素,这就是二维数组。如果把二维数组作为数组的元素,这就是三维数组…二维数组以上的数组统称为多维数组
(有点像绕口令)
你可以这么想象:在一维数组中,元素依次排成了一条直线。在二维数组中,有若干条这样的直线并排,形成了若干列。
一维数组:
1 | 2 | 3 | 4 | 5 |
---|
二维数组:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
2. 二维数组的创建与初始化
二维数组创建的基本语法为:
type name[常量值1][常量值2];
type 和 name 的含义同上
常量值1表示数组的行数
常量值2表示数组的列数
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
比如这个数组,就是[3][5]
在创建二维数组时,同样也要进行初始化,使用{ },但会有更多复杂情况:
- 完全初始化:
int arr[3][5] = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 |
- 不完全初始化:
int arr[3][5] = {1,2,3};
1 | 2 | 3 | 0 | 0 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
- 按照行初始化:
int arr[3][5] = {{1,2,3},{1,2,3},{1,2,3}};
1 | 2 | 3 | 0 | 0 |
---|---|---|---|---|
1 | 2 | 3 | 0 | 0 |
1 | 2 | 3 | 0 | 0 |
- 初始化时可以省略行,但不能省略列
int arr[][5] = {{1,2,3},{1,2,3},{1,2,3}};
1 | 2 | 3 | 0 | 0 |
---|---|---|---|---|
1 | 2 | 3 | 0 | 0 |
1 | 2 | 3 | 0 | 0 |
3. 二维数组的下标
二维数组也有下标。对于每行,从0到 n-1(n是列数)。对于每列,从0到 m-1(m是行数)
比如我们创建一个数组char arr[3][3] = {'a','b','c','d','e','f','g','h','i'};
就有:
0 | 1 | 2 | |
---|---|---|---|
0 | a | b | c |
1 | d | e | f |
2 | g | h | i |
这样就很明了了,arr[1][2]是 f,arr[2][0]是 g
4. 二维数组的输入和输出
访问整个一维数组,我们借助了一层循环。同理,访问整个二维数组时,我们可以借助两层循环。举个栗子,我们想输入15个数字,储存到一个三行五列的数组中并打印出来,可以写成:
#include <stdio.h>
int main()
{
int arr[3][5] = {0};
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;
}
tip:除了以上内容,我们还应该知道:数组(包括一维、二维)中的数据在内存中是连续存放的。后期学习指针时会用到
四、变长数组
在C99标准出来前,C语言在创建数组时,数组大小的指定只能用常量表达式。有时候我们事先不知道需要的数组大小,组大了可能会浪费空间,组小了可能又不够用。而C99给出了一个叫变长数组(VLA)的新特性,允许我们用变量指定数组大小。
比如int arr[n]
,arr 就是一个变长数组,编译器没办法事先知道 n 的值,只有开始运行后通过上面的某些代码确定 n 是多少。所以说,变长数组不能初始化。它的好处是我们不必在一开始就估计数组的大小,而是在程序运行时为数组分配好精确的大小。
不过,数组的大小一旦确定就不能再改变了,所以“变长数组”其实不能“变长”(乐)
可惜的是,VS2022还不能支持变长数组,目前我也不知道为什么o(╥﹏╥)o。大家想去测试的话,可以去gcc编译器等平台尝试,这里我就不演示了~(偷懒)
五、数组练习
说了这么多,来个栗子尝尝吧:
演示多个字符从左右两端移动,向中间移动
思路:设置变量 l r 作为下标,循环替换两边的字符
#include<stdio.h>
int main()
{
char arr1[] = "I LOVE ACGN";//要出现的字符
char arr2[] = "###########";//要被替换掉的字符
int l = 0;
int r = strlen(arr1)-1;
while(l<=r)
{
Sleep(1000);//让程序“睡”1000毫秒(一秒)再执行
arr2[l] = arr1[l];
arr2[r] = arr1[r];
l++;
r--;
printf("%s\n",arr2);
}
return 0;
}
本篇完,感谢阅读
下篇预告:函数