Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

int* ptr = &var; // указатель ptr хранит адрес переменной var

Для определения адреса объекта используется оператор взятия адреса, унарный

&
. Итак, если переменная var хранится в участке памяти, первая ячейка которого имеет адрес 4096 (или 212), то указатель
ptr
будет хранить число 4096.

По существу, память компьютера можно рассматривать как последовательность байтов, пронумерованную от

0
до
size-1
. Для некоторых машин такое утверждение носит слишком упрощенный характер, но для нашей модели этого пока достаточно.

Каждый тип имеет соответствующий тип указателя. Рассмотрим пример.

char ch = 'c';

char* pc = &ch; // указатель на char

int ii = 17;

int* pi = ⅈ // указатель на int

Если мы хотим увидеть значение объекта, на который ссылаемся, то можем применить к указателю оператор разыменования, унарный

*
. Рассмотрим пример.

cout << "pc==" << pc << "; содержимое pc==" << *pc << "\n";

cout << "pi==" << pi << "; содержимое pi==" << *pi << "\n";

Значением

*pc
является символ
c
, а значением
*pi
— целое число
17
. Значения переменных
pc
и
pi
зависят от того, как компилятор размещает переменные
ch
и
ii
в памяти. Обозначение, используемое для значения указателя (адрес), также может изменяться в зависимости от того, какие соглашения приняты в системе; для обозначения значений указателей часто используются шестнадцатеричные числа (раздел A.2.1.1).

Оператор разыменования также может стоять в левой части оператора присваивания.

*pc = 'x'; // OK: переменной char, на которую ссылается

// указатель pc,

// можно присвоить символ 'x'

*pi = 27; // OK: указатель int* ссылается на int, поэтому *pi —

// это int

*pi = *pc; // OK: символ (*pc) можно присвоить переменной

// типа int (*pi)

Обратите внимание: несмотря на то, что значение указателя является целым числом, сам указатель целым числом не является. “На что ссылается
int
?” — некорректный вопрос. Ссылаются не целые числа, а указатели. Тип указателя позволяет выполнять операции над адресами, в то время как тип
int
позволяет выполнять (арифметические и логические) операции над целыми числами. Итак, указатели и целые числа нельзя смешивать.

int i = pi; // ошибка: нельзя присвоить объект типа int*

// объекту типа int

pi = 7; // ошибка: нельзя присвоить объект типа int объекту

// типа int*

Аналогично, указатель на

char
(т.е.
char*
) — это не указатель на
int
(т.е.
int*
). Рассмотрим пример.

pc = pi; // ошибка: нельзя присвоить объект типа int*

// объекту типа char*

pi = pc; // ошибка: нельзя присвоить объект типа char*

// объекту типа int*

Почему нельзя присвоить переменную

pc
переменной
pi
? Один из ответов — символ
char
намного меньше типа
int
.

char ch1 = 'a';

char ch2 = 'b';

char ch3 = 'c';

char ch4 = 'd';

int* pi = &ch3; // ссылается на переменную,

// имеющую размер типа char

// ошибка: нельзя присвоить объект char* объекту

// типа int*

// однако представим себе, что это можно сделать

*pi = 12345; // попытка записи в участок памяти, имеющий размер

// типа char

*pi = 67890;

Как именно компилятор размещает переменные в памяти, зависит от его реализации, но, скорее всего, это выглядит следующим образом.

<
  • Читать дальше
  • 1
  • ...
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: