主要内容:
1. 函数是什么 (数学函数定义)/(计算机函数定义)
2. 库函数
3. 自定义函数
4. 函数参数
5. 函数调用
6. 函数的嵌套调用和链式访问
7. 函数的声明和定义
8. 函数递归
库函数C语言中函数的分类:
1.库函数
2.自定义函数
C语言常用的库函数都有:
IO函数(输入输出函数):printf scanf getchar putchar
字符串操作函数:strcmp strlen
字符操作函数:toupper(小写转大写函数)
内存操作函数:memcpy memcmp memset(内存设置)
时间/日期函数:time
数学函数:sqrt(开平方) pow
其他库函数:
为什么会有库函数呢?
为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数(比如“printf函数”,经常使用,不可能说每次用的时候都定义一下,故随着编译器库中携带的函数),方便程序员进行软件开发。注意:使用库函数需要引用相应的头文件
库函数 学习方式
1.MSDN
2.www.cplusplus.com 既可以查询C也可以查C++ 英文版本
3.zh.cppreference.com 中文版本
4.哪里不会点那里!!!注意看给的例子!!!照着例子学
自定义函数Example 1
memset函数
#include#include void main( void ) { char buffer[] = "This is a test of the memset function"; printf( "Before: %sn", buffer ); memset( buffer, '*', 4 ); printf( "After: %sn", buffer ); } Output
Before: This is a test of the memset function After: **** is a test of the memset function
存在意义
若库函数能实现所有命令,那么就不需要程序员再去写出有自己想法的代码
自定义函数简单解释
自定义函数同库函数一致,有函数名,有返回值类型,有函数参数,但是不一样的是,这些都是由我们自己设计,给了我们很大的发挥空间
函数的组成
ret_type fun_name (para 1,*)
{
statement;//语句项 花括号引起来的称作函数体
}
ret_type:函数的返回类型
fun_name:函数名称
para1:函数参数
函数的参数Example 1
输出两个整型中的较大值 get_max函数
【02】写出一个函数,能找出两个整数中的较大值 int get_max(int x, int y) { int z = 0; if (x > y) z = x; else z = y; return z; } int main() { int a = 10; int b = 20; //这里涉及函数的调用 int max = get_max(a, b); printf("较大值是%dn", max); return 0; }Example 2
交换两个整型变量的内容 Swap函数
方案一 void Swap(int x, int y);//在函数返回类型处写void,表示这个函数不返回任何值,也不需要返回任何值 运行结果并未达到预想,a和b的值并未发生变化 这段代码书写的就大大的有问题了 失败的原因:在下面的main函数中a的地址与自定义函数Swap中的x不一致,无法有效传递参数(可通过f10,f11来调试) { int z; z = x; x = y; y = z; } int main() { int a = 10; int b = 20; printf("交换前 %d %dn", a, b); Swap(a, b); printf("交换后 %d %dn", a, b); return 0; } 方案二 代码正确,可实现两个整型变量之间的交换 void Swap(int* pa, int* pb)//这里的*pa相当于下面main函数中的a, { int z = 0; z = *pa;//通过*pa将a的地址与a直接关联 *pa = *pb; *pb = z; } int main() { int a = 10; int b = 20; printf("交换前%d %dn",a,b); Swap(&a, &b); printf("交换后%d %dn", a, b); return 0; }
实际参数(实参)
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。
形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数。
在main函数中传给 Swap1 的 num1 , num2 和传 给 Swap2 函数的 &num1 , &num2 是实际参数。
函数的调用Example 1
自定义函数输出100到200之间的素数
//【04】书写一个函数来判断一个数是不是素数 int is_prime(int n)//自定义函数功能单一,越简洁越好 { int j = 0; for (j = 2; j < n; j++) { if (n % j == 0) return 0; } return 1; } int main() { int i = 100; int count = 0; for (i = 100; i <= 200; i++) { //这里利用函数来判断输入的数是不是素数 if (is_prime(i) == 1)//is_prime()是需要自己创建来判断是不是素数的函数 { count++; printf("%dn", i); } } printf("素数个数为%dn", count); return 0; }Example 2
自定义函数输出1000到2000年之间的闰年
//【05】使用自定义函数来判断一个年份是不是闰年 //闰年定义:1.非整百年,能被4整除 //2.整百年,能被400整除 int is_leap_year(int y)//这里只涉及传递数值,而不改变数值,返回值类型不需要void { if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0))//不是整百年情况下能被4整除 或能被400整除 // 这里省略了y%100==0 是因为能被400整除一定能被100整除 return 1; else//两种情况之外的非闰年//妙啊! return 0; //这里返回1和0可以看作返回值的真值 //则可以再次优化 //return ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0)); //对应上面的if语句中的1或0; //为真返回1,为假返回0;效果一致,但更加简洁 } int main() { int year = 1000; for (year = 1000; year <= 2000; year++) { if (is_leap_year(year) == 1) printf("%d ", year); } return 0; }
函数的嵌套调用和链式访问传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
参数值不改变
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量
参数值发生变化
函数的声明和定义函数的嵌套调用
举例,在for循环中可以嵌套调用一个自定义函数
注意,自定义函数不能嵌套定义,举例:在定义test1函数中再嵌套定义一个test2函数
链式访问
把一个函数的返回值作为另外一个函数的参数
链式访问 Example 1
#include#include int main() { int len = strlen("2333");//strlen用于求字符串的长度 printf("%d",len) printf("%d",strlen("2333")); //链式访问 //将一个函数的返回值直接传递给另一个函数作参数 return 0; }
函数声明:
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的
函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
Example 1
函数声明不同位置的影响
//报错情况 int main() { int a = 10; int b = 20; int c = Add(a, b); //代码的执行原则上从上到下扫描顺序执行 //当在main函数后面再定义定义函数依然会报错 “未定义标识符Add”或“Add:找不到标识符” printf("%d", c); return 0; } int Add(int x, int y) { return x + y; } //解决方式 int main() { int a = 10; int b = 20; int Add(int, int);//以这种方式将函数声明--告知一下即可使用在主函数下面声明的函数 int c = Add(a, b); //代码的执行原则上从上到下扫描顺序执行 printf("%d", c); return 0; } int Add(int x, int y)//函数的定义 { return x + y; }p 47 31 :16



