如何使用地址分配值?

时间:2011-04-28 17:27:47

标签: c

在C语言采访中我被问到一个问题。 问题是:

int *point;
'0x983234' is a address of memory;//I can not remember exactly

我们怎么能为那个记忆分配20? 它看起来像一个嵌入式编程问题,任何人都可以解释我吗?

3 个答案:

答案 0 :(得分:7)

我怀疑这是一个嵌入式编程问题,而且你是在稍微错误地记错了。这可能是 -

int *point = (int *) 0x983234;
*point = 20;

当存在要在地址0x983234处读/写的寄存器时,嵌入式程序员会做类似的事情。

答案 1 :(得分:5)

首先,您必须将指针设置为正确的地址(以便它指向您需要的地方)。 然后,要在该地址处写入,您可以取消引用指针并执行赋值。它看起来像这样:

int main ()
{
        volatile int *point = (int *)0x983234;
        *point = 20;
        return 0;
}

请注意volatile个关键字。建议使用它,以便编译器不做任何假设并对其进行优化。

如果您要存储更大的数据块,请使用memcpymemmove与该地址一起从/向其复制数据,如下所示:

#include <string.h>

int main ()
{
        const char data[] = "some useful stuff";
        memcpy ((char *)0x983234, data, sizeof (data));
        return 0;
}

答案 2 :(得分:1)

我使用这种方法来做它。好处是你不需要另一个变量(指针)。 假设您要将地址0x00002dbd的uint8_t类型的变量设置为200.您可以简单地编码:

*(uint8_t*)0x00002dbd=200;

或者如果你有一个包含uint8_t变量地址的uint32_t变量(不是指针),你可以这样做:

uint32_t x;
x=0x00002dbd;    
*(uint8_t*)x=200;

目标变量的类型无关紧要。只是类型而不是uint8_t部分。