如何将指针值与常量内存地址进行比较?
#define ADR 0x2000
unsigned int * po;
if(po<ADR) { };
上面的代码有效,但它会发出警告“指针和整数之间的比较”
答案 0 :(得分:1)
问题是你实际上是这样做的:
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 Mann(加密地)指出的那样,从技术上讲,你应该将指针实际转换为整数。有关详细信息,请参阅this answer。
答案 1 :(得分:1)
使定义属于&#39;指针&#39;。
#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) { };