Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针算术-从给定地址获取所需的下一个地址_C_Pointers_Pointer Arithmetic - Fatal编程技术网

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