当我运行此代码时:
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.第二个结果有点令人困惑.有人可以解释为什么会这样吗?
让我们打破这个:
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,因为p是char*.因此,当您添加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在内存中按字节移动.
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |