Указатели и приведение в C / C ++ - PullRequest
2 голосов
/ 26 февраля 2012

Я очень запутался с этим типом кастинга. Может кто-нибудь объяснить, что именно происходит в этом предложении?

x = *(char*)&n;

Это полный код, и он используется для того, чтобы узнать, является ли машина с прямым или прямым порядком байтов.

 int n = 0x1234567;
 char x;
 x = *(char*)&n;

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012

&n принимает адрес n, который является адресом целого числа.

(char*)(&n) интерпретирует эту информацию как адрес char.

*(char*)(&n) разыменовывает этот адрес, то есть это значение char, которое живет по этому адресу. Другими словами, это значение первого байта представления целого числа n.

Теперь вы можете проверить, является ли это 0x01 или 0x67, чтобы определить, в каком направлении хранится ваше целое число.

В качестве примечания: всегда разрешается переинтерпретировать любой действительный адрес как адрес символа и проверять его, как в C, так и в C ++. Это необходимо всякий раз, когда вы хотите выполнить ввод / вывод, поскольку вы можете вводить / выводить только немые байтовые потоки, которые вы получаете таким образом (то есть вы можете рассматривать любой T x; как char[sizeof(T)] и получить к нему доступ через (char*)&x).

4 голосов
/ 26 февраля 2012

&n принимает адрес n, но, что важно, это самый младший адрес байта n.(char *) говорит компилятору обрабатывать этот адрес как указатель на char, то есть указатель на один байт.* разыменовывает, что он получает значение байта, сохраненное по этому адресу.

Таким образом, общий эффект состоит в том, что x устанавливается на значение, сохраненное в младшем адресуемом байте n.

3 голосов
/ 26 февраля 2012

Чтобы помочь вам визуализировать, почему этот код может использоваться для обнаружения 'endiannes' среды. В среде с прямым порядком байтов, которая использует 32-битные числа, число будет сохраняться в памяти в этом порядке байтов

01 23 45 67

В среде с прямым порядком байтов это будет следующий порядок

67 45 23 01

Если вы принудительно приведете указатель int к инициализированному int к указателю char, указатель char будет привязан кпервый байт типа int, хранящийся в памяти.

В среде с прямым порядком байтов это будет равно 01, а в среде с небольшим порядком байтов это будет 67.

Если целые числа не являются 32-битными, вы получите в целом разные значения.

...