C++中的二维数组

时间:2020-02-23 14:30:08  来源:igfitidea点击:

介绍

C++中的二维数组是多维数组的最简单形式。
可以将其可视化为数组数组。

二维数组也称为矩阵。
根据初始化,它可以是任何类型,例如整数,字符,浮点数等。
在下一节中,我们将讨论如何初始化2D数组。

在C++中初始化2D数组

那么,如何在C++中初始化二维数组?就这么简单:

int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
} ;

因此,正如您所看到的,我们初始化一个2D数组" arr",将4行2列作为数组数组。
数组的每个元素仍然是整数数组。

我们还可以通过以下方式初始化2D数组。

int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};

同样,在这种情况下," arr"是具有4行2列的2D数组。

用C++打印2D数组

我们已经完成了2D数组的初始化,现在还没有实际打印它,所以我们无法确认它是否正确完成了。

同样,在许多情况下,我们可能需要在对二维数组执行一些操作后打印它。
那么我们该怎么做呢?

下面的代码向我们展示了如何做到这一点。

#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;
	}
}

在上面的代码中,

  • 首先,我们使用特定值初始化2D数组" arr [4] [2]",
  • 之后,我们尝试使用两个for循环打印相应的数组,
  • 外部for循环遍历行,而内部for循环遍历2D数组的列,
  • 因此,对于外循环的每次迭代," i"都会增加,并将我们带到下一个一维数组。
    而且,内部循环一次遍历整个一维数组,
  • 因此,我们打印单个元素arr [i] [j]

将2D阵列元素作为用户输入

之前,我们看到了如何使用预定义的值初始化2D数组。
但是我们也可以将其作为用户输入。
让我们看看

#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 2D数组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;
	  } 
	  
} 

其中

  • 我们取两个矩阵m1和m2,最多5行5列。
    还有另一个矩阵" m3",我们将其中存储结果,
  • 作为用户输入,我们获取了两个矩阵的行数和列数。
    由于我们正在执行矩阵加法运算,因此两个矩阵的行数和列数应相同,
  • 之后,我们将两个矩阵都作为用户输入,再次使用嵌套的for循环,
  • 此时,我们同时拥有矩阵m1和m2,
  • 然后我们遍历m3矩阵,使用两个for循环,并通过m1 [i] [j] + m2 [i] [j]的值更新各个元素m3 [i] [j]。
    这样,在外部for循环结束时,我们得到了所需的矩阵,
  • 最后,我们打印出结果矩阵m3。

指向C++中的2D数组的指针

如果我们可以有一个指向整数的指针,一个浮点数的指针,一个char的指针,那么我们不能有一个指向数组的指针吗?我们当然可以。
以下程序显示了如何构建和使用它。

#include<iostream>
using namespace std;
/* Usage of pointer to an array */
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;
    } 
    
}

其中

  • 在上面的代码中,我们尝试使用指针打印2D数组,

  • 正如我们之前所做的,首先我们初始化2D数组s [5] [2]。
    还有一个指针(* p)[2],其中p是一个指针,用于存储包含2个元素的数组的地址,

  • 正如我们已经说过的,我们可以将2D数组分解为一个数组数组。
    因此,在这种情况下,s实际上是一个包含5个元素的数组,进一步来说,实际上是每行包含2个元素的数组。

  • 我们使用" for"循环遍历数组s的这5个元素。
    对于每次迭代,我们为p分配" s [i]"的地址,

  • 此外,内部for循环使用指针p打印出数组s [i]的各个元素。
    其中((* p + j)给我们单个元素s [i] [j]的地址,因此使用*(* p + j)我们可以访问相应的值。

将二维数组传递给函数

在本节中,我们将学习如何将2D数组传递给任何函数并访问相应的元素。
在下面的代码中,我们将数组a传递给两个函数show()和print(),这两个函数会打印出传递的2D数组。

#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保存第零个一维数组的基地址

  • 然后将该地址分配给一个int指针q,然后使用该指针访问第1个1D数组的所有元素。

  • 下次遍历循环时,当" i"取值1时,表达式q + i将获取第一个1-D数组的地址。
    这是因为q是指向第零个一维数组的指针,将其加1将为我们提供下一个一维数组的地址。
    将该地址再次分配给q,并使用它访问下一个1-D数组的所有元素

  • 在第二个函数print()中,q的声明如下:int q [] [4]

  • 这与int(* q)[4]相同,其中q是指向4个整数的数组的指针。
    唯一的好处是我们现在可以使用更熟悉的表达式q [i] [j]访问数组元素。
    我们也可以在show()中使用相同的表达式,但是为了更好地理解指针的使用,我们使用指针访问每个元素。