将 "int* pointer" 与常量内存地址进行比较
compare "int* pointer" with constant memory address
如何比较指针值与常量内存地址?
#define ADR 0x2000
unsigned int * po;
if(po<ADR) { };
以上代码有效,但会给出警告 "comparison between pointer and integer"
问题是你实际上是这样做的:
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。
将定义设为 'pointer'。
#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) { };
如何比较指针值与常量内存地址?
#define ADR 0x2000
unsigned int * po;
if(po<ADR) { };
以上代码有效,但会给出警告 "comparison between pointer and integer"
问题是你实际上是这样做的:
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。
将定义设为 'pointer'。
#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) { };