[英]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...FE40
和0x...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.