为什么C语言的子函数不直接用型参参与运算,而是另外声明个局部变量,形参再赋值给这个局部变量?

比如下面的结构体使用方法???不直接使用dev_id,而是先赋给cur_pin,后面操作的是cur_pin.. 我意识到很多子函数都类似这样的写法,但是不明白什么原因,是跟编译有关就像为什么用volatile一样的道理??

函数的副作用是最令人头疼的问题
我们都知道形参使得函数可以改变调用者的变量值
所以很容易产生副作用
所以函数设计时应当避免频繁改变形参的值
这就是你所看到的现象:“不直接用型参参与运算”
这样就不会改变调用者的变量值
当然最后还是要改变形参的值,否则形参就没有意义了
还有另一个原因是编译有关的
局部变量是在栈分配空间的
生成的机器代码是近调用的短地址
而形参就很难说了
可能有的编译器,先按值参处理,最后再用结果修改形参
这样做就不用担心“直接用型参参与运算”的会频繁修改形参了
但是却不符合形参的本义
因此编译器会直接引用形参的地址,就会生成远调用的长地址了
把形参编译成长短不同的地址,这在调用系统功能时就有讲究了
你的代码里有“interrupt”字样,我没猜错的话就是中断调用
这时需要长地址还是短地址,那可是一点也不可弄错了
用局部变量就会得到短地址
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-28
你注意到cur_pin是不同的类型了吗?正是因为需要转换类型所以才引入它 形参可以参与运算,都居于栈空间追答

楼上的搬砖说形参能得到长地址,居然看不出

之所以采纳是因为粘贴迎合了你主观的猜想,至于是不是C语言,倒在其次

追问

但问题是,这里的例子只是碰巧转了类型, 而且是相同的结构体才能这样赋值 ,大部分例子不需要这样转类型呀,但也这样子开头直接就赋给一个中间变量了

追答

你的提问描述、追问显示,你不熟悉c语言,不懂得程序的编程思想,这样的情况直接去看源代码为时过早

简单地说,void *,一是用于实现程序的通用性,在内部进行转换或间接使用是程序规范

是这个程序的程序规范,不意味着,就是所有程序的程序规范

能不能看懂?

相似回答