2015-03-13 5 views
1

Как сравнить значение указателя с постоянным адресом памяти?сравнить «int * pointer» с постоянным адресом памяти

#define ADR 0x2000 
unsigned int * po; 
if(po<ADR) { }; 

Над код работает, но это дает предупреждение «сравнение между указателем и целое»

+0

Нет, разве, вопросом является типом ADR, который представляет собой целое число – mjs

+0

Технически такое сравнение не имеет смысла. Чтобы быть переносимыми, сравнения указателей имеют смысл только между двумя указателями в один и тот же массив или выделенный блок. Но если вы, скажем, на какой-то встроенной системе, где вы действительно хотите сравнить указатель на абсолютный адрес, тогда вы должны действительно знать достаточно, чтобы понять, игнорировать или не игнорировать это предупреждение. –

ответ

0

Вопрос заключается в том, что вы фактически делаете это:

unsigned int * p; 
if(p<0x2000) {}; 

Где 0x2000 это целое число. Вы можете решить эту проблему с помощью бросание:

#define ADR 0x2000 
unsigned int * p; 
if(p<(unsigned int*)ADR) {}; 

Хотя лучший вариант может быть фактически добавить бросок в #define так:

#define ADR ((unsigned int*) 0x2000) 

Как @Alter Манн (загадочно) указывает , технически вы должны фактически наложить указатель на целое число. См. this answer.

+0

Это работает, спасибо. –

+0

Не проблема. Не забывайте повышать ;-) – mjs

+0

@mjs, http://stackoverflow.com/a/6702196/1606345 –

1

сделать определение «типа» указателем.

#define ADR ((unsigned int*) 0x2000) 
unsigned int * po; 
if(po<ADR) { }; 

Также я настоятельно рекомендую использовать типы stdint.h для таких определений. на всякий случай, если компилятор и аппаратное обеспечение имеют для вас разное понимание того, насколько велика int.

Также используйте правильные атрибуты. Определение адресов исправлений часто подразумевает отображение какой-либо памяти io. , тогда вы должны использовать volatile, чтобы сообщить компилятору, что содержимое этого адреса может неожиданно измениться.

Если в его единственном адресе используется определитель const.

#include <stdint.h> 

#define ADR ((volatile uint16_t*) 0x2000) 
uint16_t * po; 
if(po<ADR) { }; 
+0

Я предполагаю, что вы намереваетесь «изменить» или «изменить» на удивление? На самом деле это не проблема, поскольку OP сравнивает сами указатели, а не значения на этом адресе, хотя я согласен с его хорошей практикой, если ADR разыменован – mjs

+2

. Я добавил недостающее слово;) –

Смежные вопросы