函数是执行一个任务的多条语句的集合。每个 C 程序都会至少有一个主函数 main() ,所有简单的程序都可以定义其他额外的函数。在逻辑上,通常是根据每个函数执行一个特定的任务来进行划分。函数还有很多叫法,比如方法、子例程或程序。
函数声明告诉编译器这个函数的名称、返回类型和参数。函数定义则提供函数的主体。
C 标准库提供了很多可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
一、函数的定义
函数
:
为了实现特定功能的独立代码模块
;
C库函数 :scanf()
printf() stelen() strcat() .......
函数的一般形式:
<数据类型> <函数名> (形式参数说明)
{
函数体;
return (表达式);
}
数据类型:和返回值保持一致,没有返回值数据类型为void;
函数名:是一个合法的标识符;
函数名也是函数的入口地址;
形式参数说明:
简称形参,可以有多个形参也可以没有,如果有多个参数用 ','隔开;
作用:告诉函数调用者,在调用函数的时候确定传递的参数的类型;
函数体:可以为大于等于0条语句;
return: 作为返回值,和数据类型保持一致,数据为void没有返回值,
可以写return 或者不写;
二、函数的调用
函数名
(
实际参数
);
eg
:
char
ch
=
getchar
();
三、函数的说明(函数原型)
<
数据类型
> <
函数名
>
(
形式参数说明
);
在说明函数的时候可以只写形参的类型
;
四、函数的传参
函数传参的实质:
将实参作为形参的初始化;
① 全局变量
② 复制传递
将实参的值复制给形参,形参不能修改实参的值;
eg:
int a = 10, b = 20;
int ret = addFunc(a, b);
eg:
输入两个数 a 和 b ,调用一个自己封装的函数实现交换;
③ 地址传递
将实参的地址传递给形参,形参可以修改实参的值;
eg:
int a, b;
myswap(&a, &y);
五、数组作为参数传递
复制传递:
eg:
testArray(arr, 5);
函数原型:
int testArray(int p[], 5);
//sizeof(p) == 8 ; //64位操作系统
地址传递:
eg:
testArray(arr, 5);
函数原型:
int testArray(int *p, 5);
总结:
复制和地址传递,实质上都是将数组的首地址赋值给一个指针
变量,只是形参的表现形式不同;
数组在传递参数的时候一般都需要传数组的长度;
六、指针函数
返回值为一个地址的函数;
一般形式:
《数据类型》* 《函数名》(形参)
{
函数体;
return 地址量;
}
七、练习题
1.有一字符串,包含n个字符。编写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
2.将n个数输入时顺序的逆序排列,用函数实现
3.有一个班的4个学生,有5门课程。
1)、求第一门课的平均分;
2)、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分
3)、找出平均分在90分以上或全部课程成绩在85分以上的学生。
分别编写三个函数来实现以上三个要求
4.实现函数char *mystrcat(char *dest, const char *src);