使用指针

时间:2017-07-27 10:43:56

标签: c memory cortex-a8

我正在尝试使用指针写入内存,如下所示,但它正在写入意外的地址。

 uint32_t* pointer = (uint32_t) (__MEMORY_BASE)
 *(pointer+4)      = data;

使用下面的按预期工作时,

uint32_t* pointer = (uint32_t) (__MEMORY_BASE + 4)
*pointer      = data;

任何人都可以告诉我,为什么我无法使用第一种方法写入指针地址。

4 个答案:

答案 0 :(得分:4)

对于任何指针p和索引i,表达式*(p + i)等于p[i]

这意味着什么时候

*(pointer + 4) = data;

你实际上在做什么

pointer[4] = data;

这意味着您从4 * sizeof(*pointer)写入 字节 -offset pointer。即你在__MEMORY_BASE之外写了16个字节。

要正确使用第二个变体,或对第一个变体使用pointer[1](或*(pointer + 1))。

答案 1 :(得分:0)

uint32_t* pointer = (uint32_t) (__MEMORY_BASE);
 *(pointer+4)      = data;

因为pointer的类型为uint32_t *,这意味着 指针+ 1 = __MEMORY_BASE + 4,指针+ 4 = __MEMORY_BASE + 16, 这就是指针算法在C中的工作原理。

答案 2 :(得分:0)

uint32_t是4字节的整数类型。 C中的指针加法是指尖类型大小(以及它的倍数)。

所以pointer+4pointer添加16(4 * 4),但在第二种情况下,你有4个字节的偏移量。

答案 3 :(得分:0)

我认为你不理解指针算术

在第一个添加指向对象(uint32_t)的长度是4个字节,所以你要添加到指针4,实际地址将加上4 * 4个字节。

在第二个示例中,您将4添加到实际地址。