c语言函数简介

1. 函数的概念

C语言中的函数就是一小段完成特定任务的代码

有些翻译又将函数译为 子程序,这可以看出C语言程序其实是由无数个函数组成的

c语言一般的两类函数:库函数,自定义函数

2. 两类函数

2.1 库函数

2.1.1 标准库

c语言本身不提供库函数,只规定各种语法规则。;C语言国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据C语言标准实现了一系列函数。这些函数就被称为库函数

这些库函数都在不同的头文件中进行声明,要调用库函数,就要包含头文件

2.2 自定义函数

语法形式:

type fun_name(形式参数)
{
 //函数体
}

//type:函数返回类型
//fun_name:函数名

函数即子程序:

type 表示经过这道程序的到的结果,如果不需要结果,返回类型用 void ,表示不返回;

fun_name 就是这道程序的名字,方便调用

形式参数  就是要放入这个程序的东西,同理,如果不想放东西,参数可以是 void ,如果参数存在,要交代参数的类型和名字,以及参数个数

函数体 就是这个程序的具体样子

举例:

int Add(int x,int y)
{
  return x+y;
}

//这就是一个加法函数

2.3 函数中的 retrun 语句

return后可以是一个值,也可以是表达式(先执行表达式,再返回值)

return后可以什么也没有,也可以没有return,适用函数返回类型为void

return返回的值和函数返回类型不一致,返回的值会转换为函数的返回类型

return执行后的语句不在执行,函数返回 

3. 形参和实参

3.1 含义

实参:真实传递给函数的参数

形参:形式上存在,不会向内存申请空间,只有在函数被调用时为了存放实参的传递,才申请空间

#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;
)

3.2 形参和实参的联系

形参和实参各自是独立的内存空间,可以理解为形参是实参的一份临时拷贝

3.3 数组做函数参数

函数形参和实参个数要匹配

如果形参是一维数组,大小可以省略

如果形参是二维数组,行可以省略,列不可以省略

数组传参,形参不会创建新数组,形参和实参是同一个数组

4. 嵌套调用和链式访问

4.1 嵌套调用

嵌套调用即函数间互相调用

举例:

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 函数

函数可以嵌套调用,但不可以嵌套定义

4.2 链式访问

链式访问即将一个函数的返回值作为另一个函数的参数,像链条一样访问

举例:

int main()
{
 printf("%d\n",strlen("abc"));
 return 0;
}

printf 和 strlen 是两个函数,将 strlen 的返回值作为 printf 的参数

5. 函数的声明和定义

5.1 单个文件

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;
}

函数调用一定满足:先声明后调用

函数的定义也是一种特殊的声明,函数定义放在调用前,声明可以省略

5.2 多个文件

代码较多时,不会将所有代码放入一个文件,会将代码放入多个文件

一般情况:函数的声明,类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中

6. 关键字static和extern

6.1 作用域和生命周期

作用域:限定变量名字的可以使用的代码范围。局部变量作用域是变量所在局部范围,全局变量作用域是整个项目

生命周期:变量创建到销毁的时间段

6.2 extern

extern 用来声明外部符号,如果一个文件中定义全局符号的想在另一个文件中使用,可以使用 extern 声明,然后使用

6.3 static

static 是 静态的  的意思                                                                                                      

6.3.1 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;
}

6.3.2 static 修饰全局变量

static 改变全局变量的 外部链接属性 为 内部链接属性,使这个全局变量只能在自己源文件使用,其他源文件即使声明,也无法使用

//add.c
static int get_a=1;

//test.c
extern int get_a;
int main()
{
 printf("%d\n",get_a);
 return 0;
}

//链接错误

6.3.3 static  修饰函数

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;
}

//链接错误

你可能感兴趣的:(c语言,开发语言)