Указатели и многомерные массивы

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++»


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: