聚集五湖四海程序员
这是cdeveloper的第48篇原创
这次与大家分享的是我对C语言中函数使用注意事项的小短文,希望能帮助有疑惑的同学更好的使用这个强大的语言特性。
大家在高中的时候都求过数学函数的表达式,其实编程语言的函数与数学表达式实际上是一样的。
我们都可以将其理解为一个有输入有输出的「功能黑箱」,看下图:
就类似给函数一个x值,可以求结果一样,给函数一些输入参数,也可以得到相同的输出结果。
1.模块化编程
为什么要使用函数呢?其实是为了更好的维护软件的功能以及实现模块化编程。
你可以想下如果把所有的功能都写在main函数中,那该多么可怕,估计没人会读你写的代码。
通过使用函数可以使我们的软件逻辑性更强,单独的功能写在单独的函数中,还可以方便后期复用等等,好处还有很多实在列举不完。
其中比较重要的作用要说:模块化编程和代码复用了,建议你去找实际的项目看看代码组成,自然就理解了。
2.函数的副本机制
很多初学者都搞不清楚函数的副本机制,例如下面的交换函数:
这个函数是错误的,因为函数在进行参数传递的时候,会将传入参数m,n的值拷贝给函数的形式参数a,b。
因此在函数内部交换的是形式参数a,b的值,而不是交换传递时m,n变量的值。
函数的副本机制从内存的角度来说就是:在函数进行参数传递的时候,实参和形参的内存地址是不同的。
这是这个例子的输出结果,每个人的机器可能都不同:
可以看到变量m和a,以及n和b的内存地址均不同,因此对值的交换也是不起作用的。
但是使用指针就完全不同了,看下面这个例子:
这个函数才是正确的交换函数,为什么呢?
因为我们这里传递的是m,n的内存地址,即传递的是指针,所以在函数内部对指针解除引用就可以直接访问这个地址的内容了,这是指针提供的特性。
那么是否就意为着传递指针就没有副本机制了呢?这也是错误的,指针也是变量,本质上与int没有区别,只是特性不同罢了。
上面例子在传递指针的时候,也是将m,n的地址拷贝给pa,和pb,也是存在副本机制的。
只不过这里拷贝的是地址而不是值,在内部通过指针的解引用操作可以直接访问m,n的内存地址,进而进行交换。
因为指针非常重要,所以建议你自己运行这个程序,可以看到输出结果中pa指向的是m的内存地址,而pa是指针变量pa的内存地址,这两个千万不要搞混了。
一定时时刻刻记住下面的结论:
1.一个int变量有自己的内存地址,也有自己存储的整数值
2.一个指针变量有自己的内存地址,也有自己存储的指向地址值
3.变量在内存中都有自己的地址和其存储的内容
3.函数的参数传递顺序
VC和gcc编译器计算函数参数的顺序都是从右向左,这个特点一点要记住,面试可能会问到。
你可以使用下面这个程序去验证,程序比较简单,留作给你的思考(不去思考就等于浪费时间看cd这篇文章了):
好了,cd今天就分享一点函数的注意事项,下次见了,Bye
推荐阅读:
要学好编程,请一定培养自己「主动思考」的能力
从0学习C语言系列:环境搭建,推荐书籍,自学经验分享
聚集五湖四海程序员
原创不易,点赞即赞赏
cdeveloper点赞就是赞赏了