本章主要要掌握函数的基本使用和递归
目录:
- 函数是什么
- 库函数
- 自定义函数
- 函数参数
- 函数调用
- 函数的嵌套调用和链式访问
- 函数的声明和定义
- 函数递归
一、函数是什么
C语言中的函数的定义是:子程序
- 子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定的任务,而且相较于其他代码,具备相对独立性。
- 一般会有输入参数并有返回值,提供对过程的封装和细节的隐蔽,这些代码通常被集成为软件库
C语言中函数的分类:
- 库函数
- 自定义函数
二、库函数
为什么会有库函数?
基础功能,会被频繁使用,为了提高工作效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
1.怎么学习库函数
可以参考这些网站:
www.cplusplus.com
查询工具:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com
http://zh.cppreference.com(中文版)
使用文档来学习库函数步骤
举例1:学习函数strcpy
int main()
{
char arr1[20]={
0};//目标
char arr2[ ]="hello bit";//源码
strcpy(arr1,arr2);//将源码的字符串拷贝给目标
printf("%s",arr1);//打印arr1这个字符串 %s - 以字符串的格式来打印
return 0;
}
//输出结果:
举例2:学习函数memset
int main()
{
char arr[]="hello bit";
memset(arr, 'x', 5);//将arr数组中前五个字符填充成x
printf("%s\n",arr);
return 0;
//结果输出:xxxxx bit
}
2.C语言常用库函数
- IO函数(即输入/输出函数:printf、scanf、getchar、putchar)
- 字符串操作函数(strcmp、strlen)
- 字符操作函数(toupper)
- 内存操作函数(memcpy、memcmp、memset)
- 时间/日期函数(time)
- 数学函数(sqrt、pow)
- 其他库函数
三、自定义函数
自定义函数和库函数一样,有函数名,返回类型和函数参数。但不一样的是,这些要我们自己去设计。
注意:设计函数是一定要保证函数的功能足够单一,如果函数功能冗杂,会导致使用者应用方面变窄,不易于调用
1.函数的组成
ret_type fun_nume(para1, para2 , ...)
{
statement;//语句块
}
// ret_type 返回类型
// fun_name 函数名
// paral 函数参数
\ ******* 举例 ******* \
1.写出一个函数可以找出两个整数中的最大值
函数的return只能返回一个值
get_max(int x, int y)
{
int z = 0;
if (x > y)
z = x;
else
z = y;
return z;//返回z -返回较大值
}
int main()
{
int a = 10;
int b = 20;
//函数调用
int max = get_max(a, b);
printf("max=%d\n", max);
return 0;
}
- 写一个函数可以交换两个整形变量的内容
临时变量的作用:
/***************出问题的代码*******************/
//函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回值
void Swap(int x, int y)
{
int z = 0;//临时变量
z = x;
x = y;
y = z;
}
int main()
{
int a = 10, b = 20;
//写一个函数,交换2个整型变量的值
printf("交换前:a=%d b=%d\n", a, b);
Swap(a, b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
//输出结果:
//交换前:a=10 b=20
//交换后:a=10 b=20
上串代码并没有实现应有的功能
原因是:a、b变量各自有各自所占的内存(空间),将a、b的值传给Swap函数,并不会连同地址传过去,Swap函数中x、y接过值后进行计算,计算完后x、y的值发生变化,并将值传给了x、y各自所在的内存,并没有影响到a、b,所以a,b的值并没有变化,所以最终没有达到交换的效果
更通俗的解释:形参实例化之后其实相当于实参的一份临时拷贝
解决办法:用指针
先简单复习指针的概念:
int main()
{
int a=10;//a占8个字节的空间(64位系统)
int* pa = &a;//&是取地址符号,将a的地址赋给pa,
//pa就是一个指针变量,a是整型int,因此pa也是整型,为pa*
*pa=20;//对pa解引用,那么*pa就是a
printf("%d\n,a);
return 0;
}
//输出结果:20
正确代码如下:
//正确代码是指针将自建函数和主函数联系了起来
//函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回值
void Swap(int* pa, int* pb)//a、b将地址传给指针变量pa、pb
{
int z = 0;//临时变量
z =*pa;//*pa就是a
*pa= *pb;
*pb=z;
}
int main()
{
int a = 10, b =