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

175 Глава 4

Операция получения адреса

Что вам нужно для этого — операция получения адреса, &. Она представляет со- бой унарную операцию, возвращающую адрес переменной — своего операнда. Он также называется операцией ссылки — по причине, которую я поясню позже в этой главе. Чтобы присвоить значение адреса переменной указателю, вы можете написать следующий оператор присваивания:

Результат выполнения этой операции можно видеть на рис. 4.5.

Вы можете использовать операцию & для получения адреса любой переменной, но для сохранения его вам понадобится переменная-указатель соответствующего типа. Например, если нужно сохранить адрес переменной double, указатель должен быть объявлен с типом double *, то есть "указатель на double".

Использование указателей

Получение адреса переменной и сохранение его в переменной-указателе — это очень хорошо, но более интересно, как его использовать. Основной смысл приме- нения указателя состоит в возможности доступа к данным, на которые он указывает. Это делается с помощью операции разыменования (*).

Операция разыменования

Для доступа к переменной, на которую указывает указатель, вы будете применять операцию разыменования указателя (*), подставляя в качестве операнда имя пере- менной-указателя. Название "операция разыменования" или "операция косвенного доступа" говорит о том, что обращение к данным не прямое, и что для получения до- ступа к данным, на которые указывает указатель, его следует "разыменовать".

Один аспект этой операции, который может показаться запутанным, связан с суще- ствованием разных применений одного и того же символа *. Во-первых, это — опера- ция арифметического умножения, во-вторых — операция разыменования, и вдобавок она используется при объявлении переменных-указателей. Всякий раз, встречая сим- вол *, компилятор определяет его значение в каждом конкретном случае из контекста. Когда вы перемножаете две переменных, например, А*В, не существует никакой дру- гой осмысленной интерпретации этого выражения, кроме как операции умножения.

Массивы, строки и указатели 176

Зачем нужны указатели?

Вопрос, который обычно возникает при изучении указателей, звучит так: "Зачем они вообще нужны?". В конце концов, получить адрес переменной, которая вам уже известна, сохранить его в указателе, чтобы потом разыменовать, выглядит излишним, то есть чем-то таким, без чего вполне можно обойтись. Однако существует несколько причин, объясняющих важность указателей.

Как вы вскоре увидите, нотацию указателей можно использовать для операций с данными, хранимыми в массиве; иногда это выполняется быстрее, чем в случае при- менения обычной нотации массивов. К тому же, когда позднее вы будете определять свои собственные функции, то увидите, что указатели интенсивно используются для обеспечения доступа функций к объемным блокам данных, таким как массивы, кото- рые определены вне этих функций. Но как вы увидите позднее, еще более важно то, что память для переменных может выделяться динамически, то есть во время выпол- нения программы. Это средство позволяет программам адаптировать использование памяти к объему обрабатываемых данных. Поскольку при этом вы не можете знать наперед, сколько переменных придется создать динамически, основной способ рабо- ты с такой памятью — через указатели. Так что будьте уверены, что указатели вам при- годятся.

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

На моем компьютере этот пример генерирует следующий вывод:

numberl = 66 Snumberl = 0012FEC8 numberl = 990 pnumber = 0012FEBC *pnumber = 99