{ if (*pmin[i]<*pmin[j])
{ buf = pmin[i]; pmin[i]=pmin[j]; pmin[j]=buf;}
if (*pmax[i]>*pmax[j])
{ buf = pmax[i]; pmax[i]=pmax[j]; pmax[j]=buf;}
}
printf("\n Поубыванию:");
for(i=0;i<N;i++) printf("\t %2d ",*pmin[i]);
printf("\n Повозрастанию: ");
for(i=0;i<N;i++) printf("\t %2d ",*pmax[i]);
}
После выполнения программы:
pmin[0]=pmax[5]=&arr[4); *pmin[0]=*pmax[5]=arr[4]);
pmin[5] = pmax[0] = &arr[3]; *pmin[5] = *pmax[0] = arr[3].
5.3. ДОСТУП К ЭЛЕМЕНТАМ СТАТИЧЕСКИХ МНОГОМЕРНЫХ МАССИВОВ
В соответствии с оператором объявления статического одномерного массива <спецификация типа > <идентификатор>[<целое число>]; –
программе становятся доступны 2 объекта:
· массив, занимающий <целое число>*sizeof(<спецификация типа>) байт;
· указатель-константа с именем <идентификатор> и значением – адресом одномерного массива.
В соответствии с синтаксисом С в языке существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы, поэтому двумерный массив определяется как массив массивов и программа получает доступ к нескольким разным объектам.
Объявление статического двумерного массива charM_2[3][2]; порождает в программе 3 объекта: указатель-константу с идентификатором M_2, массив из 3-х указателей-констант и массив из 6 символов.
Для доступа к элементам обоих массивов используются адресные выражения с указателем-константой M_2:
· доступ к i-ому элементу массива указателей-констант осуществляется с указанием одного индексного выражения в форме M_2 [i] или *( M_2 + i ).
· для доступа к элементу с номером (i, j) двумерного массива символов должны быть использованы два индексные выражения в форме M_2[i][j] или эквивалентные этой форме выражения: *(*( M_2 + i)+ j) и (*(M_2 + i))[j ].
В языке С можно пользоваться массивами, размерность которых больше 2. Размещение многомерного массива, порождение в программе дополнительных объектов и доступ к элементам массивов (основного и дополнительных) происходит аналогично. При размещении элементов многомерных массивов они располагаются в памяти таким образом, что быстрее всего изменяется последний индекс, а медленнее - первый. Такой порядок дает возможность обращаться к любому элементу многомерного массива, используя адрес его начального элемента и индексные выражения за счет порождения в программе дополнительных объектов.
Например, объявление intar3[3][4][5] порождает в программе кроме самого трехмерного массива из шестидесяти чисел типа int массив из 12 указателей-констант на тип int, массив из трех указателей-констант на массив указателей на int, и указатель-константу на массив массивов указателей на int. Программа примера 5.3 демонстрирует разные способы обращения к элементу ar3[i][j][k].
Пример 5.3.
#include <stdio.h>
#include <stdlib.h>
void main (void)
{ int ar3[3][4][5], ff; int i = 1, j = 2, k =1;
ar3[1][2][1] = 12;
ff = *(*(*(ar3+i)+j)+k); printf("\n Variant 1: ar3[1][2][1] = %d",ff );
ff = *(*(ar3[i]+j)+k); printf("\n Variant 2: ar3[1][2][1] = %d",ff );
ff = *(ar3[i][j]+k); printf("\n Variant 3: ar3[1][2][1] = %d",ff );
ff = *((*(ar3+i))[j]+k); printf("\n Variant 4: ar3[1][2][1] = %d",ff );
}
Массивы, у которых число измерений больше 3, используются довольно редко, т.к. во-первых, объем требуемой памяти с ростом числа измерений растет экспоненциально, а во-вторых, доступ к элементам многомерного массива происходит значительно медленнее: при обращении к многомерным массивам компьютер много времени тратит на вычисление адреса, поскольку требуется учитывать значение каждого индекса.
5.4. МОДЕЛИРОВАНИЕ ДИНАМИЧЕСКОГО ДВУМЕРНОГО МАССИВА
Следует отметить 2 принципиальных отличия, сравнивая процессы выделения памяти для динамического многомерного массива и статического многомерного массива.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.