1.什么是函数
数学中的函数:数字之间的相互的映射关系。
C语言的函数:子程序。
子程序:一个或多个可以重复执行的代码块,他可以负责完成一类特定的任务,具有相较于其他代码,具备相对独立性。
子程序通常情况下会有参数和返回值,如果对其进行封装成指定文件,这就是我们说的模块。
2.库函数
- IO函数
- 字符串操作函数
- 字符操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
- 其他库函数
2.1 引用库函数
#include <stdio.h>
//库函数 最好用<>加以区分
2.2C语言函数库的头文件
3.自定义函数
自定义函数:可以通过程序自身的创造能力,为函数进行设计,如果未来学的很好可以为C语言设计模块。
函数返回值类型 函数名称(){
语句1;
...
语句N;
return 返回值;
}
函数无返回值类型(void) 函数名称(){
语句1;
...
语句N;
}
3.1变量交换函数
#include <stdio.h>
void Swap(int *p, int *p1){
int temp = 0;
temp = *p;
*p = *p1;
*p1 = temp;
}
int main(){
int num1 = 1;
int num2 = 2;
Swap(&num1,&num2);
printf("%d %d", num1, num2);
return 5201314;
}
4.函数的参数
4.1实际参数(实参)
真正传给函数的参数,叫实参。
实参:常量、变量、表达式、函数。
4.2形式参数(形参)
形式参数是指函数名后括号中的变量,形式参数只有函数被调用过程中才实例化,当函数运行完毕后其内存空间会被自动销毁,所以说形式参数只有在函数中有效。
形参实例化之后其实相当于实参的一份临时性拷贝。
5.函数的调用
5.1传值调用
函数的形参和实参分别占有不同的内存块,对形参修改不会影响实参。
#include <stdio.h>
void Swap(int p, int p1){
int temp = 0;
temp = p;
p = p1;
p1 = temp;
}
int main(){
int num1 = 1;
int num2 = 2;
Swap(num1,num2);
printf("%d %d", num1, num2);
return 5201314;
}
5.2传址调用
传址调用是函数外部创建变量的内存地址传递给函数参数的一种调用函数方式。
形参之间的相互改变会影响实参。
#include <stdio.h>
void Swap(int *p, int *p1){
int temp = 0;
temp = *p;
*p = *p1;
*p1 = temp;
}
int main(){
int num1 = 1;
int num2 = 2;
Swap(&num1,&num2);
printf("%d %d", num1, num2);
return 5201314;
}
6.函数嵌套
函数和函数之间的相互组合,相互调用。
#include <stdio.h>
void hello(){
printf("hello, world\n");
}
void input(){
for(int i =0; i < 3; i++){
//hello函数执行三次
hello();
}
}
int main(){
input();
return 5201314;
}
7.链式访问
#include <stdio.h>
int main(){
//printf函数返回值是输出字符串的长度
printf("%d", printf("%d", printf("%d", 43)));
return 5201314;
}
8.函数的声明
函数要满足先声明后使用。
函数声明一般要放在头文件中。
*.h为后缀的头文件
#ifndef __ADD_H__
#define __ADD_H__
int Add(int x, int y);
#endif
*.c为后缀的c文件
int Add(int x, int y){
return x + y;
}
9.函数递归
递归:函数调用自己函数的编程技巧
1.存在限定条件,执行中遇见了限定条件就是相当于执行递归函数的最后一步。
2.每次递归越来接近限定条件。
#include <stdio.h>
int sum1 = 1;
int jiecheng(int n){
if(n == 1){
return sum1;
}else{
sum1 *= n;
return jiecheng(--n);
}
}
int main(){
printf("%d", jiecheng(10));
return 5201314;
}
10.递归栈溢出
1.栈溢出:stack overflow
如果参数较大的话,系统会直接报错栈溢出。
系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者是无条件限制递归(死递归),导致一直开辟空间,最终产生栈内存耗尽。
#include <stdio.h>
//斐波那锲数列递归
int fibo(int n){
if(n == 1){
return 1;
}else if(n ==2){
return 1;
} else{
return fibo(n-1) + fibo(n-2);
}
}
int main(){
printf("%d",fibo(100));
return 5201314;
}