Skip to content

数组

什么是数组?

  • 数组是 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;
}