关于指针操作的问题

HelloCPPlus 2018-03-22 06:50:47

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

int main()
{

int a = 123456;
char* p = &a;

*p = 32;

printf("%d\n",*((int *)p));

system("pause");
return EXIT_SUCCESS;
}


首先声明一下,我知道操作指针的时候需要转成对应的类型才可以进行才做,我之所以写出上面的代码,就是想知道结果会怎么样。

首先定义了一个int a = 123456之后,我用一个char *类型的指针去接收a的地址,然后进行操作,如果我打印的时候直接 printf("%d\n",*p)的话,结果就是32,但是如果我转成了printf("%d\n",*((int *)p))进行打印的时候,为什么打印出来的不是123432,而是123424?这是为什么呢?
...全文
182 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 qq_36751214 的回复:
计算机存储数据时安装16进制,或者2进制不是10进制,所以应该是int a=0x123456; char *p=&a; *p=0x20; cout<<hex<<a<<endl; 仅供参考
明白啦,谢谢
HelloCPPlus 2018-03-22
  • 打赏
  • 举报
回复
引用 2 楼 yxwsbobo 的回复:
楼上的是对的,十进制的123456 中的56,并非是一个字节,你改变第一个字节是不会把56替换的 十进制 123456 的 十六进制是 0x1E240 第一个字节清零变成 0X1E200 也就是十进制的 123392 ,所以你给第一个字节赋值多少, 就相当于用10禁止的 123392加多少
明白啦明白啦,茅塞顿开呀...谢谢啦
yxwsbobo 2018-03-22
  • 打赏
  • 举报
回复
楼上的是对的,十进制的123456 中的56,并非是一个字节,你改变第一个字节是不会把56替换的 十进制 123456 的 十六进制是 0x1E240 第一个字节清零变成 0X1E200 也就是十进制的 123392 ,所以你给第一个字节赋值多少, 就相当于用10禁止的 123392加多少
宁南学者 2018-03-22
  • 打赏
  • 举报
回复
计算机存储数据时安装16进制,或者2进制不是10进制,所以应该是int a=0x123456; char *p=&a; *p=0x20; cout<<hex<<a<<endl; 仅供参考

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧