Инициализация и присваивание указателей

Кроме приведенного раньше способа инициализации (int* p= &t;) переменную-указатель можно проинициализировать, использую ранее определённую переменную-указатель. Например, корректным будет следующее объявление:

int* q=p;

что равносильно

int *q; q=p; ( а не *q=p;)

После этого q и p будут содержать один и тот же адрес, адрес ячейки t. Поэтому *p и *q —это одно и тоже целочисленное значение t. Заметим, что присваивания *q=p; и *p=q; некорректны. В качестве упражнения объяснить, почему.

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

int *p=1000; // Ошибка!!!

Запрещены также и такие присваивания:

a) p=1000; т.к. 1000 — константа;

б) int k; cin>>k; p=k; так как k — это целое введённое число, а p — указатель.

Это связано с тем, что система сама должна “найти” свободную ячейку и её адрес присвоить нашей переменной. Наша “помощь” при этом будет отвергнута.

Переменную-указатель нельзя также вводить. Поэтому cin>>p; недопустимо.

Не будет ошибкой, если во время объявления указателя мы его не проинициализируем. Но до его первого использования надо не забыть это сделать, например, с помощью присваивания. Правильным будет, таким образом, следующий фрагмент:

float f=1.1, *p1, *p2; p1=&f; p2=p1; cout<<(*p1)<<” “<<(*p2);

В результате будет выведено дважды одно и то же число 1.1.

Присваивание указателей допустимо только в том случае, если оба указателя содержат адрес ячеек, в которых хранятся данные одного и того же типа. Поэтому следующий фрагмент не приведёт к желаемому результату 12.34:

double x=12.34, y; int *w; w=&x; y=*w; printf (“%f”, y); // Ошибка!!!

Во время компиляции w=&x; появится сообщение об ошибке, связанное с несоответствием типов. Но если int* w; заменить на double * w, то программа выведет 12.34.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: