Операции с указателями в С++
При работе с указателями в С++ доступны следующие операции:-разадресация, или косвенное обращение к объекту (*); присваивание;
сложение с константой; вычитание; инкремент (++); декремент (—); сравнение; приведение типов.
При работе с указателями используют операцию получения адреса (&).
Операция разадресации - для доступа к величине, адрес которой хранится в указателе.
Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа):
Поясним пример. Конструкцию *имя_указателя можно использовать в левой части оператора присваивания, так как она является L-значением и определяет адрес области памяти. Для простоты - конструкцию можно считать именем переменной, на которую ссылается указатель. С ней допустимы все действия, определенные для величин соответствующего типа (если указатель инициализирован).
Замечание. На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации даст разные результаты.
Пример.
выдаст на экран строку:
Причина в том, что значения указателей pint и pchar одинаковы, но разадресация pchar дает в результате один младший байт по этому адресу, а pint — два младших байта.
В примере при инициализации указателей были использованы операции приведения типов.
Синтаксис операции явного приведения типа: перед именем переменной в скобках указывается тип, к которому ее требуется преобразовать. При этом не гарантируется сохранение информации,
Совет. В общем случае явных преобразований типа следует избегать.
При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кроме void*. Указатель может неявно преобразовываться в значение тина bool (например, в выражении условного оператора), при этом ненулевой указатель преобразуется в true, а нулевой в false.
Присваивание без явного приведения типов допускается в двух случаях: • указателям типа void*; • если тип указателей справа и слева от операции присваивания один и тот же.
Старые версии компилятора могут выдать в результате строку:
При работе с указателями используют операцию получения адреса (&).
Операция разадресации - для доступа к величине, адрес которой хранится в указателе.
Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа):
char а; //переменная типа char /* выделение памяти под указатель и динамическую переменную char*/ char * р = new char; *р = 'Ю'; а = *р; //присваивание значения обеим переменным
Замечание. На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации даст разные результаты.
Пример.
#includeint main(){ unsigned long int A = 0Xcc77ffaa; unsigned short int* pint = (unsigned short int*) &A; unsigned char* pchar = (unsigned char *) &A; printf(| %x | %x | %x |", A, *pint, *pchar); return 0; }
| cc77ffaa | ffaa | аа |Совет. Пользоваться только при полном понимании происходящего.
Причина в том, что значения указателей pint и pchar одинаковы, но разадресация pchar дает в результате один младший байт по этому адресу, а pint — два младших байта.
В примере при инициализации указателей были использованы операции приведения типов.
Синтаксис операции явного приведения типа: перед именем переменной в скобках указывается тип, к которому ее требуется преобразовать. При этом не гарантируется сохранение информации,
Совет. В общем случае явных преобразований типа следует избегать.
При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кроме void*. Указатель может неявно преобразовываться в значение тина bool (например, в выражении условного оператора), при этом ненулевой указатель преобразуется в true, а нулевой в false.
Присваивание без явного приведения типов допускается в двух случаях: • указателям типа void*; • если тип указателей справа и слева от операции присваивания один и тот же.
Старые версии компилятора могут выдать в результате строку:
| ffaa | сс77 | ffaaТаким образом, неявное преобразование выполняется только к типу void*. Значение 0 неявно преобразуется к указателю на любой тип. Присваивание указателей на объекты указателям на функции (и наоборот) недопустимо. Запрещено и присваивать значения указателям-константам, впрочем, как и константам любого типа (присваивать значения указателям на константу и переменным, на которые ссылается указатель-константа, допускается).