如何使用指针直接访问内存位置?

时间:2013-11-14 11:35:45

标签: c

以下代码有什么问题:

unsigned int *ptr;    
ptr=(unsigned int*)0x1234;
*ptr=10;
/*do someting*/
*ptr=100;

重点,我已经阅读了微控制器的存储器映射,程序员可以非常使用这个位置,因此排除了不拥有内存的情况。 我想知道的是,我可以使用上面的方法直接访问内存位置吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

是的没关系,除非(如你所说)你在可访问的内存范围内。

另外我想补充一下,既然你提到了微控制器,如果这是SFR或GPR的地址那么它的别名(使用#define)必须已经在控制器的头中定义,所以它是更好地使用该别名,以提高可读性/可理解性和可移植性。

编辑:(正如 Vlad 在评论中指出)
使用volatile可以让您的程序更安全。可靠,因为编译器不会优化立即内存写入,并且您可以确保您编写的值立即写入您想要的位置。

答案 1 :(得分:1)

是的,您可以使用它,但要注意对齐问题。根据您的微控制器可能会发生以下情况:

uint16_t * p1 = (uint16_t *)0x8;
uint16_t * p2 = (uint16_t *)0x9;
*p1 = 1; // Ok
*p2 = 1; // Unaligned access -> Crash or something else
例如,ARM要求16位变量在偶数地址上对齐(可被2整除)。