C ++ reinterpret_cast - PullRequest
       13

C ++ reinterpret_cast

1 голос
/ 28 января 2011

При запуске этой программы:

#include <iostream>
int main()
{
char *name = "abc";
int i = reinterpret_cast<int>(name);
std::cout<<i<<std::endl;
return 0;
}

Я получил следующий вывод:

4202656

Что означает это число? Это адрес памяти? Но адрес памяти чего? Разве «abc» не хранится в памяти как массив символов?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 28 января 2011

Не определено. sizeof (int) может не совпадать с sizeof (char *). Я не уверен, что здесь также действуют строгие правила алиасинга.

Однако на практике, предполагая, что их размеры действительно равны (большинство 32-битных платформ), 4202656 будет представлять адрес первого символа в массиве. Я бы сделал это более чисто так:

#include <iostream>
int main()
{
   const char *name = "abc"; // Notice the const. Constant string literals cannot be modified.
   std::cout << static_cast<const void*>(name) << std::endl;
}
3 голосов
/ 28 января 2011

Вероятно, это адрес символа 'a'.
Хотя я не думаю, что это гарантировано (т. Е. Int может быть недостаточно длинным для хранения адреса).

0 голосов
/ 28 января 2011

Это адрес памяти первого символа «abc», то есть «a». Потому что массив - это указатель, который указывает на первое значение массива.
Если вы делаете cout << *(name++), обычно печатается буква "b".

Таким образом, когда вы разыгрываете name, вы пытаетесь разыграть адрес, который указывает на «а»

0 голосов
/ 28 января 2011

Возможно, вы захотите взглянуть на вопрос: приведение через void * вместо использования reinterpret_cast

Короткий ответ: это может быть что угодно.

...