2013-06-30 2 views
3

Предположим, у меня есть массив объявлен как это:Является ли указатель таким же, как адрес байта?

int *p = new int[size]; 

И p волю точки курса на адрес первого элемента. Но поскольку байт является наименьшей адресной единицей памяти, p фактически указывает на первый байт первых 4 байтов первого элемента массива?

+0

Некоторые ОС/компилятор может иметь уменьшенные адресные байты, которые несколько увеличиваются ?. Порядок байтов? –

+0

Как вы узнали разницу? –

+2

Правильно, вы не «объявили массив». Вы указали * указатель »и инициализировали его, чтобы указать на первый элемент массива. У самого массива нет имени. –

ответ

7

Адрес в int не обязательно точно такой же, как адрес первого байта (char) в его представлении объекта. Это связано с тем, что некоторые машины имеют собственные регистры указателей, которые не имеют битов, так что возможно sizeof (char *) != sizeof (int *).

Дисконтирование, что, однако, является int *конвертируемых в указатель на первые байты представления объекта с помощью static_cast< char * >(p). Вы можете передать полученный указатель на std::memcpy для инициализации другого int или любого класса класса POD, первым членом которого является int. («Первый байт» поэтому определяется как тот, у которого самый низкий адрес.)

Для любой машины, с которой вы, вероятно, столкнетесь в вычислениях общего назначения, char * и int * являются физически одинаковыми; их отличия просто исполняются компилятором с целью обеспечения безопасности кода. Но существуют экзотические архитектуры, где static_cast делает что-то значимое в этой ситуации, и что-то вроде reinterpret_cast полностью не выполнит правильное преобразование.

+0

Для большей части урока плакат должен выполнить 'cout << p <<" "<< p + 1 << endl;' Затем он должен написать ' char * pc = static_cast < char * > (p) ', а затем' cout << pc << "" << pc + 1 << endl; '. –

0

Да, это действительно указывает на первый из четырех байтов. В случае большого Endian четыре байта будут выглядеть как 0 0 0 1. В случае с маленьким Endian байты будут выглядеть как 1 0 0 0. Итак, чтобы быть уверенным, что в случае большого Endian, первый байт будет содержать 0, а в случае маленького Endian первый байт будет содержать 1.

+0

Почему бы и нет в little endian? –

+0

Возможно, было бы лучше сказать самый низкий адрес четырех байты, потому что «первый» оставляет место для вопросов, относящихся к контенту. – dmckee

0

Короче говоря, нет. Поскольку p инициализируется как int *, каждый элемент p будет принимать количество байтов, которое делает int. Для уточнения:

int* p = new int[4]; 
for(int i = 0; i < 4; i++) 
    p[i] = i; 
cout << p[0] << " " << p[1] << " " << p[2] << " " << p[3]; 

Это вывело бы «0 1 2 3». Вам не нужно беспокоиться об отдельных байтах. В общем, это также верно:

*p = p[0]; 
Смежные вопросы