Динамическое размещение массивов
Пример:
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.
Пример:
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; }