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


Download 1.98 Mb.
bet11/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   7   8   9   10   11   12   13   14   ...   53
Bog'liq
Lekcii AiSD 2015

L-выражения нпн леводопустимые выражения выраже- ния, ссылающиеся на некоторую именованную область или ячей— ку памяти и поэтому имеющие смысл в левой части операции присваивания (откуда и произошло это название). Простейшим примером L-выражения является имя переменной — оно ссылает- ся на ячейку памяти, которая хранит значение этой переменной.
Адрес ячейки, на которую ссылается L-выражение, может быть получен с помощью операции получения адреса &, за неко— торыми исключениями: не могут быть получены адреса битовых полей и переменных, имеющих класс памяти reqi sher.
К модифицируемы м L-выражениям (т.е. ссылающимся на ячейку памяти, значение которой доступно изменениям) относят- сЯ:
идентификаторы переменных целых, плавающих, пере- числимых типов, указателей, объектов классов, структур и объе- динений;
индексные выражения, кроме тех, которые имеют тип мас-
сива;
— выражения выбора элемента класса, структуры или объе-
динения, если выбранный элемент сам является одним из допус- тимых L-выражений;
выражения косвенной адресации, т.е. получение значения по указателю, если только их значения не имеют типы «массив» или «функция»;
L-выражения в скобках;
— ссылки на объекты;
выражения преобразования типа переменной, если размер результирующего типа не превышает размера первоначального типа (см. пример).
char *р; int i; long п;
(long*)p = &п; // допустимо (long)i п; // ошибка

Немодифицируемые L-выражения (т.е. праводопустимые) — такие, адрес которых может быть получен, но использоваться в левой части бинарной операции присваивания они не могут: идентификаторы массивов, функций, констант, переменных, объ- явленных с модификатором спи sL, операции вызова функций (для этих операций существуют исключения, которые будут pac— смотрены ниже).


Специальное применение имеет указатель на тип vo id («пустой»), который означает, что данный указатель адресует любой объект, не имеющий тип con sL или ve 1aL і 1е. Указа- тель на тип vo id в языках Си/Си++ является аналогом нетипизи- рованного указателя po in Le r в Паскале. Любой указатель (кро- ме указателей на члены классов) может быть преобразован к ука- зателю на vo id. Такое преобразование может быть неявным. Никакие другие преобразования типов указателей по умолчанию не выполняются, т.е. для обратного преобразования, указателя на vo id в указатель на реальный объект, требуется операция приведения типа. Другими словами, все указатели как бы «зна- ют», что они «произошли» от указателя на vo id, но указатель на ve id «не знает», что от него «произошли» какие-то другие ука- затели.
34



char с,
ve id* v

*р = &с;
р ;

// Неявное преобразование типа



char * g

= (char * ) v;

// Явное преобразование типа

Такое явное приведение типа указателя на ve id к типу, от- личному от ve id*, требуется при выполнении операций с указа- телями на vo id, либо с адресуемым им объектом. Например, ec— ли объявлена переменная i типа int и указатель р на тип vo id, то можно присвоить р указателю адрес переменной i, но нельзя изменить значение указателя на vo id.


im i ;
vo іd* р i
р si ;
р++ i / / ОшиО ка
( iпё * ) р+ + ;

Можно создать функцию с типом возвращаемого значения — указатель на vo id, возвращенное ею значение может быть при- своено указателю на тот тип, который требуется.


Константы при использовании указателей распространяются
как на сам указатель, так и на объект, адресуемый этим указате- лем. Либо то, либо другое, либо оба вместе в этом случае являют- ся константой. В объявлении указателя позиция модификатора con s определяет, что указатель или им адресуемый объект не должен изменяться. Рассмотрим примеры:
char а,Ь;
const char *pcc = &а; // Указатель на const char — неизменяемый объект
pcc &Ь; // Правильно
*pcc ’z’; // Неправильно
char *const cpc = &а; // Константный указа- тель на char — неизменяемый указатель



cpc

&Ь;

// Неправильно

*cpc

’z’;

// Правильно

Адрес константного объекта не может быть присвоен не- константному указателю, т.к. такое присваивание может изме- нить константу через указатель на неё.


35



      1. Download 1.98 Mb.

        Do'stlaringiz bilan baham:
1   ...   7   8   9   10   11   12   13   14   ...   53




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