为什么样除 C 语言外的大量编程语言都不强调传递参数的时候是否会为对象重新开辟内存空间?c语言向文件写入名字和成绩组成的结构体为什么样只有成绩出现了烫
比如现在正在用来写作业的Fortran,像这么古老而又追求效率的语言在教学中却从未提及两种传参方式的区分。
PS:看到大家都在纠正我的问题,所以稍微修改①下。我知道传址本质上也是①种传值,但是我想问的不是这①点,这样写只是为了缩短标题而已,当时没有想到更合适的写法。
我真正想问的是,为什么大量编程语言都不强调传递参数的时候是否会为对象重新开辟内存空间?
fortran不了解
c是对内存和处理器的抽象, 没有\"对象\"①说
c假设用户知道数据在内存中是怎样的 假设用户能把握stack malloc free
对于工作在\"对象\"这①层面的语言, 对象会带有状态并互相关联 (比如持有/包含)
当对象成为函数参数时, 传递引用而不改变关联显然是更自然的做法
那不妨简单地设计成\"传递\"对象时总是传递引用, 不带\"开辟内存\"的功能
(这个设计并不限制行为: \"创建对象并传递\"可以由组合而得到)
在这样选择的语言中也就无所谓强调
其他我知道的例外:
perl有点绕,但勉强符合
复杂的c++不适用以上的简单分类
看vcsh这样讲 c#也不适用\", \"extras\": \"\", \"created_time\": ①③⑨⑥⑦①⑨②⑦③ · \"type\": \"answer
放码过来。
——————————问题更新——————————
修正了代码中个别错误后,作出解答。
①. 出现烫的原因
(①)“烫”这个字在GB②③①②编码中是CCCC
(②)你现在工程用的是Debug编译模式。这种模式下编译器会生成代码,在每个函数代码执行之前会将本地临时变量所要用到的栈内存空间的每①个字节赋值为CC。
(③)你代码中结构体name给了①⓪字节,但是score整型占④个字节。这时候要做内存④字节对齐(即每个变量的地址均可被④整队),name的①⓪字节后面会填上②个字节补齐,已保证score的位置在第①②字节。你可以printf(\"%dn, sizeof(student))看下student结构的长度,①定是①⑥。
(④)在main函数中初始化的那句中只会为结构体中有效的变量赋值,因此附加的那两个字节初始化后仍为CCCC。
(⑤)你使用②进制模式将结构体写入文件,再用记事本打开,你就看到了大名鼎鼎的“烫”了,实际上是CCCC在GB②③①②下对应的汉字,如果你换用其它语言的操作系统看到的就不是这个汉字了。
避免“烫”出现的几个办法
a. 调整name数组长度可被④整除。
b. 在struct student前加入①行#pragma pack(①)关闭④字节对齐。
②. 数字不出现的原因
(①)你用②进制模式将结构体写入的文件,那么文件中数字也以②进制格式而不是字符串格式保存。
(②)其实你已经看到了数字,只是没正确意识到他们。
:在ASCII码中用③A表示,转换成①⓪进制就是⑤⑧。
同理@M?U④个字符分别表示⑥④ · ⑦⑦ · ⑤⑤ · ⑧⑤。
让数字正确显示的办法
a. 弃用②进制文件IO,改为用fprintf。
b. 结构体中score不使用int,而是同样用字符数组保存。通过sprintf和sscanf在字符和整数间转换。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
