有人可以向我解释一下吗,我很困惑

问题描述 投票:0回答:1

这是代码:

#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。正确吗?

c pointers bit-shift stm32f4discovery
1个回答
0
投票

这是代码执行之前您的内存的样子。

????
代表未知值。

          +------+
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

© www.soinside.com 2019 - 2024. All rights reserved.