思考题
【题目】根据图片所示,请问_按钮1_被单击()被被点击后,a和b将返回什么值?
答案揭晓
解题分析
为什么会返回的都是“exiroom”?
那么你需要理解两个场景
Part1
其实还是要从数据类型来说,虽然易语言是有文本型的,但是这个文本型在数据传递的时候不是直接把文字放到碗里面,然后连着碗一起端走的。它的传递方式就像是寄存柜,文字内容是放在一个固定的地方如寄存柜的某个格子,系统分配给你一个某格子的凭证,上面可能写着“A101”标记文字内容所在的格子,如果你不小心把你的凭证弄丢了,而巧合的被另一个人捡了,请问,那个人能打开你的柜子取出你的东西吗?答案是可以的。
Part2
依旧是一个寄存柜,用户在某个柜子里面放进了一串文字,然后它拿着标记有“A101”的凭证走了。结果,管理员过来检查了寄存柜,他打开了A101”的那个柜子,他突然发现里面有很多好东西,然后动了念头,就自行把柜子里存放的东西给换成他的东西。然后抬头看看周围有没有摄像头,发现没有,然后开心地走开了。用户回到家想起来之前还在寄存柜放了东西,于是让自己的儿子去取,儿子取回来东西还是他原来存放的吗?
如果你看明白了,相信也就理解为啥结果是“exiroom”了。
用比较编程的语句来解释:
首先,类似a=“易语言自习室”这种定义方式,“易语言自习室”是存在于一个叫做常量区的地方。
Getstr1()的运作过程:
虽然a=“易语言自习室”,但实际上a存储的东西是一个指向放着“易语言自习室”的内存块地址(常量区的某处)
然后我修改了内存块地址上的内容(请注意,我没有改变内存的地址,我没有修改凭证编号)
最后子程序返回的是a,那么主程序接受到是a返回的一个地址,这个地址所代表的凭证编号没有变,系统就按照凭证编号去取了里面的值,而那个值被动了手脚,所以返回“exiroom”
Getstr2()的运作过程:
虽然b=“易语言自习室”,但实际上b得到的还是一个指向放着“易语言自习室”的内存块地址(这个地址与Getstr1中a所指的位置是同一个);
虽然内存块地址的地址还是那个地址,但是内存地址里面的值早就被Getstr1给动了手脚,里面早已没有了“易语言自习室”
最后子程序返回的是b,同理,程序接受到是a返回的一个地址,系统就按照凭证编号去取了里面的值,请问值是啥?——“exiroom”。
结语:
这个题目,如果你已经理解了指针和内存的四区也就自然而然理解了。
如果不理解,其实也不影响大局,让大家开开眼而已,因为易语言本身就弱化了指针概念。
如果你是易语言新手,请注意下面的文字:
这
题
超
纲
了
!!!!
(题目素材来源于乐易论坛)