指针转换后指针算术如何工作?
How does Pointer Arithmetic work after Pointer Casting?
int main() {
short int a[4] = {1,1, [3] = 1};
int *p = (int*)a;
printf("p: %p %d \n ", p, *p);
printf("p+1: %p %d\n", (p +1), *(p+1));
}
为什么 *p = 65537 和 *(p+1) = 65536?
好吧,要理解为什么 *P
是 65537 而 *(p+1)
是 65536 让我们看一下内存:
00000001 00000000 | 00000001 00000000 | 00000000 00000000 | 00000001 00000000
我用 space 分割了一个字节,用 | 分割了一个 short int
。现在我们将 ptr 转换为 int*
,它现在需要四个字节而不是两个:
00000001 00000000 00000001 00000000 | 00000000 00000000 00000001 00000000
如果您将这些二进制文件输入计算器并让它显示十进制表示形式,您就会准确地得到这些数字。 (不过那是小端字节序,所以最右边的字节是 big
末尾,您首先要将其输入到计算器中)
int main() {
short int a[4] = {1,1, [3] = 1};
int *p = (int*)a;
printf("p: %p %d \n ", p, *p);
printf("p+1: %p %d\n", (p +1), *(p+1));
}
为什么 *p = 65537 和 *(p+1) = 65536?
好吧,要理解为什么 *P
是 65537 而 *(p+1)
是 65536 让我们看一下内存:
00000001 00000000 | 00000001 00000000 | 00000000 00000000 | 00000001 00000000
我用 space 分割了一个字节,用 | 分割了一个 short int
。现在我们将 ptr 转换为 int*
,它现在需要四个字节而不是两个:
00000001 00000000 00000001 00000000 | 00000000 00000000 00000001 00000000
如果您将这些二进制文件输入计算器并让它显示十进制表示形式,您就会准确地得到这些数字。 (不过那是小端字节序,所以最右边的字节是 big
末尾,您首先要将其输入到计算器中)