1. Многомерный массив – это массив, элементами которого служат массивы.
Пример:
int a[4][5] – это массив из 4-х строк и 5-ти столбцов.
Инициализация многомерных массивов выполняется аналогично инициализации одномерных массивов.
Пример:
//Инициализированы все элементы массива
int a[3][4] = {{11,22,33,44},{55,66,77,88},{99,110,120,130}
int b[3][4] = {{1},{2},{3}} /*Инициализированы первые элементы каждой строки*/
int c[3][2] = {1,2,3,4,5,6} /*Инициализированы все элементы массива
a[1][2] – доступ к элементу в 1-ой строке и во 2-м столбце через индексы.
2. Динамические двумерные массивы
Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной).
Пример:
int nstr = 5:
int ** m = (int **) new int [nstr][10];
Более универсальный и безопасный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:
int nstr, nstb;
cout << " Введите количество строк и столбцов: ";
cin >> nstr >> nstb;
int **a = new int *[nstr]; // 1
for (int i = 0; i < nstr; i++) // 2
a[i] = new int [nstb]; // 3
В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк — nstr).
В операторе 2 организуется цикл для выделения памяти под каждую строку массива.
В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int.
*(*(a + 2) + 6) - доступ к элементу в 2-ой строке и во 6-м столбце через указатели.
Пример:
Заполнить двумерный массив размером n x m натуральными числами в виде «змейки». Например, при n=3, m=4:
1 2 3 4
8 7 6 5
9 10 11 12
#include <iostream>
using namespace std;
void main()
{
int n,m,i,j;
cout<<”n m: “;
cin>>n>>m;
int **a;
a=new int *[n]; //задаем массив из n элементов, каждый из которых является адресом строки
for (i=0;i<n;i++)
a[i]=new int[m]; //выделяем память под каждую строку массива
int k=1;
for (i=0;i<n;i++)
if (i%2!=0)
for (j=m-1;j>=0;j--)
{
*(*(a+i)+j)=k;
k++;
}
else
for (j=0;j<m;j++)
{
*(*(a+i)+j)=k;
k++;
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
cout<<*(*(a+i)+j)<<”\t”;
cout<<endl;
}
for (i=0;i<n;i++)//освобождаем память для каждой строки
delete[] a[i];
delete []a;//освобождаем память для массива указателей на строки
}
Окно вывода:
Использованная литература.
o Т.А. Павловская «С/С++ Программирование на языке высокого уровня».
o Викентьева О.Л., Полякова О.А. «Программирование на языке C++»