русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Динамическое выделение памяти для двумерных массивов


Дата добавления: 2015-01-16; просмотров: 2220; Нарушение авторских прав


Пусть требуется разместить в динамической памяти матрицу, содержащую n строк и m столбцов. Двумерная матрица будет располагаться в оперативной памяти в форме ленты, состоящей из элементов строк. При этом индекс любого элемента двумерной матрицы можно получить по формуле

index = i*m+j;

где i - номер текущей строки; j - номер текущего столбца.

Рассмотрим матрицу 3x4 (см. рис.)

Индекс выделенного элемента определится как

index = 1*4+2=6

Объем памяти, требуемый для размещения двумерного массива, определится как

n·m·(размер элемента)

Однако поскольку при таком объявлении компилятору явно не указывается количество элементов в строке и столбце двумерного массива, традиционное обращение к элементу путем указания индекса строки и индекса столбца является некорректным:

a[i][j] - некорректно.

Правильное обращение к элементу с использованием указателя будет выглядеть как

*(p+i*m+j),

где p - указатель на массив, m - количество столбцов, i - индекс строки, j - индекс столбца.

Пример Ввод и вывод значений динамического двумерного массива

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main() {

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

int i, j, n, m;

system("chcp 1251");

system("cls");

printf("Введите количество строк: ");

scanf("%d", &n);

printf("Введите количество столбцов: ");

scanf("%d", &m);

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

a = (int*) malloc(n*m*sizeof(int));

// Ввод элементов массива

for(i=0; i<n; i++) // цикл по строкам

{

for(j=0; j<m; j++) // цикл по столбцам



{

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

scanf("%d", (a+i*m+j));

}

}

// Вывод элементов массива

for(i=0; i<n; i++) // цикл по строкам

{

for(j=0; j<m; j++) // цикл по столбцам



{

printf("%5d ", *(a+i*m+j)); // 5 знакомест под элемент массива

}

printf("\n");

}

free(a);

getchar(); getchar();

return 0;
}

Результат выполнения

Возможен также другой способ динамического выделения памяти под двумерный массив - с использованием массива указателей. Для этого необходимо:

§ выделить блок оперативной памяти под массив указателей;

§ выделить блоки оперативной памяти под одномерные массивы, представляющие собой строки искомой матрицы;

§ записать адреса строк в массив указателей.

Графически такой способ выделения памяти можно представить следующим образом.

При таком способе выделения памяти компилятору явно указано количество строк и количество столбцов в массиве.
Пример

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main() {

int **a; // указатель на указатель на строку

int i, j, n, m;

system("chcp 1251");

system("cls");

printf("Введите количество строк: ");

scanf("%d", &n);

printf("Введите количество столбцов: ");

scanf("%d", &m);

// Выделение памяти под указатели на строки

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

// Ввод элементов массива

for(i=0; i<n; i++) // цикл по строкам

{

// Выделение памяти под хранение строк

a[i] = (int*)malloc(m*sizeof(int));

for(j=0; j<m; j++) // цикл по столбцам



{

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

scanf("%d", &a[i][j]);

}

}

// Вывод элементов массива

for(i=0; i<n; i++) // цикл по строкам

{

for(j=0; j<m; j++) // цикл по столбцам



{

printf("%5d ", a[i][j]); // 5 знакомест под элемент массива

}

printf("\n");

free(a[i]); // освобождение памяти под строку

}

free(a);

getchar(); getchar();

return 0;
}

Результат выполнения программы аналогичен предыдущему случаю.

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

Для размещения в оперативной памяти матрицы со строками разной длины необходимо ввести дополнительный массив m, в котором будут храниться размеры строк.

Пример

#include <stdio.h>
#include <stdlib.h>
int main() {

int **a;

int i,j, n,*m;

system("chcp 1251");

system("cls");

printf("Введите количество строк: ");

scanf("%d", &n);

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

m = (int*)malloc(n*sizeof(int)); // массив кол-ва элементов строк

// Ввод элементов массива

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

printf("Введите количество столбцов строки %d: ", i);

scanf("%d", &m[i]);

a[i] = (int*)malloc(m[i]*sizeof(int));

for(j = 0; j<m[i]; j++) {

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

scanf("%d", &a[i][j]);

}

}

// Вывод элементов массива

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

for(j = 0; j<m[i]; j++) {

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

}

printf("\n");

}

getchar(); getchar();

return 0;
}

Результат выполнения



<== предыдущая лекция | следующая лекция ==>
Динамическое выделение памяти для одномерных массивов | Функции обработки строк в Cи


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.