中易网

请真正了解c语言的人解释赋值的原理

答案:3  悬赏:50  
解决时间 2021-03-26 13:40
请真正了解c语言的人解释赋值的原理
最佳答案
对于int a=5;编译程序会将这个5当作整形常量保存下来,在程序运行时供你使用,举例来说,假设程序运行时常量区在80000000H处,变量区在80001000处,整形占用4个字节:
地址数据 说明
80000000H 05 00 00 00 常量5
80001000H xxxxxxxx变量a
80001004H xxxxxxxx变量num
80001008H xxxxxxxx变量ptr
a=5;语句相当于令CPU将存放常量5的地址(80000000H)处的数据4个字节复制到变量a的地址指向存储区赋值后80001000H处4个字节就变成了05H 00H 00H 00H
而ptr的定义是说ptr将存放一个地址,这个地址对应数据占用一个整形长度即4个字节;ptr=#的语句相当于两步,先求变量num的地址=8001004H,然后将这个地址放入ptr对应的存储区,执行后80001008H处4个字节变成了04H 10H 00H 08H
以上赋值语句类型分别是对应一致的。追答
追问:unsigned int a=5,b;

printf("&a=%x\n%&b=%x\n",&a,&b);
b=(unsigned int)&a; //书上说 & a 是指针 要强制转化 为何(但其实不强制转也可通过)
printf("(unsigned int )&b=%x\n",(unsigned int )&b);
追答:你要将a的地址数据赋值给unsigned int型的变量b,这两个类型不同当然要做转换,你如果不写,编译程序也要做的。
严格的书写是要强制转化的,否则编译会出警告甚至错误,这个书写习惯也在提醒你不会犯一些隐含的错误。
追问:a的地址难道不是unsigned int 吗?地址也是4个字节啊
追答:不一定,如果你在32位的操作系统中运行,这个地址确实是32位无符号整数,但你换用64位操作系统时,这个地址就是相当于unsigned long int型的了,另外即使是32位计算机、32位操作系统下,如果你的编译选项是小模式,这个地址有可能就是near型,是16位偏移量了。
具体地址的类型要由编译器在编译程序时取得当前操作系统地址位宽、当前程序编译内存模式等参数决定,你的程序不应当假设地址是某个固定的数据类型。
全部回答
int * 是一个指针类型变量,它占用四个字节空间,存储的是一个地址,任何一个空间地址,都是由8位16进制数表示,&num表示的是地址,所以可以int* ptr = &num:
a是一个整形变量,是一个标示符,表示一个四字节空间,因为整形占用四个字节,而将5赋给a,只是将5存储在这个空间内,a是这个空间的名字,空间中存的值是5
&叫做取地址, 那么&num肯定就是内存地址了,内存地址肯定是个整数啊
int *ptr = # 其中int*指针类型肯定也是地址啊,说白了也是整型,二者数据类型一致,可以赋值。

你上面int a = 5; 这句提到了5和a的类型不一致,这句话说错了,这类型是一致的。你的错误在于:你认为5是整型,a是字符型。 其实不是这样子的。
int a;表示定义一个变量,而这个变量是int类型的,就是说我现在在内存中开辟了一个4个字节的空间,用a来表示,这四个字节存储的内容为0101,就是5的二进制代码的补码,后面所有地方用a就可以表示5了。

这个a其实存储在内存中,内存也是分堆、栈等等,那么a会放在栈中,5会放在堆中,而栈中的a有一个链接,是直接链接到堆中的5的这块空间上的。链接的本质就是说,栈中的a存放了堆中的0101的首地址,读取的时候,会从首地址开始,依次读取4个字节即可。

明白了吗? a的类型是int型,a仅仅是个标识符,不是个对象,对象才是有类型的。(你可以这么理解,C语言中是没有对象的,但是可以理解为堆中的东西都是对象,栈中的都是标识符)。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
鱼油能跟钙铁锌硒咀嚼片同时服用吗
被蚊子叮了皮肤变黑了怎么办?
蕲春那里有好玩的地方
求南瓜糕点的做法
天津的山木日语培训水平如何
去年跟前男友分手,现在想起他来还是想哭,我
现在想加盟一个鲜奶吧、哪个品牌好、全下来加
孩子吃什么能长个子?
坐几路车到黄金海岸?
明星减肥怎么可以一个月瘦一二十斤
宝宝晚上突然哭闹不止的这个应该要怎么办才好
浙江省宁波市鄞州区五乡镇龙兴村健乐东城木业
xboXone 和ps4各自都有什么独占游戏啊
河南讯达电缆有限公司(宝丰总经销)地址在什么
2015年01月25日16点55分出生的男孩
推荐资讯
广晟期货为何改名
求公司年会诗歌朗诵~~~~~~~~~~~~~~~
艾斐堡这个保险箱品牌怎么样?
大众浴池的水怎么搞清澈的
回旋镖怎么折法
请问汕头市有什么羽毛球管吗?
大宝水泥厂2008年第一季度收入36086000元.改
我很胆小,请问怎么样在教室讲台上不怕不紧张
山东省烟台莱州市虎头崖镇神堂镇附近有申通快
收银台少了钱,监控查不到,为什么
钢琴曲梦中的婚礼填词
有一句名言,大概意思是说爱自己孩子是生物的
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?