C 指针算术-从给定地址获取所需的下一个地址
当我执行程序时,我希望地址是C 指针算术-从给定地址获取所需的下一个地址,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,当我执行程序时,我希望地址是0xffc10004: #include <stdio.h> #include <stdint.h> int main() { uint32_t *a = (uint32_t *)0xFFC10004; printf("%p\n",(a+ 0x40)); return 0; } #包括 #包括 int main() { uint32_t*a=(uint32_t*)0xFFC10004; print
0xffc10004
:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint32_t *a = (uint32_t *)0xFFC10004;
printf("%p\n",(a+ 0x40));
return 0;
}
#包括
#包括
int main()
{
uint32_t*a=(uint32_t*)0xFFC10004;
printf(“%p\n”,(a+0x40));
返回0;
}
但是我得到的结果是0xFFC10104
当我用
0x10
替换0x40
时,我得到了预期的地址0xffc10004
。有人能解释原因吗?因为a
是指向uint32\t
的指针,a+0x40
指向0x40
uint32\t
(0x100
字节)在a
之后的位置,而不是a
中存储的地址之后的0x40
字节
指针算法考虑了指针应该指向的元素的大小
设想a
实际指向数组中的uint32\t
;如果a+2
没有考虑整个元素,但字节,这将导致
指定上一个整数的一半和下一个整数的一半!幸好
事实并非如此,因为它实际上指定了另一个整数
位于更远处的两个元素(此处为八个字节)
如果您确实想要计算单个字节,那么应该使用
指向uint8\t
(或char
)的指针。在您的帖子中,您声明:当我执行程序时,我希望地址为0Xffc10004
但你首先要做的是:
uint32_t *a = (uint32_t *)0xFFC10004;
你是说uint32\u t*a=(uint32\u t*)0xFFC10000代码>
基于您的代码段中存在打字错误的假设,下面将使用(uint32\u t*)0xFFC10000
但首先要记住,值0x40
与0x4
0x40; == 64
0x4; == 4 (use this one if you want to see a 4 byte change)
递增指针类型时,从一个位置到下一个连续位置的距离始终为sizeof(type)
。例如:
a + 1 == a + sizeof(uint32_t)
a + 0x40 == a + 0x40*sizeof(uint32_t)
等等
这将说明:
uint32_t *p = (uint32_t *)0xFFC10000;//starting with value intended in post (not 0xFFC10000)
printf("base location: \t\t%p\n", p); // base location of p
printf("base location + 0x4:\t%p\t(%p + 0x4*sizeof(uint32_t))\n", p+0x4, p); // adds 4*sizeof(uint32_t) to base location of p
printf("base location + 0x40:\t%p\t(%p + 0x40*sizeof(uint32_t))\n", p+0x40, p); // adds 0x40*sizeof(uint32_t) to base location of p
printf("base location + 1:\t%p\t(%p + sizeof(uint32_t))\n", p+0x1, p); // adds 1*sizeof(uint32_t) to base location of p
输出如上所示的值:
Hi执行程序时,我希望地址为0Xffc10004。当我执行程序时,我希望您的意思是Hi,我希望地址是0Xffc10008?(即0Xffc10004+sizeof(uint32\u t)==0Xffc10008