比较" int *指针"具有恒定的内存地址

时间:2015-03-13 16:31:47

标签: c pointers memory comparison microcontroller

如何将指针值与常量内存地址进行比较?

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

上面的代码有效,但它会发出警告“指针和整数之间的比较”

2 个答案:

答案 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) { };