Адрес в int
не обязательно точно такой же, как адрес первого байта (char
) в его представлении объекта. Это связано с тем, что некоторые машины имеют собственные регистры указателей, которые не имеют битов, так что возможно sizeof (char *) != sizeof (int *)
.
Дисконтирование, что, однако, является int *
конвертируемых в указатель на первые байты представления объекта с помощью static_cast< char * >(p)
. Вы можете передать полученный указатель на std::memcpy
для инициализации другого int
или любого класса класса POD, первым членом которого является int
. («Первый байт» поэтому определяется как тот, у которого самый низкий адрес.)
Для любой машины, с которой вы, вероятно, столкнетесь в вычислениях общего назначения, char *
и int *
являются физически одинаковыми; их отличия просто исполняются компилятором с целью обеспечения безопасности кода. Но существуют экзотические архитектуры, где static_cast
делает что-то значимое в этой ситуации, и что-то вроде reinterpret_cast
полностью не выполнит правильное преобразование.
Некоторые ОС/компилятор может иметь уменьшенные адресные байты, которые несколько увеличиваются ?. Порядок байтов? –
Как вы узнали разницу? –
Правильно, вы не «объявили массив». Вы указали * указатель »и инициализировали его, чтобы указать на первый элемент массива. У самого массива нет имени. –