函数定义
- ret_type fun_name(形参)
- {
- return value;
- }
fun_name为函数名,ret_type为函数返回值
return value:
-
函数返回value这个值,value的类型为ret_type,若类型为void,则无返回值
-
若value非ret_type类型,则将其转换为该类型
-
return语句执行后跳出函数,return之后的语句都不执行
函数调用
1 fun_name(实参)
形参在实参被传过来时(函数被调用),才会申请内存空间,函数调用后形参内存空间被释放;形参是实参的一份临时拷贝,内存空间与实参不同,改变形参不影响实参的值。
函数声明
函数调用前要先定义,否则会报错;或者在调用之前声明函数(前提:该函数存在),声明:函数名,函数的返回类型和函数的参数。 如:int is_leap_year(int y)
代码复杂时用例:函数定义和调用分别在源文件(.c)中,声明在头文件(.h)中,例:
add.c
1 // 函数的定义2 int Add ( int x, int y)3 {4 return x+y;5 }
add.h
1 // 函数的声明2 int Add ( int x, int y);
test.c
1 # include <stdio.h>2 # include "add.h"34 int main()5 {6 int a = 0;7 int b = 0;8 int c = Add(a,b); // 函数调⽤9 printf("%d",c);10 return 0;11 }
数组做函数参数
• 形参可以写成数组或指针形式
• 形参如果是⼀维数组,数组⼤⼩可以省略不写
• 形参如果是⼆维数组,⾏可以省略,但是列不能省略
• 数组传参,形参是不会创建新的数组的
• 形参操作的数组和实参的数组是同⼀个数组(形参不会创建新的数组)
例:
//形参为指针
void mn_print(int(*p)[],size_t n)
{
for(int i = 0;i <= n - 1;i++)
{
printf("%d ",*p++);
}
}
//形参为数组
void mn_print(int arr[],size_t n)
{
for(int i = 0;i <= n - 1;i++)
{
printf("%d ",arr[i]);
}
}
//一维数组传参
int main()
{
int arr[4] = {1,2,3,4};
int n = sizeof(arr) / sizeof(arr[0]);
mn_print(arr,n);
return 0;
}
嵌套调用
在函数内部调用另一个函数
int is_leap_year(int y)
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 1;
else
return 0;
}
int get_days_of_month(int y, int m)
{
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day = days[m];
if (is_leap_year(y) && m == 2)\\调用is_leap_year函数
day += 1;
return day;
}
链式访问
将一个函数的返回值作为另一个函数的参数
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));//将strlen函数的返回值作为参数传给printf函数
return 0;
}
关键字:static 和 extern
static 是 静态的 的意思,可以⽤来:
•修饰局部变量
•修饰全局变量
•修饰函数
修饰局部变量:局部变量生命周期拉长,但作用域不变,保值,直至跳出函数,例:
#include <stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<5; i++)
{
test();
}
return 0;
}
下一次进入函数时,上一次的i并未销毁,运行结果为1 2 3 4 5
修饰全局变量或函数:
全局变量和函数都有外部链接属性,其他源文件都可使用,而在其他文件中使用时,可先用extern修饰。而当只想在该源文件使用,不想在其他源文件被使用时,要用static修饰。例:
add.h
- int m = 0;
test.h
- #include <stdio.h>
- extern int i;
- int main()
- {
- printf("%d", i);
- return 0;
- }
test.h可使用在add.h被创建的i,但若i被static修饰,则不能跨文件使用
add.h
- static int m = 0;