Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirvanie_na_Si_dlya_zaochnikov.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.38 Mб
Скачать

4.6.2. Операции * и & при работе с указателями

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

Таблица 8. Операции для работы с указателями

Операция

Адрес

Значение, хранящееся по адресу

тип *p;

p

*p

тип p;

&p

p

Операция получения адреса & возвращает адрес своего операнда.

Например:

float a; //Объявлена вещественная переменная а

float *adr_a; //Объявлен указатель на тип float

adr_a=&a; //Оператор записывает в переменную

//adr_a адрес переменной a

Операция разадресации * возвращает значение переменной, хранящееся по заданному адресу, т.е. выполняет действие, обратное операции &:

float a; //Объявлена вещественная переменная а.

float *adr_a; //Объявлен указатель на тип float.

a=*adr_a; //Записывает в переменную a значение,

//хранящееся по адресу adr_a.

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

Значение одного указателя можно присвоить другому. Если указатели одного типа, то для этого применяют обычную операцию присваивания. Пример:

float PI=3.14159,*p1,*p2;

p1=p2=Π

Здесь определены:

  • переменная PI=3.14159

  • указатели на тип float – p1 и p2.

Далее в указатели p1 и p2 записывается адрес переменной PI.

Если указатели ссылаются на различные типы, то при присваивании значения одного указателя другому, необходимо использовать преобразование типов6. Без преобразования можно присваивать любому указателю указатель void*.

4.6.4. Арифметические операции над адресами

Над адресами С++ определены следующие арифметические операции:

  • сложение и вычитание указателей с константой;

  • вычитание одного указателя из другого;

  • инкремент;

  • декремент.

Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа на который он указывает7.

Вычитание двух указателей определяет сколько переменных данного типа размещается между указанными ячейками.

Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурными типами.

Разность двух указателей это разность их значений, деленная на размер типа в байтах. Так разность указателей на третий и нулевой элементы массива равна трем, а на третий и девятый – шести. Суммирование двух указателей не допускается.

Инкремент перемещает указатель к следующему элементу массива, а декремент – к предыдущему:

double *p1; float *p2; int *i, n;

p1++; //Увеличение значения адреса на 8.

p2++; //Увеличение значения адреса на 4.

i++; //Увеличение значения адреса на 2.

К указателям так же применимы операции отношения ==, !=, <, >, <=, >=. Иными словами указатели можно сравнивать. Например, если i указывает на пятый элемент массива, а j на первый, то отношение i>j истинно. Любой указатель всегда можно сравнить на равенство с нулем. Все эти утверждения верны, если речь идет об указателях ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определен.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]