C 指针算法的指针?

C 指针算法的指针?,c,pointers,math,C,Pointers,Math,我理解指针的算法是如何工作的,但我对指针的指针之一有疑问: 如果我有此代码: int x; int* ptr = &x; int** ptrptr = &ptr; 在标准Windows系统上,如果我这样做: printf("%d",ptr); ptr++; printf("%d",ptr); printf("%d",ptrptr); ptrptr++; printf("%d",ptrptr); ptr将比以前有一个“+4”值,这显然是因为整数需要4个

我理解指针的算法是如何工作的,但我对指针的指针之一有疑问: 如果我有此代码:

    int x;
    int* ptr = &x;
    int** ptrptr = &ptr;
在标准Windows系统上,如果我这样做:

printf("%d",ptr);
ptr++;
printf("%d",ptr);
printf("%d",ptrptr);
ptrptr++;
printf("%d",ptrptr);
ptr将比以前有一个“+4”值,这显然是因为整数需要4个字节

现在,如果我这样做:

printf("%d",ptr);
ptr++;
printf("%d",ptr);
printf("%d",ptrptr);
ptrptr++;
printf("%d",ptrptr);
ptrptr将比以前有一个“+16”值,为什么
如果这个问题已经发布了,我很抱歉,但是我找不到,谢谢

代码:


0x…FE40
0x…FE38
之间的区别是
8
不是
16
,8是64位机器上地址的正确字节数

要保存int(在系统上),需要一个4字节的框。因此,要跳到内存中的下一项,您需要在初始int的地址中添加4

要保存指向int的指针(64位系统上的地址),需要一个8字节的框

提示:您要减去的数字是8字节长的地址:


0x00.00.00.00.62.FE.40
-
0x00.00.00.62.FE.38
=
0x08
。点只是一种视觉辅助。

不要使用
%d
打印指针,使用
%p
并将它们强制转换为
void*
。您的系统上的
sizeof(int*)
是什么?@AlessandroF您可以将说明符更改为
%p
,将参数强制转换为
void*
,并更新结果吗?如下所示:
printf(“指针:%p\n指针的指针:%p\n”,(void*)ptr,(void*)ptrpr)
在我看来,
62FE40
-
62FE38
的差异现在是
8
,这是64位平台的理想结果。使用错误的说明符会调用未定义的行为,因此任何事情都可能发生。正如您正确地说的,
ptr
ptr+1
的区别是因为在您的系统上,
int
有4个字节。这同样适用于
ptrptr
,但区别在于
8
,因为指针在系统上有8个字节。