русс | укр

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

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

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

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


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

Динамическое размещение массивов


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


При динамическом распределении памяти для массивов следует описать соответствующий указатель и присваивать ему значение при помощи функции calloc. Одномерный массив a[10] из элементов типа float можно создать следующим образом

float *a;

a=(float*)(calloc(10,sizeof(float));

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

#include



main ()

{ double **a;

int n,m,i;

scanf("%d %d",&n,&m);

a=(double **)calloc(m,sizeof(double *));

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

a[i]=(double *)calloc(n,sizeof(double));

. . . . . . . . . . . .

}

Аналогичным образом можно распределить память и для трехмерного массива размером n,m,l. Следует только помнить, что ненужную для дальнейшего выполнения программы память следует освобождать при помощи функции free.

#include



main ()

{ long ***a;

int n,m,l,i,j;

scanf("%d %d %d",&n,&m,&l);

/* -------- распределение памяти -------- */

a=(long ***)calloc(m,sizeof(long **));

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

{ a[i]=(long **)calloc(n,sizeof(long *));

for (j=0; i<=l; j++)

a[i][j]=(long *)calloc(l,sizeof(long));

}

. . . . . . . . . . . .

/* --------- освобождение памяти ----------*/

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

{ for (j=0; j<=l; j++)

free (a[i][j]);

free (a[i]);

}

free (a);

}

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

Пример:

#include



main()

{ int vvod(double ***, long **);

double **a; /* указатель для массива a[n][m] */

long *b; /* указатель для массива b[n] */

vvod (&a,&b);

.. /* в функцию vvod передаются адреса указателей, */

.. /* а не их значения */

..

}

int vvod(double ***a, long **b)

{ int n,m,i,j;

scanf (" %d %d ",&n,&m);

*a=(double **)calloc(n,sizeof(double *));

*b=(long *)calloc(n,sizeof(long));

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

*a[i]=(double *)calloc(m,sizeof(double));

.....

}

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

Пример:

#include



int main()

{ float *q, **b;

int i, j, k, n, m;

scanf("%d %d",&n,&m);

q=(float *)calloc(m,sizeof(float));

/* сейчас указатель q показывает на начало массива */

q[0]=22.3;

q-=5;

/* теперь начальный элемент массива имеет индекс 5, */

/* а конечный элемент индекс n-5 */

q[5]=1.5;

/* сдвиг индекса не приводит к перераспределению */

/* массива в памяти и изменится начальный элемент */

q[6]=2.5; /* - это второй элемент */

q[7]=3.5; /* - это третий элемент */

q+=5;

/* теперь начальный элемент вновь имеет индекс 0, */

/* а значения элементов q[0], q[1], q[2] равны */

/* соответственно 1.5, 2.5, 3.5 */

q+=2;

/* теперь начальный элемент имеет индекс -2, */

/* следующий -1, затем 0 и т.д. по порядку */

q[-2]=8.2;

q[-1]=4.5;

q-=2;

/* возвращаем начальную индексацию, три первых */

/* элемента массива q[0], q[1], q[2], имеют */

/* значения 8.2, 4.5, 3.5 */

q--;

/* вновь изменим индексацию . */

/* Для освобождения области памяти в которой размещен */

/* массив q используется функция free(q), но поскольку */

/* значение указателя q смещено, то выполнение */

/* функции free(q) приведет к непредсказуемым последствиям. */

/* Для правильного выполнения этой функции */

/* указатель q должен быть возвращен в первоначальное */

/* положение */

free(++q);

/* Рассмотрим возможность изменения индексации и */

/* освобождения памяти для двумерного массива */

b=(float **)calloc(m,sizeof(float *));

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

b[i]=(float *)calloc(n,sizeof(float));

/* После распределения памяти начальным элементом */

/* массива будет элемент b[0][0] */

/* Выполним сдвиг индексов так, чтобы начальным */

/* элементом стал элемент b[1][1] */

for (i=0; i < m ; i++) --b[i];

b--;

/* Теперь присвоим каждому элементу массива сумму его */

/* индексов */

for (i=1; i<=m; i++)

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

b[i][j]=(float)(i+j);

/* Обратите внимание на начальные значения счетчиков */

/* циклов i и j, он начинаются с 1 а не с 0 */

/* Возвратимся к прежней индексации */

for (i=1; i<=m; i++) ++b[i];

b++;

/* Выполним освобождение памяти */

for (i=0; i < m; i++) free(b[i]);

free(b);

...

...

return 0;

}

В качестве последнего примера рассмотрим динамическое распределение памяти для массива указателей на функции, имеющие один входной параметр типа double и возвращающие значение типа double.

Пример:

#include



#include



double cos(double);

double sin(double);

double tan(double);

int main()

{ double (*(*masfun))(double);

double x=0.5, y;

int i;

masfun=(double(*(*))(double))

calloc(3,sizeof(double(*(*))(double)));

masfun[0]=cos;

masfun[1]=sin;

masfun[2]=tan;

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

{ y=masfun[i](x);

printf("\n x=%g y=%g",x,y);

}

return 0;

}



<== предыдущая лекция | следующая лекция ==>
Массивы указателей | Директива #define


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


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

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

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


 


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

 
 

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

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