C中的指针,指向字符指针的整数指针

use*_*236 2 c pointers

当我运行此代码时:

int arr[3] = {2,3,4};
char *p;
p = (char*)arr;
printf("%d", *p);
p = p+1;
printf("%d", *p);
Run Code Online (Sandbox Code Playgroud)

输出为2和0.第二个结果有点令人困惑.有人可以解释为什么会这样吗?

use*_*016 9

让我们打破这个:

int arr[3] = {2,3,4};
Run Code Online (Sandbox Code Playgroud)

创建一个包含3个整数的数组.假设您的系统是32位小端,这就是它在内存中的外观:

02 00 00 00 03 00 00 00 04 00 00 00

char *p; p = (char*)arr;
Run Code Online (Sandbox Code Playgroud)

p现在指向arr但是指向char*.换句话说,p指向02.

printf("%d", *p);
Run Code Online (Sandbox Code Playgroud)

您正在打印作为int引用的位置p.因此,当您取消引用 p(通过写入*p)时,您正在访问引用char(因为p是类型char*)p.这是02.

p = p+1;
Run Code Online (Sandbox Code Playgroud)

p现在指向00刚刚之后02,因为pchar*.因此,当您添加1时,它将1 * sizeof(char) = 1 * 1 = 1在内存中逐字节移动.

printf("%d", *p);
Run Code Online (Sandbox Code Playgroud)

您正在打印作为int引用的位置p.因此,当您取消引用 p(通过写入*p)时,您正在访问引用char(因为p是类型char*)p.这是00.

如果你想打印3而不是0你必须改变你的指针类型int*而不是char*,使指针1 * sizeof(int) = 1 * 4 = 4在内存中按字节移动.

  • 我还要强调的是,读取类型为"int"的值就好像它们是`char`s是合法的一样,确切的结果取决于实现.在别处编译时,您可以获得另一个结果.@Cicada必须对平台做出假设才能提供答案. (3认同)