Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ОАиП.doc
Скачиваний:
21
Добавлен:
15.04.2019
Размер:
411.14 Кб
Скачать

Многомерные массивы

Как уже отмечалось, в языке Си кроме одномерных массивов возможна работа с многомерными массивами. Объявление многомерного массива:

<тип> < ID >[размер1][размер2]…[размерN]={{список начальных значений},

{список начальных значений},…};

Наиболее быстро изменяется последний индекс элементов массива, поскольку многомерные массивы в языке Си размещаются в памяти компьютера в последовательности столбцов.

Например, элементы двухмерного массива b[3][2] размещаются в памяти компьютера в следующем порядке:

b[0][0], b[0][1], b[1][0], b[1][1], b[2][0], b[2][1].

Следующий пример иллюстрирует определение массива целого типа, состоящего из трех строк и четырех столбцов, с одновременным присвоением его элементам (инициализацией) начальных значений:

int a[3][4] = {{1,2,0,0},{9,-2,4,1},{-7,0,0,0}};

Если в какой-то группе { } список значений короче, то оставшимся элементам присваивается 0.

  1. Динамическая память, функции и операции работы с памятью.

В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами перемен­ной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память). После обработки массива занятую память надо освободить. Библиотечные функции работы с памятью описаны в файле alloc.h.

Пример создания динамического массива:

float *x;

int n;

printf("\nРазмерность - "); scanf(" %d",&n);

if ((x = calloc(n, sizeof(*x)))==NULL) { // Захват памяти

printf("\n Предел размерности “);

exit(1);

}

else {

printf("\n Массив создан !");

...

for (i=0; i<n; i++)

printf("\n%f",x[i]);

...

free(x); // Освобождение памяти

}

В С++ введены две операции: захват памяти - new, освобождение, захваченной ранее памяти - delete.

Общий формат записи:

указатель = new type (значение);

. . .

delete указатель;

Например:

int *a;

a = new int (8);

В данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:

. . .

delete a;

Операции new и delete для массивов:

указатель = new тип [количество] ;

Результат операции – адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти – результат NULL. Операция delete:

delete [ ] указатель;

Пример создания одномерного динамического массива:

Массив объявляем указателем.

...

double *x;

int i, n;

...

puts(" Введите размер массива: ");

scanf(“%d”, &n);

x = new double [n] ;

if (x == NULL) {

puts(" Предел размерности ! ");

return;

}

for (i=0; i<n; i++) // Ввод элементов массива

scanf(“%lf”, &x[i]);

...

delete [ ]x; // Освобождение памяти

...

Пример создания двуxмерного динамического массива:

Напомним, что ID двухмерного массива - указатель на указатель (рис. 4):

...

int **m, n1, n2;

puts(" Введите размеры массива (количество строк и столбцов: ");

scanf(“%d%d”, &n1, &n2);

m = new int * [n1]; // Захват памяти для указателей - А (n1=3)

for ( int i=0; i<n1; i++) // Захват памяти для элементов - B (n2=4)

m[i] = new int [n2];

. . .

for ( i=0; i<n1; i++)

for ( j=0; j<n2; j++)

m[i] [j] = i+j; // *(*(m+i)+j) = i+j;

. . .

for ( i=0; i<n1; i++) // Освобождение памяти

delete [ ] m[i];

delete [ ] m;

. . .