当我尝试将变量值视为地址并将该值分配给指针时遇到问题。
这是我到目前为止所做的。
声明并初始化两个变量
uint32_t a = 0x0000000C; uint32_t b = 0x0C00000B;
初始化指针 p =&a;
这是我尝试过的东西。
p = b; doesn't work.
p = (uint32_t *)b ; doesn't work .
编译后,会有一个警告:
警告:指针转换不兼容的整数,从uint32_t(又名unsigned int)分配给uint32_t(又名unsigned int);用&[-wint- conversoin来获取地址。问题是指针p会被随机分配一些数字,而不是0x0C00000B
有什么建议吗?
答案 0 :(得分:1)
“最正确”的方法是在整数与指针之间转换而没有任何警告,您必须先转换为uintptr_t
,然后转换为void*
,再转换为指针类型。
uint32_t b = 1;
uint32_t *p = (uint32_t*)(void*)(uintptr_t)b;
但是usually位程序员只是do macros,他们是正确的演员:
#define A_ADDR ((uint32_t*)0x0000000A)
#define B_ADDR ((uint32_t*)0x0000000B)
uint32_t *p = A_ADDR;
p = B_ADDR;
在gcc -Wall -Wextra -pedantic
上进行编译而不会发出警告。
或者有时只是具有常数的宏,并且应该将用户转换为(void*)
或正确的类型:
#define A_ADDR 0x0000000A
#define B_ADDR 0x0000000B
uint32_t *p = (uint32_t*)A_ADDR;
p = (uint32_t*)B_ADDR;
或者,如果您信任编译器,则它们可以是static const
变量,例如。 static const uint32_t *A_ADDR = (uint32_t*)0x0000000A;
答案 1 :(得分:0)
我理解您的问题如下。
您将存储位置的地址存储在变量中,并将其分配给指针。
在您的示例中, 声明一个指针uint32_t * p; 声明并初始化两个变量 uint32_t a = 0x0000000C; uint32_t b = 0x0C00000B;
如果您想知道地址0x0000000C的值,则需要为ptr分配一个值。喜欢,
p = a;不像p =&a;
将在指针变量中存储a的地址。根据您的问题陈述,这是不正确的。
答案 2 :(得分:0)
您已经有了解决方案- p =(uint32_t *)b;不起作用。 上一行将变量“ b”中的值视为地址,并将该地址分配给指针“ p”。但是您可能会收到一些编译器警告。 根据我对您的用例的理解,p可用作内存中某个位置的跟踪器。如果是这样,请考虑编写与此类似的内容,以免产生任何警告-
#define TRACKER_BASE_ADDR (0x0C00000B)
#define TRACKER_OFFSET (0x04)
uint32_t *p = TRACKER_BASE_ADDR;
// When you want to update the tracker use this
p = p + TRACKER_OFFSET;
// And when you want to read the value at tracker,
uint32_t val = *p;
希望这会有所帮助