一、静态初始化二维数组
静态初始化是指在定义数组的同时进行初始化。对于二维数组来说,需要同时指定行数和列数。可以按以下两种方式定义静态二维数组:
/* 第一种定义方式 */
int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
/* 第二种定义方式 */
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
第一种定义方式中,内置了三个一维数组,每个一维数组长度为4,元素值依次为1~12。第二种定义方式中,同样是三个一维数组,但是在定义时没有指定行数,所以需要保证总的元素个数正确且能被列数整除。因为C语言中定义的二维数组在内存中是按行存放的,所以需要确保每一行的元素个数相同。
静态初始化的优点是,编写方便、易于理解,而且可以在定义时一次性初始化所有元素。但是缺点也很明显,如果二维数组较大且元素比较复杂,则代码可读性和可维护性会降低,而且如果有些元素不需要进行初始化,则会白白浪费空间。
二、动态初始化二维数组
动态初始化是指在程序运行过程中进行初始化操作。C语言中需要使用指针配合malloc函数来完成动态初始化。以下是动态初始化二维数组的代码:
int **arr;
int rows = 3, cols = 4;
int i, j;
arr = (int**)malloc(rows*sizeof(int*)); /* 分配每一行的指针 */
for (i = 0; i < rows; i++)
arr[i] = (int*)malloc(cols*sizeof(int)); /* 分配每一行的内存空间,并返回该行的首地址 */
/* 初始化二维数组 */
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
arr[i][j] = i*cols + j + 1;
动态初始化的优点是,可以根据实际情况动态进行内存分配,减少浪费。但是缺点也很明显,需要使用指针和动态内存分配函数来完成初始化,代码相对复杂,可读性和可维护性也会有所降低。
三、使用memset函数进行初始化
memset函数是C语言中的一个标准函数,作用是将一段内存区域按字节进行填充。对于二维数组来说,可以将它看作是一个连续的内存区域,可以使用memset函数进行初始化。以下是使用memset函数初始化二维数组的代码:
int arr[3][4];
int rows = 3, cols = 4;
memset(arr, 0, rows*cols*sizeof(int)); /* 将二维数组第一行的元素全部置为0 */
/* 初始化二维数组 */
int i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
arr[i][j] = i*cols + j + 1; /* 按照行顺序逐个赋值 */
使用memset函数的优点是,初始化操作简便,一行代码即可完成。而且在所有元素都需要赋同一个值的情况下,使用memset函数效率更高。
四、二维数组指针初始化
二维数组指针是一个指向二维数组的指针变量,它可以用来访问和操作二维数组。以下是二维数组指针初始化的代码:
int arr[3][4];
int (*p)[4] = arr; /* 定义二维数组指针 */
/* 初始化二维数组 */
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
*(*(p+i)+j) = i*4 + j + 1; /* 按照行顺序逐个赋值 */
二维数组指针初始化的优点是,使用指针变量可以方便地对二维数组进行操作,不需要改变地址即可访问不同的行和列。但是缺点是需要使用指针,语法相对复杂,而且可读性和可维护性也会有所降低。
五、二维数组随机初始化
在程序开发中,有时我们需要生成随机的二维数组,下面是一个用rand函数在一定范围内生成随机二维数组的代码示例:
int arr[3][4];
int i, j;
srand(time(NULL)); /* 生成随机数种子 */
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
arr[i][j] = rand()%100; /* 生成0 ~ 99的随机数 */
二维数组随机初始化的优点是,可以快速生成一定范围内的随机数组,而且使用rand函数也很方便。但是缺点是生成的数组可能存在重复的元素,而且无法保证数组的特定性质。
六、总结
以上就是C语言二维数组初始化的几种方式,每种方法都有各自的优缺点,需要根据实际情况选取。静态初始化可以简单明了地进行初始化,但是代码可读性和可维护性可能有所降低。动态初始化可以根据实际情况进行内存分配,但是需要使用指针和动态内存分配函数,代码相对复杂。使用memset函数可以迅速进行初始化,但是只能初始化为同一个值。二维数组指针初始化可以方便地对二维数组进行操作,但是需要使用指针变量,语法相对复杂。二维数组随机初始化可以快速生成一定范围内的随机数组,但是无法保证数组的特定性质。