2024-11-29 10:48:10
第一个程序运行结果如下图:
第二个程序运行结果如下图:
第一个程序的b.name和第二个程序的结构体t的数据全部改变的原因是,
他们传递的是指针(数据地址),子函数形参指向同一段内存,
故子函数对变量的操作反应在主函数中。
而第一个程序的b.gender和b.score是两个变量,只能通过压栈的方式传入,
此时子函数形参使用单独的一片内存,子函数结束后释放,
并不能映射回主函数,除非用renturn来返回结果。
可尝试把而第一个程序的b.gender和b.score用指针(地址)传递,
此时子函数对两个变量的操作会体现在主函数中。
第二个中调用了f(a),为何输出对输出结果没影响,就是输出1001,ZhangDa,1098.0,而且其中含有strcpy这个函数。而第一个也是调用了f函数,也含有strcpy这个函数,然后输出就只变了b.name。
这个问题就是参数用变量传递和用指针传递的区别的问题,
用变量传递,则处理的是一个映射值,
用指针传递,则处理的是传递的原值。
这个直接用内存监视工具,监视主函数的对应的struct的内存地址即可分辨清楚。
好的,谢谢。
不必客气。
2024-11-29 19:14:23
就是1中第二个输出是Sun,T,390,就是b,name变了,而其他两个没变。而在2中,三个都没变。