首页 > 编程笔记 > C语言笔记 阅读:40

C语言二维数组的使用(图文并茂,新手必看)

在 C 语言程序中,多维数组最简单的形式是二维数组,一个二维数组本质上是一个一维数组的列表。

声明一个 x 行 y 列的二维数组,形式如下:
type arrayName [x][y];
其中,type 可以是任意有效的 C语言数据类型,arrayName 数组名是一个有效的 C语言标识符。

一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:
int a[3][4];
数组中的每个元素是使用形式为 a[i][j] 的元素名称来标识的,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的编号,如下图所示,该数组逻辑形式上还是类似一维数组,按行访问。


图 1 二维数组示意图

这样的矩阵在内存中(物理上)是以下图所示的方式存储的:


图 2 二维数组存储

也就是说,实际上定义的二维数组在内存中仍然是像一维数组那样连续存储的,可以想象为把一个矩阵一层层伸展铺平的效果。

多维数组可以在大括号内为每行指定值进行初始化。下面的代码定义了一个带有 3 行 4 列的数组,并进行了初始化:
int a[3][4] = { 
    {0, 1, 2, 3} , /*初始化索引号为 0 的行 */
    {4, 5, 6, 7} , /*初始化索引号为 1 的行 */
    {8, 9, 10, 11} /*初始化索引号为 2 的行 */
};
内部嵌套的大括号可省略,上面的初始化语句与下面的初始化语句等同:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
二维数组中的元素是通过编号(即数组的行索引和列索引)来访问的。例如:
int i_a=a[2][3];

在数组声明中,如果执行定义操作,数组类型可以是不完整的。也就是说,可以声明数组却不指定其长度,但这种声明所引用的数组,必须在程序其他地方指定它的长度。然而一个数组元素的完整数据类型必须声明,一个多维数组的声明,只有第一个维度可以不指定长度,所有其他维度都必须指定长度,例如:
float mat[ ][5];

【实例 1 】矩阵转置。设有一矩阵为 m×n 阶(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),需要将该矩阵转置为 n×m 阶的矩阵,使其中元素满足 b(j,i)=a(i,j),即将 b(j,i) 和 a(i,j) 的值进行交换。代码如下:
#include<stdio.h>
#define row 3
#define col 3
 
int main()
{
    int a[row][col]={0, 1, 2, 3, 4, 5, 6, 7, 8};
    int i, j, temp;
 
    for(i=0; i<row; i++)
        for(j=0; j<col; j++)
        {
            if (j>i)
            {
                /*将主对角线右上方的数组元素与主对角线左下方的数组元素进行单方向交换*/
                temp=a[i][j];
                a[i][j]=a[j][i];
                a[j][i]=temp;
            }
        }
    printf("转置矩阵: \n");
    for(i=0; i<col; i++)
    {
        for(j=0; j<row; j++)
            printf("%d  ", a[i][j]); /*输出原始矩阵的转置矩阵*/
        printf("\n");
    }
    return 0;
}
编译运行,结果如下:
转置矩阵:
0    3    6
1    4    7
2    5    8

【实例 2】 已知有一个 3×4 的矩阵,要求编写程序求出其中值最大的元素所在的行号和列号,以及该元素的值。
要解决这个问题,必须遍历矩阵中的每个元素,因此程序的结构就是一个双重的 for 循环,在循环体中进行的就是矩阵元素的比较,找出最大的元素,并保存其行号和列号。完整的代码如下:
#include<stdio.h>
 
int main()
{
    int i, j, row=0, column=0, max;
    int a[3][4]={{14, 17, 13, 26}, {28, 6, 22, 25}, {30, 44, 2, 5}};
 
    max=a[0][0]; /*设置max的初值*/
    /*矩阵中每一个元素逐一与max进行比较*/
    for(i=0; i<=2; i++)
        for(j=0; j<=3; j++)
            if(a[i][j]>max)
            {
                max=a[i][j];
                row=i; //保存行号
                column=j; //保存列号
            }
    printf("最大值为: %d,所在行为第%d行,所在列为第%d列\n", max, row, column);
 
    return 0;
}
编译运行,结果如下:

最大值为: 10,所在行为第2行,所在列为第0列

C语言多维数组

C 语言支持多维数组,多维数组的定义、使用与一维数组、二维数组一致,只不过多了一些维度而已。

多维数组声明的一般形式如下:
type name[size1][size2]...[sizeN];

例如,下面的声明定义了一个三维数组并进行了初始化:
int array[2][3][4] =
{
{ {0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0} },
{ {0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0} },
};
这个三维数组共有 2×3×4=24 个元素。在使用多维数组时,同样可以用方括号来取得其中某个元素:
array[1][2][3]=345;
其实多维数组的本质与一维数组没有什么区别,只不过在使用时可以通过多维编号的方式来使用数组中的元素。

相关文章