1. 数组的概念
数组是一组相同元素的集合,
- 数组中存放的是1个或者多个数据,但数组元素个数不能为0
- 数组中存放的多个数据,类型是相同的
数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
2. 一维数组的创建和初始化
2.1 数组创建
一维数组创建的基本语法如下,
bash
type arr_name[常量值]
存放在数组的值被称为数组的元素 ,数组在创建的时候可以指定数组的大小 和数组的元素类型。
type
指定的数组中存放的数据的类型,可以是char
,short
,int
,float
等,也可以自定义的类型。arr_name
:指定的数组的名称,这个名字根据实际应用场景,起的名字有意义即可[]
中的内容是一个常量值,用来指定数组的大小,这个大小可以根据实际情况指定即可
比如,我们现在想要存放某个班级的20名学生的数学成绩,那么我们可以创建一个数组,如下,
arduino
#include <stdio.h>
int main()
{
// 创建和初始化
// 数组有20个元素,每个元素的类型为 int
int math[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};//完全初始化
int math2[20] = { 0,1,2,3,4,5 }; // 不完全初始化,其余的元素默认初始化为0
return 0;
}
当然,我们也可以根据需要创建其他类型和大小的数组
arduino
#include <stdio.h>
int main()
{
char ch[5] = { 'a','b' };
char ch2[5] = "abc";
double arr[6] = { 0.0 }; // 不完全初始化,大小为6,数组中的元素类型为double
int arr2[3] = { 1,2,3 }; // 完全初始化
return 0;
}
2.2 数组的初始化
如上面的代码,在创建数组时,不仅可以指定数组的大小和数组中元素的类型,我们还可以给定一些初始值,这种就被称为初始化。我们进行数组的初始化时,一般使用大括号,将数组元素放在大括号中。
数组初始化的方式可以分为2种,一种是完全初始化,一种是不完全初始化。
arduino
//不完全初始化
int arr[5] = { 1,2,3,4,5 };
//不完全初始化
int arr2[5] = { 1 }; // 第一个元素初始化值为1,剩余元素默认初始化值为0
并且这里也需要注意的是一种错误的初始化方式,即初始化的值的个数超过了给定数组的大小,会出现如下的警告:
arduino
// 初始化的值的个数超过了给定数组的大小
int arr[5] = { 1, 2, 3, 4, 5, 6 };

2.3 数组的类型
数组也是有类型的,数组是一个自定义类型,去掉数组名剩下的部分就是数组的类型
例如,
ini
int arr1[10];
int arr2[32];
char ch[3];

我们按键盘上的F10
键,进入调试阶段,通过监视器可以看到
arr1
数组的类型是int [10]
arr2
数组的类型是int [32]
ch
数组的类型是char [5]
这里需要注意的是arr1
的数组的类型和arr2
的数组的类型是不同的。
3. 一维数组的使用
3.1 数组的下标
C语言规定数组是有下标的,下标是从0
开始的。假设数组有n
个元素,最后一个元素的下标是n-1
下标就相当于数组元素的编号,如下
ini
int arr[10] = { 1,2,3,4.5,6,7,8,9,10 };

在C语言中数组访问提供了一个操作符[]
,这个操作符叫做:下标引用操作符
有了下标引用操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7
的元素,我们就可以是使用arr[7]
;想要访问下标为3
的元素,我们就可以使用arr[3]
,参考代码如下
arduino
#include <stdio.h>
int main()
{
// 当对数据进行初始化的时候,数组的大小可以被省略。
// 编译器会根据数组的初始化内容,自动计算数组元素的个数
// int arr[10] = { 1,2,3,4.5,6,7,8,9,10 };
// 10 是指数组的元素个数的大小
int arr[] = { 1,2,3,4.5,6,7,8,9,10 };
printf("%d\n", arr[7]);
// 这里的7是数组元素的下标
printf("%d\n", arr[3]);
return 0;
}
3.2 数组元素的打印
如果要访问整个数组的内容,应该如何编写程序呢?
我们只需要产生数组所有元素的下标就可以了,那么,下面提供一个参考代码,利用for
循环产生0~9
的下标
ini
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
// 对应的下标 0,1,2,3,4,5,6,7,8, 9
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3.3 数组的输入
代码题:使用scanf
函数给数组输入10个值,并通过printf
函数输出数组的元素。
下面是参考代码
ini
#include <stdio.h>
int main()
{
int arr[10] = {0};//初始化数组
int i = 0; // 初始化下标
for (i = 0; i < 10; i++)
{
// 1,2,3,4,5,6,7,8,9,10
scanf("%d", &arr[i]);
}
// 打印
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
那么如果是打印输入10个元素的地址呢?
arduino
// %p - 地址
#include <stdio.h>
int main()
{
int arr[] = { 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(这是因为一个
int
类型的数据占4个字节)。因此我们可以得出结论:数组在内存中是连续存放的。这为后期学习使用指针访问数组奠定了基础。

5. sizeof
计算数组元素个数
在遍历数组的时候,我们通常需要知道数组中元素的个数,在上面的例子中我们是事先已知数组的长度的,那么C语言中,有没有可以直接通过程序来计算数组中元素个数的方法吗? 答案是有的,可以使用sizeof
。
sizeof
是C语言的一个关键字,是可以计算类型或者变量大小的,其实sizeof
也可计算数组的长度,例如
c
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int a = 0;
printf("%zd\n", sizeof(a)); // 单位:字节 4
printf("%zd\n", sizeof(int)); // 单位:字节 4
printf("%zd\n", sizeof(arr)); // 40 = 4 * 10
int sz = sizeof(arr) / sizeof(arr[0]); // 40 / 4 = 10
printf("%d\n", sz);
return 0;
}
那么,我们sizeof
计算出了数组的长度为10,就可以将上面代码中手动输入的10
替换为sizeof
的方法,参考代码如下,
ini
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}