Некоторые символы, такие как &
и *
, используются и как оператор в выражении, и как часть объявления. Контекст, в котором используется символ, определяет то, что он означает.
int i = 42;
int &r = i; //
int *p; //
p = &i //
//
*p = i; //
//
int &r2 = *p; //
В объявлениях символы &
и *
используются для формирования составных типов. В выражениях эти же символы используются для обозначения оператора. Поскольку тот же символ используется в совершенно ином смысле, возможно, стоит игнорировать внешнее сходство и считать их как будто различными символами.
int *p1 = nullptr; //
int *p2 = 0; //
//
int *p3 = NULL; //
nullptr
, который был введен новым стандартом. Литерал nullptr
имеет специальный тип, который может быть преобразован (см. раздел 2.1.2) в любой другой ссылочный тип. В качестве альтернативы можно инициализировать указатель литералом 0
, как это сделано в определении указателя p2
.
Программисты со стажем иногда используют NULL
, которую заголовок cstdlib
определяет как 0
.
Немного подробней препроцессор рассматривается в разделе 2.6.3, а пока достаточно знать, что std
, поэтому их указывают непосредственно, без префикса std::
.
При использовании переменной препроцессора последний автоматически заменяет такую переменную ее значением. Следовательно, инициализация указателя переменной NULL
эквивалентна его инициализации значением 0
. Сейчас программы С++ вообще должны избегать применения переменной NULL
и использовать вместо нее литерал nullptr
.
Нельзя присваивать переменную типа int
указателю, даже если ее значением является 0
.
int zero = 0;
pi = zero; //