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

Динамические многомерные массивы

По аналогии с одномерными массивами многомерные массивы могут создаваться динамически. Рассмотрим пример создания двухмерного массива n × m (матрица n × m), при этом значения n и m заранее неизвестны – вводятся с клавиатуры. В примере создается матрица n × m, заполняется случайными числами, выводится на печать, в конце программы память освобождается.

#include <stdio.h>

#include <stdlib.h>

void main()

{

int **p; // Указатель на указатель может быть использован для выделения памяти под

// 2-х мерный массив динамически

int n, m; // Заранее неизвестные размерности массива

int i, j; // Индексные переменные

printf("n="); scanf("%d", &n); // Ввод с клавиатуры числа строк матрицы

printf("m="); scanf("%d", &m); // Ввод с клавиатуры числа столбцов матрицы

p=malloc(n*sizeof(int *)); // Выделяем память под массив указателей

// Выделяем память для каждого указателя в массиве указателей

for(i=0; i<n; i++) p[i]=malloc(m*sizeof(int));

// Заполняем массив (матрицу) случайными числами и печатаем его

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

{

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

{

p[i][j]=rand() % 100; // Получаем псевдослучайное целое число

printf("%d ", p[i][j]);

}

printf("\n"); // После печать строки матрицы переход на новую строчку

}

// Освобождаем память, порядок освобождения обратен порядку выделения

for(i=0; i<n; i++) free(p[i]); // Освобождаем память для строк матрицы

free(p);// освобождаем память для массива указателей

}

Указатель на массив указателей и указатель на массив

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

Например:

Int ** p1; // Указатель на массив указателей

Int (*p2)[10]; // Указатель на массив из 10 элементов типа int

При выполнении арифметических операций с такими указателями будет происходить следующее:

p1++; // Значение адреса увеличится на 4

p2++; // Значение адреса увеличится на 40=4*10 в Win32

Это происходит потому, что при выполнении арифметических операций с указателями за единицу принимается размер объекта в памяти, на который указывает указатель.

В заключение представим пример программы, которая выполняет сортировку элементов массива в порядке неубывания. При сортировке используется алгоритм прямого выбора: в массиве размерности n ищется минимальный элемент, потом минимальный элемент меняется местами с первым элементом, после этого первый элемент будет на своем месте; на следующем шаге рассматривается массив размерности на единицу меньший (без первого элемента) к нему применяется тот же алгоритм, и т.д. Массив в программе создается динамически, размерность вводится с клавиатуры, заполняется случайными числа и выводится на печать до сортировки и после сортировки.

#include <stdio.h>

#include <stdlib.h>

void main()

{

int *pM; // Указатель на массив

int n; // Число элементов массива

printf("n="); scanf("%d", &n); // Ввод числа элементов

// Выделение памяти для массива

pM=(int *)malloc(n*sizeof(int));

// Заполняем массив псевдослучайными числами в интервале 0..99

for(int i=0; i<n; i++) pM[i]=rand() % 100;

// Печатаем исходный массив

for(int i=0; i<n; i++) printf("%d ", pM[i]);

for(int i=0; i<n-1; i++) // Считаем, что массив начинается с i-го

// элемента

{

int imin=i, // Индекс миниамльного элемента

// (считаем минимальным i-ый элемент)

min=pM[i]; // Значение минимального элемента

// Сравниваем выбранный элемент со всеми последующими

for(int j=i+1; j<n; j++)

if (pM[j]<min) // Нашли элемент меньший чем min

{

min=pM[j];

imin=j;

}

// Минимальный элемент меняем с i-m

pM[imin]=pM[i];

pM[i]=min;

}

// Пеачть массива после сортировки

printf("\n"); // Переход на новую строчку

for(int i=0; i<n; i++) printf("%d ", pM[i]);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]