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

14. Указатель

— это переменная, содержащая адрес памяти другой переменной. Общая форма объявления переменной-указателя такова:тип * имя-переменной;

Здесь тип — это базовый тип указателя. Базовый тип определяет, на данные какого типа будет указывать этот указатель. имя-переменной - это имя переменной-указателя. Так, чтобы объявить ip, как указатель на int, вы должны написать:int *ip;

Поскольку базовым типом ip указан int, этот указатель можно использовать только для указания на переменные типа int.

Теперь объявим указатель на float: float *fp;

В этом случае базовым типом fp является float, и указатель fp может указывать только на переменные типа float.

Операторы указателей

Для использования с указателями предусмотрены два специальных оператора: * и &. Оператор & возвращает адрес памяти, в которой расположен его операнд. Например, предложение ptr = &total;

помещает в ptr адрес памяти, где находится переменная total. Этот адрес является адресом ячейки памяти, в которой хранится переменная total. Этот адрес не имеет ничего общего со значением total. Про операцию & можно сказать, что она возвращает адрес переменной, перед которой она указана. Таким образом, приведенное выше предложение присваивания можно передать словами, как "ptr получает адрес total". Чтобы лучше разобраться в этом присваивании, предположим, что переменная total расположена по адресу 100. Тогда после выполнения присваивания ptr будет иметь значение 100.

Второй оператор, *, в некотором роде обратный по отношению к &. Этот оператор возвращает значение переменной, расположенной по адресу, который указан в качестве операнда этого оператора. Продолжая тот же пример, если ptr содержит адрес переменной total, то предложение

val = *ptr;

поместит значение переменной total в val. Если, например, total первоначально имела значение 3200, то val будет теперь иметь то же значение 3200, потому что это значение, которое хранится в памяти по адресу 100, т. е. по адресу, который присвоен переменной ptr. Операцию * можно назвать "по адресу". Таким образом, последнее предложение можно передать словами, как "val получает значение, расположенное по адресу ptr".

Int main()

{

int total;

int *ptr;

namespace std;

Приведенная

ниже программа выполняет последовательность только что описанных операций:

#include <iostream>

using

int val;

total = 3200; // присвоим total значение 3200

ptr = &total; // получим адрес total

val = *ptr; // получим значение по этому адресу

cout << "total равно: " << val << '\n';

return 0 ;

}

15.Массивы указателей. В чем заключается связь массивов и указателей?

Взаимосвязь массивов и указателей

Если мы имеем определение массива:

int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

то что означает простое указание его имени в программе?

ia;

Использование идентификатора массива в программе эквивалентно указанию адреса его первого элемента:

ia;

&ia[0]

Аналогично обратиться к значению первого элемента массива можно двумя способами:

// оба выражения возвращают первый элемент

*ia;

ia[0];

Чтобы взять адрес второго элемента массива, мы должны написать:

&ia[1];

Как мы уже упоминали раньше, выражение

ia+1;

также дает адрес второго элемента массива. Соответственно, его значение дают нам следующие два способа:

*(ia+1);

ia[1];

Отметим разницу в выражениях:

*ia+1

и

*(ia+1);

Операция разыменования имеет более высокий приоритет, чем операция сложения (о приоритетах операций говорится в разделе 4.13). Поэтому первое выражение сначала разыменовывает переменную ia и получает первый элемент массива, а затем прибавляет к нему 1. Второе же выражение доставляет значение второго элемента.

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

#include <iostream>

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