
- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
175 Глава 4
Операция получения адреса
Что вам нужно для этого — операция получения адреса, &. Она представляет со- бой унарную операцию, возвращающую адрес переменной — своего операнда. Он также называется операцией ссылки — по причине, которую я поясню позже в этой главе. Чтобы присвоить значение адреса переменной указателю, вы можете написать следующий оператор присваивания:
Результат выполнения этой операции можно видеть на рис. 4.5.
Вы можете использовать операцию & для получения адреса любой переменной, но для сохранения его вам понадобится переменная-указатель соответствующего типа. Например, если нужно сохранить адрес переменной double, указатель должен быть объявлен с типом double *, то есть "указатель на double".
Использование указателей
Получение адреса переменной и сохранение его в переменной-указателе — это очень хорошо, но более интересно, как его использовать. Основной смысл приме- нения указателя состоит в возможности доступа к данным, на которые он указывает. Это делается с помощью операции разыменования (*).
Операция разыменования
Для доступа к переменной, на которую указывает указатель, вы будете применять операцию разыменования указателя (*), подставляя в качестве операнда имя пере- менной-указателя. Название "операция разыменования" или "операция косвенного доступа" говорит о том, что обращение к данным не прямое, и что для получения до- ступа к данным, на которые указывает указатель, его следует "разыменовать".
Один аспект этой операции, который может показаться запутанным, связан с суще- ствованием разных применений одного и того же символа *. Во-первых, это — опера- ция арифметического умножения, во-вторых — операция разыменования, и вдобавок она используется при объявлении переменных-указателей. Всякий раз, встречая сим- вол *, компилятор определяет его значение в каждом конкретном случае из контекста. Когда вы перемножаете две переменных, например, А*В, не существует никакой дру- гой осмысленной интерпретации этого выражения, кроме как операции умножения.
Массивы,
строки
и
указатели
Зачем нужны указатели?
Вопрос, который обычно возникает при изучении указателей, звучит так: "Зачем они вообще нужны?". В конце концов, получить адрес переменной, которая вам уже известна, сохранить его в указателе, чтобы потом разыменовать, выглядит излишним, то есть чем-то таким, без чего вполне можно обойтись. Однако существует несколько причин, объясняющих важность указателей.
Как вы вскоре увидите, нотацию указателей можно использовать для операций с данными, хранимыми в массиве; иногда это выполняется быстрее, чем в случае при- менения обычной нотации массивов. К тому же, когда позднее вы будете определять свои собственные функции, то увидите, что указатели интенсивно используются для обеспечения доступа функций к объемным блокам данных, таким как массивы, кото- рые определены вне этих функций. Но как вы увидите позднее, еще более важно то, что память для переменных может выделяться динамически, то есть во время выпол- нения программы. Это средство позволяет программам адаптировать использование памяти к объему обрабатываемых данных. Поскольку при этом вы не можете знать наперед, сколько переменных придется создать динамически, основной способ рабо- ты с такой памятью — через указатели. Так что будьте уверены, что указатели вам при- годятся.
В следующем примере вы можете испытать различные аспекты операций с указа- телями.
На моем компьютере этот пример генерирует следующий вывод:
numberl = 66 Snumberl = 0012FEC8 numberl = 990 pnumber = 0012FEBC *pnumber = 99