C语言中,typedef 可以用于为固定长度数组定义一个新的类型名,这样可以提升代码的可读性和复用性。typedef 创建的是别名,不是新的类型。这种方式定义的数组大小是固定的,不能在运行时改变。函数参数中使用 typedef 的数组其实退化成指针。

1、typedef 固定长度数组

Array5 是一个类型名,代表 长度为 5int 数组。

typedef int Array5[5];

Array5 是一个类型名,代表 长度为 5int 数组,相当于int a[5] = {1, 2, 3, 4, 5};。可以这样使用。

#include <stdio.h>

typedef int Array5[5];  // 定义一个类型名 Array5,表示长度为 5 的 int 数组

int main() {
    // 创建一个 Array5 类型的数组,并初始化
    Array5 a = {1, 2, 3, 4, 5};

    // 打印数组元素
    for (int i = 0; i < 5; i++) {
        printf("a[%d] = %d\n", i, a[i]);
    }

    return 0;
}

2、二维数组

可以使用typedef 固定长度的二维数组。

#include <stdio.h>

typedef int Matrix3x3[3][3];

int main() {
    // 定义并初始化 3x3 矩阵
    Matrix3x3 mat = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 输出矩阵元素
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }

    return 0;
}

3、用于函数参数

可以把 typedef 用在函数参数中以增强可读性。

#include <stdio.h>

typedef int Row[5];

// 打印一个 Row 类型的数组
void print_row(Row r) {
    for (int i = 0; i < 5; ++i) {
        printf("%d ", r[i]);
    }
    printf("\n");
}

int main() {
    // 定义并初始化 Row 类型的数组
    Row row = {1, 2, 3, 4, 5};

    // 调用 print_row 函数打印该行
    print_row(row);

    return 0;
}

4、组织结构体中的数组

在结构体中使用固定长度数组时,typedef 可以使代码更具可读性,尤其是当结构体中包含多个数组时。

#include <stdio.h>

// 定义长度为 3 的整数数组类型
typedef int Row[3];

// 定义一个结构体,包含多个 Row 类型的数组
typedef struct {
    Row row1;
    Row row2;
} Matrix;

int main() {
    Matrix m = {{{1, 2, 3}, {4, 5, 6}}};
    printf("%d\n", m.row1[0]);  // 输出 1
    printf("%d\n", m.row2[2]);  // 输出 6
    return 0;
}