介绍
A two-dimensional array in C++ is the simplest form of a multi-dimensional array. It can be visualized as an array of arrays. The image below depicts a two-dimensional array.

A two-dimensional array is also called a matrix. It can be of any type like integer, character, float, etc. depending on the initialization. In the next section, we are going to discuss how we can initialize 2D arrays.
在C++中初始化二维数组
那么,在C++中如何初始化二维数组呢?就是这么简单:
int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
} ;
所以,正如你所看到的,我们初始化了一个名为arr
的二维数组,有4行和2列,它是一个数组的数组。数组的每个元素又是一个整数数组。
我们也可以用以下方式初始化2D数组。
int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};
在这种情况下,arr
也是一个有4行2列的二维数组。
在C++中打印二维数组
我们已经完成了二维数组的初始化,但如果没有实际打印它,我们无法确认是否正确完成。
而且,在许多情况下,我们可能需要在对其执行一些操作后打印结果的二维数组。那么我们该如何做呢?
下面的代码展示了我们如何实现这一点。
#include<iostream>
using namespace std;
main( )
{
int arr[4][2] = {
{ 10, 11 },
{ 20, 21 },
{ 30, 31 },
{ 40, 41 }
} ;
int i,j;
cout<<"Printing a 2D Array:\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;
}
}
输出:

对于上面的代码,我们声明一个2X2的二维数组 `s`。使用两个嵌套的for循环,我们遍历数组的每个元素并获取相应的用户输入。这样,整个数组就被填满了,我们打印出来看看结果。
在C++中使用二维数组进行矩阵加法
作为一个示例,让我们看看如何使用2D数组执行矩阵相加并打印结果。
#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;
}
}
输出:

在这里,
- 我们取两个最多有5行5列的矩阵
m1
和m2
。还有另一个矩阵m3
,我们将在其中存储结果。 - 作为用户输入,我们取了两个矩阵的行数和列数。由于我们正在执行矩阵相加,两个矩阵的行数和列数应该相同。
- 之后,我们再次使用嵌套的for循环获取用户输入的两个矩阵。
- 此时,我们有了矩阵m1和m2,
- 然后我们遍历m3矩阵,使用两个for循环更新相应的元素
m3[i][j]
,其值为m1[i][j]+m2[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<<"Row"<<i<<":";
for (j = 0; j <= 1; j++)
cout<<"\t"<<*(*p+j);
cout<<endl;
}
}
输出:

这里,
- 在上面的代码中,我们尝试使用指针打印一个二维数组,
- 就像我们之前做的那样,首先我们初始化了二维数组
s[5][2]
。还有一个指针(*p)[2]
,其中p是一个指针,存储着一个有两个元素的数组的地址, - 正如我们先前所说,我们可以将二维数组拆分为数组的数组。所以在这种情况下,s实际上是一个包含5个元素的数组,而每一行实际上是包含2个元素的数组。
- 我们使用
for
循环遍历这5个数组s的元素。对于每次迭代,我们将p赋值为s[i]
的地址, - 然后内部的for循环使用指针p打印出数组s[i]的单个元素。这里
(*p + j)
给我们的是元素s[i][j]的地址,所以使用*(*p+j)
我们可以访问相应的值。
传递二维数组给函数
在这一部分,我们将学习如何将2D数组传递给任何函数并访问相应的元素。在下面的代码中,我们将数组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 holds the base address of the zeroth 1-D array
- 然后将这个地址赋给q,一个int指针,然后使用这个指针访问零索引的1D数组的所有元素。
- 循环的下一次,当
i
取值1时,表达式q+i获取第一个1-D数组的地址。这是因为q是指向零索引1-D数组的指针,将1添加到它将给出下一个1-D数组的地址。这个地址再次被赋给q,然后使用它访问下一个1-D数组的所有元素 - 在第二个函数
print()
中,q的声明如下:int q[][4]
, - 这与int (*q)[4]相同,其中q是指向包含4个整数的数组的指针。唯一的优势是我们现在可以使用更熟悉的表达式
q[i][j]
来访问数组元素。在show()
中我们也可以使用相同的表达式,但为了更好地理解指针的使用,我们使用指针访问每个元素。
结论
所以,在这篇文章中,我们讨论了在C++中的二维数组,我们如何执行各种操作以及它在矩阵加法中的应用。如有进一步问题,请随时使用评论。
参考资料
Source:
https://www.digitalocean.com/community/tutorials/two-dimensional-array-in-c-plus-plus