本节主要包括以下内容:
一、函数
二、库函数
三、自定义函数
四、函数调用
五、函数的声明和定义
六、函数递归
一、函数
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
二、库函数
C 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。诸如此类函数称为库函数。
库函数主要有以下几类:
【1】IO函数
【2】字符串操作函数
【3】字符操作函数
【4】内存操作函数
【5】时间/日期函数
【6】数组函数
【7】其他函数
这些库函数不需要全部记住,只要会查文档即可(http://www.cplusplus.com/)
三、自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程
序员一个很大的发挥空间。其书写格式如下:
ret_type fun_name(para1, * )
{
statement;//语句项
}
//ret_type 返回类型
//fun_name 函数名
//para1 函数参数
举例:写一个函数找出2个数中的最大值(2个数不相等)。
#include <stdio.h>
int get_max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int a=10;
int b=20;
int ret=get_max(a,b);
printf("%d\n",ret);
return 0;
}
四、函数的参数与调用
1.参数
函数的参数有2种,一种是实参,一种是形参。
【1】实参:真实传给函数的参数.可以是常量、变量、表达式、函数,无论是何种类型,在传递时必须有确定的值。
【2】形参:指函数名后括号中的变量,形参只有在函数被调用的过程中才会实例化,当函数调用完成后自动销毁,所以形参只在函数中有效。
注意:形参与实参占据不同的内存块,形参相当于实参的一份拷贝,改变形参的值并不会对实参有任何影响。
2.调用
函数的调用有2种方式:传值调用、传址调用。
【1】传值调用:将变量的值传递给函数,由于形参与实参占据不同内存块,对形参的修改并不会影响实参。
【2】传址调用:将变量的地址传递给函数,这种方式可以让函数内部与函数外部的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量。
补充:函数可嵌套调用和链式访问(将一个函数的返回值作为另一个函数的参数)
举例:分别用传值调用和传值调用写两个交换2个整数的函数。
#include <stdio.h>
void Swap1(int a,int b)
{
int temp=0;
temp=a;
a=b;
b=temp;
}
void Swap2(int* a,int* b)
{
int temp=0;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a=10;
int b=20;
//传值调用
Swap1(a,b);
printf("Swap1:a=%d b=%d\n",a,b);
//传址调用
Swap2(&a,&b);
printf("Swap2:a=%d b=%d\n",a,b);
return 0;
}
五、函数的声明和定义
1.函数声明
【1】告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。
【2】函数的声明一般出现在函数的使用之前。要满足先声明后使用。
【3】函数的声明一般要放在头文件中的。2.函数定义
函数的定义是指函数的具体实现,交待函数的功能实现。
举例:求2个数的和
#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);
#endif //__TEST_H__
#include "test.h"
//函数Add的定义
int Add(int x, int y)
{
return x+y;
}
六、函数递归
1.定义
函数调用自身的方法称为递归(recursion)。它通常将一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程中所需要的多次计算,大大的减少了程序的代码量,其主要思想是:大事化小。
2.必要条件
【1】存在限制条件,当满足这个限制条件的时候,递归便不再继续。
【2】每次递归调用之后越来越接近这个限制条件。
举例:求n的阶乘。
#include <stdio.h>
int fac(int n)
{
if(n<=1)
{
return 1;
}
else
{
return n*fac(n-1);
}
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",fac(n));
return 0;
}