C语言函数
函数的分类
- 库函数
库函数又称系统定义的标准函数,是由编译器事先定义的,库文件中包括了对各函数的定义。不需要自己定义,只需要#include <头文件名>
就可以使用- 自定义函数
如果想使用函数来实现自己的目的,而库函数无法达到。我们也可以自己定义函数来实现目的。
函数的定义方法
在程序中所有的函数都要先定义,再使用。库函数的定义在包含他的头文件中。所以自定义函数,要我们使用这个函数前先定义函数。根据函数的参数,函数可以分两种。
- 无参函数
类型名 函数名()
{
函数语句;
}
void printstar()
{
printf("*********");
}
这就是一个无参函数的定义
2. 有参函数
类型名 函数名(形式参数列表)
{
函数语句;
}
int sum (int a,int b)
{
int s;
s=a+b;
return s;
}
ok,这就是一个简单的有参函数的定义。
函数的调用
就是函数的使用,在定义完函数后,在程序中使用上面定义完的函数
函数名(实参)
- 函数在调用时的参数为实际参数,简称:实参。在使用无参函数时,实参可以省略,但是“()”不可以省略。
- 实参可是常量,变量或者表达式,实参要与形参保持类型一致,各实参中间用逗号分开。
lji(char* p)
{
printf("%c\n", *p);
p++;
if (*p == '\0')
p = 0;
lji(p);
}
main()
{
char arr[10] = { "abcd" };
lji(arr);
return 0;
}
可以看到有的函数有返回值,有的没有。这个要怎么判断需不需要返回值呢
int jl(int a)
{
int b=a+1;
return b;
}
main()
{
int a=3;
int b=jl(a);
}
可以先简单的认为,如果我们需要函数计算得到一个值的时候,我们就要在函数的定义最后加入
return
来让函数返回我们结果。
void li()
{
printf("**********");
}
main()
{
li();
}
在这个函数中我们的目的不是进行运算,所以就不需要
return
不需要返回值
当返回语句中类型跟函数类型不一样的话,以函数类型为准
float sum(int a,int b)
{
return a+b;
}
函数类型为float,return语句中a+b类型为int,在返回时系统将自动把函数返回类型转换为函数类型float
函数的声明
如果在函数没有定义的时候,想要使用函数。可以在文件开头先进行函数声明。
int sum(int a,int b);
这就是函数声明的一般形式
#include <stdio.h>
int max(int a,int b);
main()
{
int x,y;
printf("请输入两个整数:\n");
scanf("%d%d",&x,&y);
printf("%d和%d的最大值为:%d",x,y,max(x,y));
}
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
如上面的程序,在我们使用max()函数时,我们还没对其进行定义,但是当我们在开始的时候,对max()函数进行了声明。我们就可以正常调用max()函数。当然,如果你想让max()真正起作用,还时要对其进行定义的。
函数的参数
函数的参数主要用于主调函数跟被调函数之间的数据传输
形参说明了被调函数使用时,需要多少数据,及什么类型的数据。
实参可以是常量,变量,表达式或者一个函数,类型必须与形参一致。
函数在未被调用时,不占据系统空间。在调用时,系统会给其创建一个临时空间,并把实参传输给形参。在c语言中数据只能实参传输给形参。也就是说在函数的临时空间中形参数值的改变影响不了实参。但可以利用指针来弥补这个问题,指针的使用后面会再提到。伏笔一下。
数组名当函数的参数时,除了注意实参与形参的类型一致外,还有因为数组名是数组的首地址,相当与一个指针,所以在函数中形参的地址也是实参的地址,相当于两者公用一个空间。因此,形参数组改变时,实参也会改变。
函数的递归调用
递归调用是指函数直接或者间接调用了自己。
int f()
{
printf("hahaha");
f();
}
这个函数在定义时调用了自己f(),这就是函数的递归,但是根据前面循环的知识,我们会发现这是一个死循环。这就是我们要注意的函数递归时,栈溢出的情况。栈就是存储函数的空间。
那么如何正确使用函数的递归呢?
函数递归的用法很简单,是拆分思想。假如我规定了函数H()可以计算8*n。那么我就可以将H(n)写成8+H(n-1),
int H(int n)
{
return 8*n;
}
#include <stdio.h>
int H(int n)
{
if (n == 0)
return 0;
else
return 8 + H(n - 1);
}
int main()
{
int a = 8;
printf("%d", H(a));
}
把原来的8n分成8+8(n-1),再把8*(n-1)分成8+8*(n-2),最后分成8+8+8…分成了加法。这就是函数的递归,但是由此可见有的问题不适合用递归来解决,大家在使用递归时要好好甄别哦!
函数的生命
函数在被使用时,系统分配其临时空间,在结束使用后空间被返还系统。函数的生命结束。函数由定义组成,在没有定义时,想要使用函数,要先声明才可以使用。当函数的声明或者定义都存放在一个文件中,我们可以包含头文件,在程序中就可以正常使用头文件里包含的函数了。
#include <文件名>或者#include "文件名"
跟我们#include<stdio.h>一样
ok了
这就是本章的内容了,明天就是五一了,加号祝大家拥有一个快乐的假期。比心比心