将变量值视为地址并将该值分配给指针

时间:2019-06-07 04:46:23

标签: c

当我尝试将变量值视为地址并将该值分配给指针时遇到问题。

这是我到目前为止所做的。

  1. 声明一个指针 uint32_t * p;
  2. 声明并初始化两个变量

    uint32_t a = 0x0000000C;     uint32_t b = 0x0C00000B;

  3. 初始化指针 p =&a;

  4. 现在我想将变量b的值为0x0C00000B的值作为地址,并将其放入p。这样,指针p现在将指向地址0x0C00000B。但不知何故。

这是我尝试过的东西。

p = b;   doesn't work. 

p = (uint32_t *)b ; doesn't work .

编译后,会有一个警告:

警告:指针转换不兼容的整数,从uint32_t(又名unsigned int)分配给uint32_t(又名unsigned int);用&[-wint- conversoin来获取地址。

问题是指针p会被随机分配一些数字,而不是0x0C00000B

有什么建议吗?

3 个答案:

答案 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;

希望这会有所帮助