Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19
Download 1.98 Mb.
|
Lekcii AiSD 2015
Массивы указателей
Существует возможность создать массив указателей. Опре- деление вида int* arp[20]; создает массив указателей на объекты типа in L . Элементами этого массива являются указатели на объекты типа in Y . Массивы указателей можно инициализировать, например Элементами массива ыоп9Ь 1 являются адреса начальных символов строк. Следует отметить, что хотя показанный способ и не приводит к ошибке при компиляции программы, он не являет- ся корректным, т.к. позволяет выделить память только для на- чальных символов каждой строки. При этом сохранность содер- 50
Возможен второй вариант размещения данных (в том числе строк) в памяти, при котором расход памяти больше, но память выделяется гарантированно: Одной из областей применения массивов указателей являет- ся сортировка сложных объектов неодинакового размера. Мнтерпрета ция составных onнcameneй Правило интерпретации составных описателей может быть названо чтением «изнутри — наружу». Начать интерпретацию нужно с идентификатора и проверить, есть ли справа от него откры вающие скобки, квадратные или круглые. Если да — то рассматривается правая часть описателя, иначе — левая. Затем следует проверить, есть ли слева от идентификатора символ *, ecnн да — то рассматривается левая часть. Если на каком либо ша- ге интерпретации справа встретится закрывающая круглая скоб- ка, которая используется для изменения порядка интерпретации, то необходимо сначала закончить интерпретацию внутри данной пары круглых скобок, а затем продолжит интерпретацию справа от закрывающей круглой скобки. На последнем шаге интерпре- тируется спецификация типа. После этого тип объявленного объ- екта полностью известен. char *(*(*var) ())[10]; 7 6 4 2 1 3 5 Идентификатор vur — это Указатель на Функцию без аргументов, возвращающую Указатель на Массив из 10 элементов, являющихся Указателями на Значения типа char. 51 Рассмотрим примеры: 1. in L * va r [ b ] i // var массив указателей на значения тнпаіпt; 2. int (*var)[5]; //vаг — указательн амассивзначеннй тнпаіпt; 1onq* va r ( ) ; // var функция, возвращающая указа— тель на значения типа 1onq; long ( *var ) ( ) ; // va r — указатель на функцию, воз— вращающую значение типа 1onq; 3. struct both { int а; char b; ) ( *var [ b ] ) ( ) ; // veг — массив указателей на функ- ции, возвращающие структуры типа both. Чаще определения структурных типов и их использование в программах оказывается разнесенным по исходному тексту. В таком случае этот пример будет выглядеть следующим образом (на языке С++): struct both { int а; char b; }; both (*var[5])(); double (*var())[3]; // var — функция, возвращаю- щая указательна масснвизЗ-хзначениЗтипаdоиЬlе; 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: |
ma'muriyatiga murojaat qiling