C语言中的函数就是一小段完成特定任务的代码
有些翻译又将函数译为 子程序,这可以看出C语言程序其实是由无数个函数组成的
c语言一般的两类函数:库函数,自定义函数
c语言本身不提供库函数,只规定各种语法规则。;C语言国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据C语言标准实现了一系列函数。这些函数就被称为库函数
这些库函数都在不同的头文件中进行声明,要调用库函数,就要包含头文件
语法形式:
type fun_name(形式参数)
{
//函数体
}
//type:函数返回类型
//fun_name:函数名
函数即子程序:
type 表示经过这道程序的到的结果,如果不需要结果,返回类型用 void ,表示不返回;
fun_name 就是这道程序的名字,方便调用
形式参数 就是要放入这个程序的东西,同理,如果不想放东西,参数可以是 void ,如果参数存在,要交代参数的类型和名字,以及参数个数
函数体 就是这个程序的具体样子
举例:
int Add(int x,int y)
{
return x+y;
}
//这就是一个加法函数
return后可以是一个值,也可以是表达式(先执行表达式,再返回值)
return后可以什么也没有,也可以没有return,适用函数返回类型为void
return返回的值和函数返回类型不一致,返回的值会转换为函数的返回类型
return执行后的语句不在执行,函数返回
实参:真实传递给函数的参数
形参:形式上存在,不会向内存申请空间,只有在函数被调用时为了存放实参的传递,才申请空间
#include
int Add(int x,int y) //x 和 y 就是形参
{
retrun x+y;
}
int main()
{
int a=3;
int b=2;
int c=Add(a,b);//a 和 b 就是实参
printf("%d\n",r);
return 0;
)
形参和实参各自是独立的内存空间,可以理解为形参是实参的一份临时拷贝
函数形参和实参个数要匹配
如果形参是一维数组,大小可以省略
如果形参是二维数组,行可以省略,列不可以省略
数组传参,形参不会创建新数组,形参和实参是同一个数组
嵌套调用即函数间互相调用
举例:
int is_3(int x)
{
if(x==3) retrun 1;
else return 0;
}
int get_3(int x)
{
if(is_3(x)) retrun 3;
else retrun 6;
}
int main()
{
int a=3;
int b=get_3(a);
printf("%d\n",b);
return 0;
}
main 函数调用 get_3 函数, get_3 函数调用 is_3 函数
函数可以嵌套调用,但不可以嵌套定义
链式访问即将一个函数的返回值作为另一个函数的参数,像链条一样访问
举例:
int main()
{
printf("%d\n",strlen("abc"));
return 0;
}
printf 和 strlen 是两个函数,将 strlen 的返回值作为 printf 的参数
int Add(int x,int y)//函数的声明,参数保留类型即可,名字可以省略
int Add(int x,int y)
{
return x+y;
}
//函数的定义
int main()
{
int a=2;
int b=3;
int c=Add(a,b);//函数的调用
printf("%d\n",c);
return 0;
}
函数调用一定满足:先声明后调用
函数的定义也是一种特殊的声明,函数定义放在调用前,声明可以省略
代码较多时,不会将所有代码放入一个文件,会将代码放入多个文件
一般情况:函数的声明,类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中
作用域:限定变量名字的可以使用的代码范围。局部变量作用域是变量所在局部范围,全局变量作用域是整个项目
生命周期:变量创建到销毁的时间段
extern 用来声明外部符号,如果一个文件中定义全局符号的想在另一个文件中使用,可以使用 extern 声明,然后使用
static 是 静态的 的意思
static 修饰局部变量改变变量的声明周期,本质是改变变量的存储类型,将原本存储在内存 栈区 的局部变量存储到 静态区,存储在 静态区 的局部变量和全局变量一样,生命周期和程序一样,但作用域不变
即:一个变量从函数出来,我们想保留值,下次进入函数可以接着用,可以使用static
void test()
{
static int i=0;//static 修饰局部变量
i++;
printf("%d ",i);
}
int main()
{
for(int i=0;i<10;i++)
{
test();
}
return 0;
}
static 改变全局变量的 外部链接属性 为 内部链接属性,使这个全局变量只能在自己源文件使用,其他源文件即使声明,也无法使用
//add.c
static int get_a=1;
//test.c
extern int get_a;
int main()
{
printf("%d\n",get_a);
return 0;
}
//链接错误
static 修饰函数和 static 修饰全局变量一样,让函数只能在本文件内部使用,改变函数的外部链接属性
//add.c
static int Add(int x,int y)
{
return x+y;
}
//test.c
extern int Add(int x,int y);
int main()
{
printf("%d\n",Add(2,3));
return 0;
}
//链接错误