C如何按指定值递增指针

C如何按指定值递增指针,c,pointers,C,Pointers,我想用一个特定的数字递增指针:400h(十进制1024)。我希望它指向一个从基地址上方0x400开始的内存,并将0x003ffff写入该地址 指向的类型是uint32\u t,因此它占用4个字节。这是否意味着,要使指针指向高出0x400的内存,我需要将其增加1024/4=256倍 这将导致代码: #define BASE_PTR (0xFC014000u) uint32_t* register_ptr; register_ptr = BASE_PTR + 256; *re

我想用一个特定的数字递增指针:400h(十进制1024)。我希望它指向一个从基地址上方0x400开始的内存,并将0x003ffff写入该地址

指向的类型是
uint32\u t
,因此它占用4个字节。这是否意味着,要使指针指向高出0x400的内存,我需要将其增加1024/4=256倍

这将导致代码:

#define BASE_PTR             (0xFC014000u)
uint32_t* register_ptr;
register_ptr = BASE_PTR + 256;
*register_ptr = 0x003ffff;
这似乎是错误的,也不是很清楚。有没有其他方法可以达到同样的目标?我在想:

(*(uint32_t *)(BASE_PTR + 0x400)) = 0x003ffff;
但是,我不确定上面代码中的1024是否计算为1024或1024*4,因为
sizeof(uint32\u t)
是4


我将非常感谢任何提示或提示

在两个代码段中,
BASE_PTR
常量是一个
无符号int
;因此,表达式
BASE_PTR+256
BASE_PTR+0x400
是作为(无符号)整数算术(而不是指针算术)执行的,因此,对于随后分配结果的指针所引用的任何对象的大小,不应用“补偿”。但是,如果您首先将
BASE_PTR
值分配(或强制转换)到
uint32\u t*
指针,然后向该指针添加一些内容,则加数将(固有地)乘以指向对象的大小

因此,以下代码段中
main
函数内的前两行是等效的:

#包括
#包括
#定义基本PTR(0xFC014000u)
int main()
{
uint32_t*p1=(uint32_t*)(BASE_PTR+0x400);//简单无符号整数算术
uint32_t*p2=(uint32_t*)(BASE_PTR)+0x100;//指针算法:使用指针对象大小
printf(“%p%p\n”,(void*)p1,(void*)p2);
返回0;
}
但是,更改
BASE\u PTR
的定义以将其转换为
uint32\u t*
指针:

#定义基本PTR(uint32_t*)(0xFC014000u)

显著改变事物;然后,在此基础上的任何加法(无其他强制转换)都将作为指针算术执行,并应用指向对象的大小。

为什么不打印
寄存器ptr
的值并进行检查?
基ptr
只是代码中的一个数字,因此适用正常的算术规则。请注意,
(*(uint32_t*)(BASE_PTR+0x400))
(*((uint32_t*)BASE_PTR+0x100))位于同一位置。第一个函数将两个整数相加,并将结果转换为指针。第二种方法将一个整数转换为指针并向其添加一个整数(因此添加的量按指向的类型的大小放大)。如果要进行面向字节的指针添加,则必须将基_PTR强制转换或定义为(char*)(或uintptr!)。添加后,您可以将其强制转换为uint32*。注意:小心指针别名;不要同时使用字节指针和单词指针。注意,您的编辑更改了问题的含义。很抱歉进行编辑!我只是在我最初的帖子中忽略了这一点,更改了他们的代码片段(通过向#DEFINE添加强制转换),并使这个答案无效。而且这个答案是不正确的。您需要更改第一次添加以删除
uint32\u t*
cast@AdrianMole我的错。你的回答确实正确。我错过了括号。