1. 为什么需要数组?
解决大量同类型变量的定义问题。
例如:要存储1000名学生的成绩,如果逐个定义
int score1, score2, ...极不方便。数组就是有序数据的集合,可以批量定义变量。
2. 一维数组的定义
基本语法
类型说明符 数组名[常量表达式];
类型说明符:数组中每个元素的类型(如
int,float,char)。数组名:标识符,命名规则与变量相同。
[常量表达式]:表示数组长度(元素个数),必须是整型。
C99标准之后,长度可以是变量(可变长数组),但不能初始化。
示例
int score[1000]; // 定义了一个包含1000个int型元素的数组
3. 数组的初始化
| 初始化方式 | 代码示例 | 说明 |
|---|---|---|
| 全部初始化 | int a[10] = {1,2,3,4,5,6,7,8,9,10}; | 依次给每个元素赋值 |
| 部分初始化 | int a[10] = {1,2,3,4,5}; | 前5个赋值,后5个自动补0 |
| 不初始化 | int a[10]; | 元素值为随机值(垃圾值) |
| 全部初始化为0 | int a[10] = {0};或int a[10] = {}; | 所有元素为0 |
| 省略长度 | int a[] = {1,2,3,4}; | 长度由初始化值的个数决定(此处为4) |
注意
数组不能整体赋值,例如
a = {1,2,3};是错误的。只能对单个元素赋值,例如
a[0] = 2;。
4. 数组元素的引用(访问)
使用下标运算符
[],语法:数组名[下标]下标取值范围:
0 ~数组长度-1示例:
int a[10]; a[0] = 100; // 给第一个元素赋值 printf("%d", a[9]); // 输出最后一个元素5. 数组的重要特点
| 特点 | 说明 |
|---|---|
| 连续性 | 数组元素在内存中占据一片连续的空间 |
| 单一性 | 所有元素类型相同 |
| 有序性 | 元素按顺序排列,第0个后面是第1个,依次类推 |
数组名
类型角度:数组名代表整个数组的类型(例如
int[10]类型)。数值角度:数组名代表数组首元素的地址(即
&a[0])。
下标与地址
下标表示相对于首元素的偏移量。
a[i]的地址 = 首地址 +i × 单个元素字节数。
数组越界
下标超出
[0, 长度-1]范围即为越界。编译器不检查越界,需要程序员自己保证下标合法,否则可能产生未定义行为。
6. 常见练习操作(基于10个元素的数组)
(1) 找出能被3整除的数
(2) 键盘输入10个值,求累加和
int a[10], sum = 0; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); sum += a[i]; } printf("总和 = %d\n", sum);(3) 找出最大值、次大值(擂台方法)
(4) 数组逆序(交换对称元素)
原始:
1 2 3 4 5 6 7 8 9 10逆序后:
10 9 8 7 6 5 4 3 2 1交换规律:下标
i与len-1-i交换,只需循环前一半。
int len = 10; for (int i = 0; i < len/2; i++) { int t = a[i]; a[i] = a[len-1-i]; a[len-1-i] = t; }7. 排序算法(选择排序)
核心思想
每次给合适的位置选择合适的数(从小到大排序时,每次选最小的放到最前面)。