Введение
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;
}
}
Результат:

Для приведенного выше кода мы объявляем двумерный массив s
размером 2X2. С помощью двух вложенных циклов for
мы перебираем каждый элемент массива и берем соответствующий ввод пользователя. Таким образом, весь массив заполняется, и мы выводим его, чтобы увидеть результаты.
Сложение матриц с использованием двумерных массивов в 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;
}
}
Вывод:

Здесь,
- мы берем две матрицы
m1
иm2
с максимальным количеством строк и столбцов равным 5. И еще одну матрицуm3
, в которой мы будем хранить результат, - Как ввод пользователя, мы берем количество строк и столбцов для обеих матриц. Поскольку мы выполняем сложение матриц, количество строк и столбцов должно быть одинаковым для обеих матриц,
- Затем мы снова используем вложенные циклы для ввода обеих матриц,
- На этом этапе у нас есть обе матрицы 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 – это указатель, который хранит адрес массива с 2 элементами, - Как мы уже сказали, мы можем разбить двумерный массив на массив массивов. В этом случае s на самом деле является массивом с 5 элементами, которые дальше на самом деле являются массивами с 2 элементами для каждой строки.
- Мы используем цикл
for
, чтобы пройти по этим 5 элементам массива, s. На каждой итерации мы присваиваем p адресуs[i]
, - Далее внутренний цикл
for
печатает отдельные элементы массива s[i] с использованием указателя p. Здесь(*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()
мы определили q как указатель на массив из 4 целых чисел с помощью объявленияint (*q)[4]
, - q holds the base address of the zeroth 1-D array
- Этот адрес затем присваивается q, указателю int, и затем с помощью этого указателя обращаются ко всем элементам нулевого одномерного массива.
- В следующей итерации цикла, когда
i
принимает значение 1, выражение q+i получает адрес первого одномерного массива. Это происходит потому, что q является указателем на нулевой одномерный массив, и добавление 1 к нему даст нам адрес следующего одномерного массива. Этот адрес снова присваивается q, и с его помощью обращаются ко всем элементам следующего одномерного массива. - Во второй функции
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