Как инициализация значения int * ptr = int () не является незаконной?

Следующий код (взято # 8067658 "> отсюда ):

int* ptr = int();

компилируется в Visual C ++ и инициализирует значение указателя.

Как это возможно? Я имею в виду, что int() дает объект типа int и я не могу присвоить int указателю.

Как приведенный выше код не является незаконным?

86 голосов | спросил sharptooth 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:10:43 +0400 2011, 20:10:43

5 ответов


0

int() является константным выражением со значением 0, поэтому это правильный способ создания константы нулевого указателя. В конечном счете, это просто немного другой способ сказать int *ptr = NULL;

ответил Jerry Coffin 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:14:17 +0400 2011, 20:14:17
0

Поскольку int() дает 0, который взаимозаменяем с NULL. Сам NULL определяется как 0, в отличие от NULL, который является (void *) 0.

Обратите внимание, что это будет ошибкой:

int* ptr = int(5);

и это все еще будет работать:

int* ptr = int(0);

0 - это специальное постоянное значение, поэтому оно может рассматриваться как значение указателя. Постоянные выражения, которые выдают 0, например 1 - 1 также допустимы как константы нулевого указателя.

ответил Blagovest Buyukliev 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:13:44 +0400 2011, 20:13:44
0

Выражение int() оценивается как постоянное инициализированное по умолчанию целое число, равное 0. Это значение является специальным: оно используется инициализировать указатель на состояние NULL.

ответил Mark Ransom 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:13:36 +0400 2011, 20:13:36
0

Начиная с n3290 (C ++ 03 использует похожий текст), 4.10 Преобразование указателей [conv.ptr], абзац 1 (акцент мой):

  

1 Константа нулевого указателя является выражением целочисленного константы (5.19) целочисленного типа с нулевым значением или значением типа std :: nullptr_t. Константа нулевого указателя может быть преобразована в тип указателя; результат является нулевым значением указателя этого типа и отличается от любого другого значения указателя объекта или типа указателя на функцию. Такое преобразование называется преобразованием нулевого указателя. [...]

int() - это такое целочисленное константное выражение prvalue целочисленного типа, которое оценивается как ноль (это полный рот!), и, следовательно, используется для инициализации типа указателя. Как видите, 0 - не единственное целочисленное выражение в специальном регистре.

ответил Luc Danton 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:20:57 +0400 2011, 20:20:57
0

Ну, int не является объектом.

Я полагаю, что здесь происходит, вы говорите, что int * указывает на некоторый адрес памяти, определяемый int ()

поэтому, если int () создает 0, int * будет указывать на адрес памяти 0

ответил Megatron 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 20:13:53 +0400 2011, 20:13:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132