Что определяет этот макрос? - PullRequest
9 голосов
/ 23 февраля 2010

Я прочитал этот кусок макроса (код C) и был растерян, когда расшифровал его, чтобы узнать, что он определяет. Что это определяет?

#define sram (*((unsigned char (*)[1]) 0))

-AD

Ответы [ 3 ]

12 голосов
/ 23 февраля 2010

Я думаю sram означает «запуск ОЗУ».


unsigned char[1]

Массив размера 1 без знака.

unsigned char(*)[1]

A указатель на массив размера 1 без знака.

(unsigned char (*)[1]) 0

Приведите 0 к указателю на массив размером 1 без знака.

*((unsigned char (*)[1]) 0)

Считать часть памяти в местоположении 0 и интерпретировать результат как массив размером 1 без знака.

(*((unsigned char (*)[1]) 0))

Просто чтобы избегать 1 + 5 * 8 + 1 == 42 .

#define sram (*((unsigned char (*)[1]) 0))

Определите переменную sram для памяти, начиная с местоположения 0, и интерпретируйте результат как массив размером 1 без знака.

1 голос
/ 23 февраля 2010

Определяет "sram" как указатель на память, начинающуюся с нуля. Вы можете получить доступ к памяти через указатель, например, sram [0] - это нулевой адрес, sram [1] - это содержимое по первому адресу и т. д.

В частности, он преобразует 0 в указатель на массив беззнаковых символов и проходит через него косвенно (оставляя массив беззнаковых символов).

Аналогичный результат можно получить с помощью

#define sram ((unsigned char*)0)

Это также совершенно не определено в стандарте C, но это не мешает людям использовать его и заставлять ангелов вылетать из их пупка.

1 голос
/ 23 февраля 2010

I думаю возвращает базовый адрес (0) памяти (RAM) :)

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