这是代码:
#include "stm32f4xx.h"
#define BASE_ADDRESS 0x2000000
#define OFFSETA 0x500
#define OFFSETB 0x506
int main(void)
{
uint8_t *ptr, index;
uint16_t test;
ptr = (uint8_t*)(BASE_ADDRESS + OFFSETA);
for (index = 0; index < (0x1 << 4); ++ index)
{
*ptr++ = index;
}
test = *(uint16_t*)(BASE_ADDRESS + OFFSETB);
return(0);
}
我想要理解的是指针和指针的地址。
我预计“test”变量等于 6。正确吗?
这是代码执行之前您的内存的样子。
????
代表未知值。
+------+
0x2000500 | ???? | (BASE_ADDRESS + OFFSETA)
+------+
0x2000501 | ???? |
+------+
0x2000502 | ???? |
+------+
0x2000503 | ???? |
+------+
0x2000504 | ???? |
+------+
0x2000505 | ???? |
+------+
0x2000506 | ???? | (BASE_ADDRESS + OFFSETB)
+------+
0x2000507 | ???? |
+------+
0x2000508 | ???? |
+------+
...
ptr
最初设置为指向 0x200500
: 处的字节
+------+
0x2000500 | ???? | (BASE_ADDRESS + OFFSETA) <-- ptr
+------+
然后我们将
index
从 0
循环到 15
(0x01 << 4 == 16
),将该值写入 *ptr
(IOW,ptr
当前指向的对象),然后递增 ptr
以指向到下一个字节:
Loop iteration index ptr
-------------- ----- ---
0 0 0x200500
1 1 0x200501
2 2 0x200502
...
循环执行完毕后,你会看到:
+------+
0x2000500 | 0x00 | (BASE_ADDRESS + OFFSETA)
+------+
0x2000501 | 0x01 |
+------+
0x2000502 | 0x02 |
+------+
0x2000503 | 0x03 |
+------+
0x2000504 | 0x04 |
+------+
0x2000505 | 0x05 |
+------+
0x2000506 | 0x06 | (BASE_ADDRESS + OFFSETB)
+------+
0x2000507 | 0x07 |
+------+
0x2000508 | 0x08 |
+------+
...
+------+
0x200050f | 0x0f |
+------+
0x2000510 | ???? | <-- ptr
+------+
所以是的,你的
test
变量将等于 6
。