C++二维数组完全指南:定义、初始化与操作详解
简介
在C++中,二维数组是多维数组的最简单形式。它可以被看作是数组的数组。下面的图像描述了一个二维数组。

二维数组也被称为矩阵。它可以是任何类型的,如整数、字符、浮点数等,取决于初始化方式。在下一部分中,我们将讨论如何初始化二维数组。
在C++中初始化一个二维数组
那么,在C++中我们如何初始化二维数组呢?方法很简单:
int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
};
如你所见,我们初始化了一个名为arr的二维数组,它有4行2列。这个二维数组被看作是一个数组的数组,其中每个元素本身又是一个包含两个整数的数组。
我们也可以通过以下方式初始化一个二维数组:
int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};
在这种情况下,编译器会自动将这8个元素分配到4行2列的二维数组arr中。
在C++中打印一个二维数组
在C++中打印二维数组需要使用嵌套循环。具体方法将在下一部分中详细介绍。
我们已经完成了一个二维数组的初始化,现在如果没有实际打印出来,我们无法确认是否初始化正确。
在许多情况下,我们可能需要在进行一些操作后打印结果的二维数组。那么我们该怎么做呢?
以下代码向我们展示了如何实现这一点。
#include<iostream>
using namespace std;
main( )
{
int arr[4][2] = {
{ 10, 11 },
{ 20, 21 },
{ 30, 31 },
{ 40, 41 }
} ;
int i,j;
cout<<"打印二维数组:\n";
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{
cout<<"\t"<<arr[i][j];
}
cout<<endl;
}
}
输出:

在上面的代码中,
- 首先,我们初始化了一个二维数组 arr[4][2] 并赋予特定值,
- 然后,我们使用两个for循环来打印该数组,
- 外层for循环遍历行,而内层循环遍历二维数组的列,
- 因此,每次外层循环迭代时,i增加并带我们到下一个一维数组。同时,内层循环一次遍历整个一维数组,
- 相应地,我们打印单个元素 arr[ i ][ j ]。
用户输入二维数组元素
我们之前看到了如何使用预定义的值初始化一个二维数组。但是我们也可以让用户进行输入。让我们看一下如何实现。
#include<iostream>
using namespace std;
main( )
{
int s[2][2];
int i, j;
cout<<"\n2D Array Input:\n";
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
cout<<"\ns["<<i<<"]["<<j<<"]= ";
cin>>s[i][j];
}
}
cout<<"\nThe 2-D Array is:\n";
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
cout<<"\t"<<s[i][j];
}
cout<<endl;
}
}
输出:

在C++中使用二维数组进行矩阵相加。
作为一个例子,让我们看看如何使用二维数组进行矩阵相加并打印结果。
#include<iostream>
using namespace std;
main()
{
int m1[5][5], m2[5][5], m3[5][5];
int i, j, r, c;
cout<<"Enter the no.of rows of the matrices to be added(max 5):";
cin>>r;
cout<<"Enter the no.of columns of the matrices to be added(max 5):";
cin>>c;
cout<<"\n1st Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix1["<<i<<"]["<<j<<"]= ";
cin>>m1[i][j];
}
}
cout<<"\n2nd Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix2["<<i<<"]["<<j<<"]= ";
cin>>m2[i][j];
}
}
cout<<"\nAdding Matrices...\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
m3[i][j]=m1[i][j]+m2[i][j];
}
}
cout<<"\nThe resultant Matrix is:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\t"<<m3[i][j];
}
cout<<endl;
}
}
#include<iostream>
using namespace std;
main()
{
int m1[5][5], m2[5][5], m3[5][5];
int i, j, r, c;
cout<<"Enter the no.of rows of the matrices to be added(max 5):";
cin>>r;
cout<<"Enter the no.of columns of the matrices to be added(max 5):";
cin>>c;
cout<<"\n1st Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix1["<<i<<"]["<<j<<"]= ";
cin>>m1[i][j];
}
}
cout<<"\n2nd Matrix Input:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\nmatrix2["<<i<<"]["<<j<<"]= ";
cin>>m2[i][j];
}
}
cout<<"\nAdding Matrices...\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
m3[i][j]=m1[i][j]+m2[i][j];
}
}
cout<<"\nThe resultant Matrix is:\n";
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
cout<<"\t"<<m3[i][j];
}
cout<<endl;
}
}
输出:

- 我们使用两个矩阵m1和m2,它们最多有5行5列。另外还有一个矩阵m3,用于存储计算结果,
- 作为用户输入,我们获取了两个矩阵的行数和列数。由于我们执行的是矩阵加法,两个矩阵的行数和列数应该相同,
- 之后,我们再次使用嵌套for循环获取两个矩阵的用户输入,
- 此时,我们已经有了两个矩阵m1和m2,
- 然后我们使用两个for循环遍历m3矩阵,并通过m1[i][j]+m2[i][j]的值更新相应的元素m3[i][j]。通过这种方式,在外层for循环结束时,我们得到了所需的矩阵,
- 最后,我们打印出结果矩阵m3。
指向C++中二维数组的指针
如果我们可以有一个指向整数的指针,一个指向浮点数的指针,一个指向字符的指针,那么我们当然也可以有一个指向数组的指针。下面的程序展示了如何构建和使用它。
#include<iostream>
using namespace std;
/* 指向数组的指针的用法 */
main( )
{
int s[5][2] = {
{1, 2},
{1, 2},
{1, 2},
{1, 2}
} ;
int (*p)[2] ;
int i, j;
for (i = 0 ; i <= 3 ; i++)
{
p=&s[i];
cout<<"行"<<i<<":";
for (j = 0; j <= 1; j++)
cout<<"\t"<<*(*p+j);
cout<<endl;
}
}
输出结果:

这里,
- 在上面的代码中,我们尝试使用指针打印二维数组,
- 如我们之前所做的,首先我们初始化二维数组s[5][2]。同时初始化一个指针(*p)[2],其中p是一个指针,存储了一个包含2个元素的数组的地址,
- 正如我们已经说过的,我们可以将二维数组分解为数组的数组。所以在这种情况下,s实际上是一个包含5个元素的数组,而这些元素实际上是每行包含2个元素的数组。
- 我们使用for循环遍历数组s的这5个元素。在每次迭代中,我们将p赋值为s[i]的地址,
- 此外,内部的for循环使用指针p打印出数组s[i]的各个元素。这里,(*p + j)给出了单个元素s[i][j]的地址,因此使用*(*p+j)我们可以访问相应的值。
将一个二维数组传递给函数
在这一节中,我们将学习如何将一个二维数组传递给任何函数,并访问相应的元素。在下面的代码中,我们将数组a传递给show()和print()两个函数,这两个函数将打印出传递的二维数组。
#include<iostream>
using namespace std;
void show(int (*q)[4], int row, int col)
{
int i, j ;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cout<<"\t"<<*(*(q + i)+j);
cout<<"\n";
}
cout<<"\n";
}
void print(int q[][4], int row, int col)
{
int i, j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cout<<"\t"<<q[i][j];
cout<<"\n";
}
cout<<"\n";
}
int main()
{
int a[3][4] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21} ;
show (a, 3, 4);
print (a, 3, 4);
return 0;
}
输出:

- 在show()函数中,我们通过声明int (*q)[4]将q定义为指向包含4个整数的数组的指针,
- q保存着第0个一维数组的基地址
- 该地址随后被赋值给q,一个整型指针,然后使用该指针访问第0个一维数组的所有元素。
- 在下一次循环中,当i取值为1时,表达式q+i获取第一个一维数组的地址。这是因为q是指向第0个一维数组的指针,对其加1会给我们下一个一维数组的地址。该地址再次被赋值给q,并使用它访问下一个一维数组的所有元素
- 在第二个函数print()中,q的声明如下:int q[][4],
- 这与int (*q)[4]相同,其中q是指向包含4个整数的数组的指针。唯一的优点是现在我们可以使用更熟悉的表达式q[i][j]来访问数组元素。我们也可以在show()中使用相同的表达式,但为了更好地理解指针的使用,我们使用指针来访问每个元素。
结论
因此,在本文中,我们讨论了C++中的二维数组,我们如何执行各种操作以及其在矩阵加法中的应用。如有任何进一步的问题,请随时在评论中提问。
参考资料
- https://en.wikipedia.org/wiki/Array_data_structure
- /community/tutorials/arrays-in-c