关于函数调用其实是函数指针+传参+解引用的一些思考
直接访问和间接访问的理解。
直接访问:既然函数是数据处理器,也就是对全局变量进行读写操作,这种读写操作是直接的,所以我叫做直接访问。
间接访问:函数要想有意义就要有三要素:函数声明、函数调用、函数定义。其中最重要的就是函数调用和函数定义。函数调用也就是给函数指针传参后解引用的过程。这里充分理解函数名、函数指针、函数地址的深层含义。要么说指针才是C语言的灵魂。函数调用的过程其实是一个“跳转”的过程。函数名就是要跳转的代码段地址。传参的其实就对应变量中的值,也就是数据。这些数据会被复制copy到函数的形参中去存储,函数内部其实就是根据参数中的值进行判断、加工的过程。
如何理解函数返回值?
首先返回值是一个数据,这数据要么存储在函数内部某个栈变量上,没有作为常数直接返回,关于返回其实也是一个往回“跳转”的过程,与函数调用的跳转组成了一个循环。这个数据可以作为函数内部代码运行过程记录,也可以作为对参数进行加工后的结果,总之是一个确定的值。这个值被跳转返回给函数调用的发起者也就是上一层函数。有时候根据这个值进行逻辑判断,有时候传递给上一层函数的某个栈变量。
如何理解没有参数的函数调用和函数定义?
从指针角度出发,这种函数调用的过程是:函数指针+解引用。也就是没有经过参数传参。这种函数在单片机编程中经常用作跳转直接访问全局变量,也有些无参函数主要完成某些动作,但是从宏观上看也是对全局变量进行直接访问(包含寄存器)。
总之,对全局变量的读写操作可以看做是直接访问。对函数调用+传参+函数定义的过程可以看做是间接访问。因为函数如果只去看函数定义而忽略函数调用(包含传参)只是看到事物的某一方面,是不全的。
最后,再说一遍:指针才是C语言的灵魂,这句至理名言。
额外延伸:
思考一个问题,用c语言写的函数(这里指的是函数定义)和数学的函数之间有哪些共性?
我的答案是2种函数在宏观上看来都是抽象的、概括的、包含所有情况而非特定情况的。
有了C语言写的函数,通过函数调用传参,这样非特定情况就确定下来了。相对的数学的函数如果给了x特定的值,那么y值的结果也是特定的。这也是两者都称之为“函数”的原因。
