Что печатается? C ++ указатель на целое число - PullRequest
8 голосов
/ 12 мая 2011

Итак, у меня есть следующий (очень простой) код:

int* pInt = new int(32);

std::cout<< pInt << std::endl;  //statement A
std::cout<< *pInt << std::endl; //statement B
std::cout << &pInt << std::endl; //statement C

Итак, вот что я думаю Я делаю (я узнал, что в C ++ я редко когда-либо делаю то, чтоЯ думаю, что я делаю):

  1. Создание указателя на целое число и вызов его pInt
  2. StatementA печатает адрес значения '32'
  3. StatementB печатаетцелочисленное значение, на которое указывает мой указатель (что происходит потому, что я разыменовываю указатель, тем самым давая мне доступ к тому, на что он указывает).
  4. StatementC печатает адрес самого указателя (неадрес целочисленного значения '32').

Все ли это правильно?

Ответы [ 3 ]

10 голосов
/ 12 мая 2011

Ваше второе утверждение неверно. Вы выделяете новый int из кучи. Константа времени компиляции "32" не имеет адреса, и поэтому вы не можете ее получить. Вы создаете int, значение которого равно 32. Это не одно и то же.

int* pInt1 = new int(32);
int* pInt2 = new int(32);

pInt1 и pInt2 не равны.

О, последнее: C ++ - довольно строго типизированный язык, и нет необходимости добавлять префиксы к именам переменных. Это называется венгерской нотацией, она очень распространена в библиотеках и примерах Microsoft C, но обычно здесь не нужна.

2 голосов
/ 13 мая 2011
  • Печать адреса памяти pInt, который указывает на область памяти (4 байта), которая содержит значение 32:

std::cout<< pInt << std::endl; //statement A

  • Распечатайте содержимое этого адреса памяти:

std::cout<< *pInt << std::endl; //statement B, which should print 32

  • Напечатайте адрес памяти самого указателя:

std::cout << &pInt << std::endl; //statement C

0 голосов
/ 13 мая 2011

Оператор B печатает значение объекта, на который указывает pInt.Он указывает на int со значением 32, поэтому печатает 32.

Операторы A и C не определены.Печатным объектом в обоих случаях является указатель, который на уровне машины является адресом памяти.Большинство компиляторов печатают шестнадцатеричное число, хотя нет гарантии, что это будет сделано.Значение также будет зависеть от того, где хранятся объекты.Например, g ++ в 32-битной Windows Vista на моем компьютере печатает:

0x900ee8
32
0x22ff1c

Borland печатает:

016E33B0
32
0012FF50

Visual C ++ печатает

00131D10
32
0028FE24

Возможно, выполучить разные результаты.Первое число - это адрес, выделенный новым int () из кучи и сохраненный в pInt.Он выделил 4-байтовый массив, сохранил число 32 и сохранил адрес в pInt.Второе число - это сохраненное значение, интерпретируемое как int.Третье число - это адрес (в стеке) pInt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...