函数的概念
C语言源程序是由函数组成的。
所谓函数就是一段可以重复调用的,功能相对独立完整的程序段。
函数定义的角度
标准库函数
输入头文件,直接调用
用户自定义
自己编写
函数和过程两种功能
有返回值函数
被调用执行完后将向调用者返回一个执行结果,称为函数返回值
无返回值函数
不向调用者返回函数值
无参函数
函数定义、函数说明及函数调用中均不带参数
主函数和被调函数之间不进行参数传送
有参函数
带参函数
函数定义及函数说明时都有参数,称为形式参数。
在函数调用时必须给出参数,称为实际参数
在进行调用时,主调函数将把实参的值或地址传送给形参,供被调函数使用
注意
在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义
但是函数之间允许相互调用,也允许嵌套调用。
主调函数:调用者
被调函数:被调用者
递归调用:函数自己调用自己
main函数时主函数,它可以调用其他函数,而不允许被其他函数调用。
因此C语言程序的执行总是从main函数开始,完成对其他函数的调用后再返回到main函数,最后由main函数结束整个程序的执行,
一个C语言源程序必须有且只能有一个主函数Main
对函数调用之前,必须要先声明或先定义,否则编译错误。
一般将用户自定义的函数放在main函数的后面,再main的前面对所有自定义的函数进行原型声明。
函数的返回
功能是使程序控制从被调用函数返回到调用函数中,如果有返回值,同时把返回值带给调用函数。
函数中可以有多个return语句。
在无参数无返回值的函数中,return语句的形式只能是return;形式
toupper函数是标准库函数,功能是将小写字符转换成大写字符
无参数无返回值的函数
无参数有返回值的函数
缺省时,默认为int型
带参数无返回值
函数定义
不允许对形参赋初值,但可以在函数的执行部分对形参赋值
实参列表中的实参必须与函数定义时的形参数量相同、类型相符
实参表求值顺序,因系统而定
是这样子分析的
TC或BC下:
b=i;i++;i++;a=i=4
所以a=4,b=2;i=4
VC下:
b=i;i++;i=a;i++
所以a=3;b=2;i=4
带参数有返回值的函数
函数参数的传递方式
值传递
调用时,为形参分配内存单元,并将实参的值复制到形参中
调用结束,形参所占内存单元被释放,实参的内存单元仍保留并维持原值。
特点是:形参和实参占用不同的内存单元,函数中对形参值的改变不会改变实参的值。这就是函数参数的值单向传递规则
地址传递
#include<stdio.h>
void mergestr (char s1[],char s2[],char s3[]);
int main()
{
char str1[]={"hello "};
char str2[]={"china!"};
char str3[40];
mergestr(str1,str2,str3);
printf("%s\n",str3);
return 0;
}
void mergestr(char s1[],char s2[],char s3[])
{
int i,j;
for(i=0;s1[i]!='\0';i++)
s3[i]=s1[i];
for(j=0;s2[j]!='\0';j++)
s3[i+j]=s2[j];
s3[i+j]='\0';
return;
}
变量的存储类型
函数的嵌套和递归调用
打印数字三角形