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

При динамическом распределении памяти для массивов направляться обрисовать соответствующий указатель и присваивать ему значение при помощи функции 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

Подобным образом возможно распределить память и для трехмерного массива размером 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

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

Пример:

#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

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

Пример:

#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

В качестве последнего примера разглядим динамическое распределение памяти для массива указателей на функции, имеющие один входной параметр типа 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

Динамический массив с++ пример. Создание, заполнение, удаление, размер динамического массива. #55

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector