Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 12

        {  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 принципиальных отличия, сравнивая процессы выделения памяти для динамического многомерного массива и статического многомерного массива.