在单片机编译环境中。。。C指针能直接操作内存地址吗?
发布网友
发布时间:2023-04-11 11:55
我来回答
共2个回答
热心网友
时间:2023-09-23 07:18
可以,对地址直接进行操作时单片机环境中非常常见的。比方说硬件控制寄存器的实现就是通过地址映射。
例如:
#define PERIPH_BASE ((u32)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define TIM2_BASE (APB1PERIPH_BASE + 0x0000)
#define TIM2 ((TIM_TypeDef *) TIM2_BASE)
typedef struct
{
...
vu16 DIER;
...
} TIM_TypeDef;
TIM2->DIER |= 0x0002;
展开就是((TIM_TypeDef *)((u32)0x40000000))->DIER |= 0x0002;
对地址0x40000000进行写,0x40000000是硬件控制器地址。
在你的例子中0x20应该刚好是可读可写的RAM区。
热心网友
时间:2023-09-23 07:19
开始看你的程序,觉得很好玩,所以试了一下,发现结果正如你所说的那样。每一句都是可行的。
但是平常编程很少这样使用,一般是用absacc.h这个头文件对内存直接操作,还有就是一般对这个地址的访问是用间接寻址,所以一般不会对寄存器区有影响
不信你自己下个keilC试试,在project菜单下options for target‘target 1’中listing标签下勾上Assembly code,然后在你的文件夹中有一个.lst文件,里面有你的C,和汇编语言,你就知道它操作的是哪个地址了