Операции с указателями в С++

При работе с указателями в С++ доступны следующие операции:-разадресация, или косвенное обращение к объекту (*); присваивание; сложение с константой; вычитание; инкремент (++); декремент (—); сравнение; приведение типов.

При работе с указателями используют операцию получения адреса (&).

Операция разадресации - для доступа к величине, адрес которой хранится в указателе.

Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа):
char а; //переменная типа char 
/* выделение памяти под указатель и динамическую переменную char*/ 
char * р = new char; 
*р = 'Ю'; а = *р; //присваивание значения обеим переменным
Поясним пример. Конструкцию *имя_указателя можно использовать в левой части оператора присваивания, так как она является L-значением и определяет адрес области памяти. Для простоты - конструкцию можно считать именем переменной, на которую ссылается указатель. С ней допустимы все действия, определенные для величин соответствующего типа (если указатель инициализирован).

Замечание. На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации даст разные результаты.

Пример.
#include 
int 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 неявно преобразуется к указателю на любой тип. Присваивание указателей на объекты указателям на функции (и наоборот) недопустимо. Запрещено и присваивать значения указателям-константам, впрочем, как и константам любого типа (присваивать значения указателям на константу и переменным, на которые ссылается указатель-константа, допускается).
Онлайн всего: 7
Гостей: 7
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте