繁体   English   中英

指针算术的指针?

[英]Pointer of pointer arithmetic?

我明白指针的算术是如何工作的,但我对指针的指针之一有疑问:如果我有这个代码:

    int x;
    int* ptr = &x;
    int** ptrptr = &ptr;

在标准的 Windows 系统上,如果我这样做:

printf("%d",ptr);
ptr++;
printf("%d",ptr);

ptr 将比以前有一个“+4”值,显然是因为整数需要 4 个字节。

现在,如果我这样做:

printf("%d",ptrptr);
ptrptr++;
printf("%d",ptrptr);

ptrptr 会比以前有一个“+16”的值,为什么?
如果这个问题已经发布,但我无法找到,我深表歉意,谢谢。

代码:

#include<stdio.h>
int main(void){
    int x;
    int* ptr = &x;
    int** ptrptr = &ptr;

    printf("Pointer: %p\nPointer of pointer: %p\n",(void*)ptr,(void*)ptrptr);
    ptr++;
    ptrptr++;
    printf("Pointer: %p\nPointer of pointer: %p\n",(void*)ptr,(void*)ptrptr);
    return 0;
}

输出:

Pointer: 000000000062FE44
Pointer of pointer: 000000000062FE38
Pointer: 000000000062FE48
Pointer of pointer: 000000000062FE40

0x...FE400x...FE38之间的区别是8而不是16 ,并且 8 是 64 位机器上地址的正确字节数。

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

要保存 pointer_to_int(这是 64 位系统上的地址),您需要一个 8 字节的盒子。

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

0x00.00.00.00.00.62.FE.40 - 0x00.00.00.00.00.62.FE.38 = 0x08 这些点只是一种视觉辅助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM