当我运行这段代码时:
int arr[3] = {2,3,4};
char *p;
p = (char*)arr;
printf("%d", *p);
p = p+1;
printf("%d", *p);
输出是 2 和 0。第二个结果有点困惑。有人可以解释为什么会这样吗?
最佳答案
让我们分解一下:
int arr[3] = {2,3,4};
创建一个包含 3 个整数的数组。假设您的系统是 32 位小端字节序,这就是它在内存中的样子:
02 00 00 00 03 00 00 00 04 00 00 00
char *p; p = (char*)arr;
p
现在指向 arr
但它是指向 char*
的指针。换句话说,p
指向 02
。
printf("%d", *p);
您正在将 p
引用的位置打印为 int
。因此,当您取消引用 p
(通过编写*p
)时,您正在访问char
(因为p
是 char*
) 类型,由 p
引用。这是 02
。
p = p+1;
p
现在指向 02
之后的 00
,因为 p
是 char*
。所以当你加 1 时,它将在内存中移动 1 * sizeof(char) = 1 * 1 = 1
字节。
printf("%d", *p);
您正在将 p
引用的位置打印为 int
。因此,当您取消引用 p
(通过编写*p
)时,您正在访问char
(因为p
是 char*
) 类型,由 p
引用。即 00
。
如果你想打印 3
而不是 0
你必须将指针类型更改为 int*
而不是 char*
,使指针在内存中移动 1 * sizeof(int) = 1 * 4 = 4
个字节。
关于c - C中的指针,指向字符指针的整数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687754/