本章需要了解的重点主要包括以下几点:
1. 函数是什么
2. 库函数
3. 自定义函数
4. 函数参数
5. 函数调用
一:函数是什么?
用官方的话来解释就是:
在计算机科学中,子程序(英语: Subroutine, procedure, function, routine, method,
subprogram, callable unit ),是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软
件库。
其实就是一段独立于主程序的一个子程序,可以完成特定的任务。
二:函数的分类:
分为两种
1.由编译器提供的可以完成各种功能的叫做库函数。
2.由我们自己去写的函数,可以完成自己需要的功能叫做自定义函数。
库函数:
在我们编写代码的过程中频繁出现了我们所需要的某些功能,而不同的程序员写出了不同的代码,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了解决这种大量且重复的代码,开发者提供了库函数这一概念,方便程序员 进行软件开发为了支持可移植性和提高程序的效率。
最常见有printf用于输出,strcpy用于复制字符串,strlen用于计算数组大小,等等等等。 而对于这些我们是否都需要去记忆,答案是否定的。有一个专门的网站提供给我们去查找所有的库函数:www.cplusplus.com只能在这里看英文版的,想看中文版的是http://zh.cppreference.com这个网站。我们可以在里面查找到任意一个库函数,包括他们存在的头文件。
在使用某个库函数时,必须要加上#include<头文件名>,我们并不需要记住所有的库函数,只需要学会查询即可。
自定义函数:
对于库函数而言,它并不能解决所有问题,要是能的话,还需要程序员做什么呢?
所以我们学习的重点就在于自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
之前说过最简单的main函数,我们所有的自定义函数都和main函数一样,需要函数名、返回类型、参数列表,其余的则自己决定。
例如:设计一个函数,求两个数的最大值
#include <stdio.h> int max(int x, int y) { return (x>y)?(x):(y); } int main() { int num1 = 10; int num2 = 20; int max = max(num1, num2); printf("max = %d\n", max); return 0; }
在例如写一个函数,交换两个数的值,
#include <stdio.h> void swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } int main() { int num1 = 1; int num2 = 2; swap1(num1, num2); printf("swap1: num1 = %d num2 = %d\n", num1, num2); return 0; }
对于这个swap函数并不能得到我们想要的结果。
它似乎并没有交换num1和num2的值这是为什么呢?
三:函数的参数:
实际参数(实参):
真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有 效。
简单来说就是对实参的一个拷贝,本身并不影响实参。
上面的例题中num1和num2作为swap函数的实参,x、y则是函数的形参。 x、y本身是并不形象实参,形参的本质是在被调用是开辟了一块空间,拷贝了一份实参的数据被保存在了该地址中,而实参则是另一块空间上开辟了空间,所以在形参空间上做出改变,并不影响实参的空间
那么要解决上面那道例题该如何呢?
我们这里需要用到函数的调用。
四:函数的调用
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。
这里需要用到取地址操作符 ' & '。代码如下
#include <stdio.h> void swap2(int *px, int *py) { int tmp = 0; tmp = *px; *px = *py; *py = tmp; } int main() { int num1 = 1; int num2 = 2; swap2(&num1, &num2); printf("swap2: num1 = %d num2 = %d\n", num1, num2); return 0; }
结果如下
这才正真的将值调换
我们这里&num1和&num2所传进去的都是地址,所以x、y对应的也都是地址,那么我们要得到地址中存放的数据,就用到了解引用操作符 ' * ' 。在swap2中改变x和y就是改变main中的num1和num2。
五:结束语:
本章先简单的介绍部分函数基础,下一章将介绍函数更多重点。当然想要更好的的掌握函数还是需要多写代码,多做练习。