龙空技术网

全面解说C语言多维数组

霸都嵌入式 248

前言:

此刻咱们对“c语言的储存类别”大概比较关切,看官们都需要了解一些“c语言的储存类别”的相关文章。那么小编在网摘上收集了一些关于“c语言的储存类别””的相关内容,希望同学们能喜欢,你们一起来学习一下吧!

C语言中,数组是一种存储相同类型数据的连续空间。数组可以有一维、二维、三维或更高维度,根据其维度的数目,也称为一阶、二阶、三阶或更高阶数组。多维数组可以看作是由低维数组组成的高维数组,例如,二维数组可以看作是由一维数组组成的一维数组,三维数组可以看作是由二维数组组成的一维数组,以此类推。

多维数组的声明

多维数组的声明和一维数组类似,只是需要在方括号中指定每个维度的大小。例如,声明一个3行4列的二维整型数组,可以写成:

int a[3][4];

声明一个2层3行4列的三维整型数组,可以写成:

int b[2][3][4];

注意,每个方括号中的大小必须是一个常量或者一个常量表达式,不能是一个变量或者一个变量表达式。例如,以下声明是错误的:

int n = 5;int c[n][n]; // 错误,n不是一个常量
多维数组的初始化

多维数组可以在声明时进行初始化,也可以在声明后进行赋值。初始化时,需要用花括号包含每个元素或者每个低维数组的初始值。例如,初始化一个3行4列的二维整型数组为全0,可以写成:

int a[3][4] = {0}; // 等价于 int a[3][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

初始化一个2层3行4列的三维整型数组为全1,可以写成:

int b[2][3][4] = {1}; // 等价于 int b[2][3][4] = {{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}, {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}};

如果只给出部分元素或者低维数组的初始值,那么剩下的元素或者低维数组会被自动初始化为0。例如:

int a[3][4] = {{1, 2}, {3}}; // 等价于 int a[3][4] = {{1, 2, 0, 0}, {3, 0, 0, 0}, {0, 0, 0, 0}};
多维数组的访问

多维数组的访问和一维数组类似,只是需要在方括号中指定每个维度的下标。下标从0开始到大小减一。例如,访问二维整型数组a中第2行第3列的元素,可以写成:

a[1][2]; // 注意下标从0开始

访问三维整型数组b中第1层第2行第3列的元素,可以写成:

b[0][1][2]; // 注意下标从0开始
多维数组的传递

多维数组可以作为函数的参数进行传递,但是有一些注意事项。首先,传递多维数组时,只需要写数组名,不需要写方括号。例如,传递二维整型数组a,可以写成:

func(a); // 不要写成 func(a[3][4]);

其次,接收多维数组的函数需要在形参中指定除了第一维以外的其他维度的大小。例如,接收二维整型数组a的函数,可以写成:

void func(int a[][4]) {	// 函数体}

或者

void func(int (*a)[4]) {	// 函数体}

注意,第一维的大小可以省略,因为它可以由指针运算推断出来。但是其他维度的大小不能省略,否则无法正确访问数组元素。例如,以下函数是错误的:

void func(int a[][]) {	// 函数体}

最后,传递多维数组时,实际上是传递了数组名所代表的指针,也就是指向数组第一个元素的指针。因此,在函数中对多维数组进行修改,会影响到原始的数组。例如:

void func(int a[][4]) {	a[0][0] = 10; // 修改了数组a中第一个元素的值}int main() {  int a[3][4] = {0}; // 声明并初始化一个二维整型数组a为全0  func(a); // 调用函数func,并传递a  printf("%d\n", a[0][0]); // 输出10,说明a被修改了}

系列文章持续更新,如果觉得有帮助请点赞+关注!

标签: #c语言的储存类别