指针算术指针?

时间:2019-01-20 21:17:44

标签: c pointers math

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

    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

1 个答案:

答案 0 :(得分:1)

[ { "businessEntityName":{ "businessEntityName":"abc1 ", "businessEntityDescription":"welcome to the abcd" }, "name":"Paul", "applicationName":{ "applicationRoleOrGroupName":"view", "applicationRoleOrGroupDescription":"Viewers on view" }, "status":{ "name":"Removed on: 27-Aug-2020", "style":"error" }, "type":"Manager" }, { "businessEntityName":{ "businessEntityName":"Internal", "businessEntityDescription":"Okay" }, "name":"John Smith", "applicationRoleOrGroupName":{ "applicationRoleOrGroupName":"Master", "applicationRoleOrGroupDescription":"Can access read only information of the non-sensitive pages" }, "status":{ "name":"Active from: 26-Aug-2020", "style":"success" }, "type":"admin" }, { "businessEntityName":{ "businessEntityName":"External", "businessEntityDescription":"All my Data" }, "name":"ramesh", "applicationRoleOrGroupName":{ "applicationRoleOrGroupName":"welcome", "applicationRoleOrGroupDescription":"User for My data" }, "status":{ "name":"Active from: 18-Aug-2020", "style":"success" }, "type":"HOD" } ] 0x...FE40之间的差是0x...FE38不是 8,并且8是地址上正确的字节数64位计算机。

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

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

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

16-0x00.00.00.00.00.62.FE.40 = 0x00.00.00.00.00.62.FE.38。点只是视觉辅助。