数组
什么是数组?
- 数组是 C 语言中的一种数据结构,用于存储一组具有相同数据类型的数据。
- 数组中的每个元素可以通过一个索引(下标)来访问,索引从 0 开始,最大值为数组长度减 1。
数组的使用
定义语法格式
c
类型 数组名[元素个数];
int arr[5];
- 数组名不能与其它变量名相同,同一作用域内是唯一的
- 其下标从 0 开始计算,因此 5 个元素分别为
arr[0]
,arr[1]
,arr[2]
,arr[3]
,arr[4]
c
#include <stdio.h>
int main() {
// 定义了一个数组,名字叫 a,有 10 个成员,每个成员都是 int 类型
int a[10];
// a[0]…… a[9],没有 a[10]
// 没有 a 这个变量,a 是数组的名字,但不是变量名,它是常量
a[0] = 0;
// ……
a[9] = 9;
// 数据越界,超出范围,错误
// a[10] = 10; // err
for (int i = 0; i < 10; i++) {
a[i] = i; // 给数组赋值
}
// 遍历数组,并输出每个成员的值
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
数组的初始化
- 在定义数组的同时进行赋值,称为初始化
- 全局数组若不初始化,编译器将其初始化为零
- 局部数组若不初始化,内容为随机值
c
// 定义一个数组,同时初始化所有成员变量
int a1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int a2[10] = { 1, 2, 3 }; // 初始化前三个成员,后面所有元素都设置为 0
int a3[10] = { 0 }; // 所有的成员都设置为 0
// [] 中不定义元素个数,定义时必须初始化
int a4[] = { 1, 2, 3, 4, 5 }; // 定义了一个数组,有 5 个成员
数组名
- 数组名是一个地址的常量,代表数组中首元素的地址
- 即
arr == &arr[0]
数组长度
c
#include <stdio.h>
int main() {
// 定义一个数组,同时初始化所有成员变量
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 数组名是一个地址的常量,代表数组中首元素的地址
printf("a = %p\n", a);
printf("&a[0] = %p\n", &a[0]);
int n = sizeof(a); // 数组占用内存的大小,10 个 int 类型,10 * 4 = 40
int n0 = sizeof(a[0]); // 数组第 0 个元素占用内存大小,第 0 个元素为 int,4
int num = n / n0; // 元素个数
printf("n = %d, n0 = %d, num = %d\n", n, n0, num);
return 0;
}
案例
一维数组的最大值
c
#include <stdio.h>
int main() {
// 定义一个数组,同时初始化所有成员变量
int a[] = {1, -2, 3, -4, 5, -6, 7, -8, -9, 10};
// 假设第 0 个元素就是最大值
int temp = a[0];
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
// 如果有元素比临时的最大值大,就交换值
if (a[i] > temp) {
temp = a[i];
}
}
printf("数组中最大值为:%d\n", temp);
return 0;
}
一维数组的逆置
c
#include <stdio.h>
int main() {
// 定义一个数组,同时初始化所有成员变量
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i = 0; // 首元素下标
int j = sizeof(a) / sizeof(a[0]) - 1; // 尾元素下标
int temp;
while (i < j) {
// 元素交换值
temp = a[i];
a[i] = a[j];
a[j] = temp;
// 位置移动
i++;
j--;
}
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
printf("%d, ", a[i]);
}
return 0;
}