Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet17/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   13   14   15   16   17   18   19   20   ...   53
Bog'liq
Lekcii AiSD 2015

Массивы указателей

Существует возможность создать массив указателей. Опре- деление вида


int* arp[20];

создает массив указателей на объекты типа in L . Элементами этого массива являются указатели на объекты типа in Y .


Массивы указателей можно инициализировать, например



Элементами массива ыоп9Ь 1 являются адреса начальных символов строк. Следует отметить, что хотя показанный способ и не приводит к ошибке при компиляции программы, он не являет- ся корректным, т.к. позволяет выделить память только для на- чальных символов каждой строки. При этом сохранность содер-


50
жимого остальных байт в течение всего времени работы про- граммы не гарантируется. Выходом из этой ситуации является выделение памяти требуемого размера (в том числе в виде масси- ва) под каждую строку отдельно.


Возможен второй вариант размещения данных (в том числе строк) в памяти, при котором расход памяти больше, но память выделяется гарантированно:



Одной из областей применения массивов указателей являет- ся сортировка сложных объектов неодинакового размера.





    1. Мнтерпрета ция составных onнcameneй

Правило интерпретации составных описателей может быть названо чтением «изнутри — наружу». Начать интерпретацию нужно с идентификатора и проверить, есть ли справа от него откры вающие скобки, квадратные или круглые. Если да — то рассматривается правая часть описателя, иначе — левая. Затем следует проверить, есть ли слева от идентификатора символ *, ecnн да то рассматривается левая часть. Если на каком либо ша- ге интерпретации справа встретится закрывающая круглая скоб- ка, которая используется для изменения порядка интерпретации, то необходимо сначала закончить интерпретацию внутри данной пары круглых скобок, а затем продолжит интерпретацию справа от закрывающей круглой скобки. На последнем шаге интерпре- тируется спецификация типа. После этого тип объявленного объ- екта полностью известен.


char *(*(*var) ())[10];
7 6 4 2 1 3 5

  1. Идентификатор vur — это

  2. Указатель на

  3. Функцию без аргументов, возвращающую

  4. Указатель на

  5. Массив из 10 элементов, являющихся

  6. Указателями на

  7. Значения типа char.

51
Рассмотрим примеры:
1. in L * va r [ b ] i // var массив указателей на значения
тнпаіпt;
2. int (*var)[5]; //vаг — указательн амассивзначеннй тнпаіпt;

  1. 1onq* va r ( ) ; // var функция, возвращающая указа—

тель на значения типа 1onq;

  1. long ( *var ) ( ) ; // va r — указатель на функцию, воз— вращающую значение типа 1onq;

3. struct both { int а;
char b;
) ( *var [ b ] ) ( ) ; // veг — массив указателей на функ-
ции, возвращающие структуры типа both.

Чаще определения структурных типов и их использование в программах оказывается разнесенным по исходному тексту. В таком случае этот пример будет выглядеть следующим образом (на языке С++):


struct both {
int а;
char b; }; both (*var[5])();



  1. double (*var())[3]; // var — функция, возвращаю- щая указательна масснвизЗ-хзначениЗтипаdоиЬlе;

  2. union sign { int х;

char у; }
* *var [ b ] 5 ) : // va r — массив из 5-ти элементов, яв- ляющихся массивами указателей на указатели на объединения типа siqn (двумерный массив указателей на указатели).

Ситуация, аналогичная примеру 5. С учетом раздельного определения объединения и переменной var, последнее будет выглядеть следующим образом:


sign **var[5] [5];

52



тов, являющихся указателями на массив указателей на объедине-
ния типа siqn.



Download 1.98 Mb.

Do'stlaringiz bilan baham:
1   ...   13   14   15   16   17   18   19   20   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling