函数定义、声明和调用
形式:
<数据类型> <函数名称> (<形式参数说明>)
{
语句集;
return (<表达式>)
}
无参函数。 有参函数,空函数
参数类型:变量,指针,数组名,数组指针,函数指针。。。。
声明:函数在声明中可以省略形参,但这样编译器就不能检查实参和形参是否匹配, 所以不建议省略。 |
函数传参与返回值
- 函数未调用时,形参没有分配空间。调用时,系统为形参分配空间。调用结束后,所占内存单元被释放。
- 实参可以是常量、变量或表达式。max(a, a+b);
- 函数定义时要指定数据类型。
- 实参与形参的类型相同或兼容。
- C语言中,实参向形参传递参数是单向的,只能由实参传递给形参,反之不可以,在内存中,实参和形参占用的是不同的内存单元。
值传递与址传递
值传递
(分析值传递过程,值传递过程相当于隐含动作int a = x, int b = y)
址传递
典型strcpy实现
char * strcpy(char *dest, const char *source)
{
asssert(dest != NULL && source != NULL);
char * r = dest;
while ((*dest++ = *source++) != ‘\0’)
;
return dest;
}
返回值
- 函数的返回值由return语句返回,如:return z; return (z); return (表达式)三种形式都可以,括号可以省略,保持简洁。
- 函数值在类型不指定时,系统按整型处理。
- 函数定义类型和返回类型保持一致。
- void 定义的函数表示空类型;
函数调用
调用形式
- 函数语句:printf(“”);
- 函数表达式: a = read(buff, fd, n);
- 函数参数: m = max(a, max(a, b));
- 函数调用函数的几点说明:
被调用函数必须是存在的库函数或自定义函数;如果使用库函数,要在文件开头进行#include <> 进行头文件包含,对函数进行声明。
调用自定义函数时,被调用函数应该在调用函数前面,在主函数中进行被调用函数的声明。
声明可以函数声明可以在主函数内部或在主函数前面,也可以在主函数前面进行函数定义。函数类型省略的情况下,系统默认是int型.