C语言函数

First Post:

Last Update:

Word Count:
1.5k

Read Time:
5 min

函数简介:

函数

和数学上的函数定义类似,C语言中的函数就是对给定的输入变量,返回对应的函数值,或者对进行一定的操作。

不同的是在C语言的函数当中,可以为,即没有函数的输入,只是在函数体中进行一定的操作。

最常见的函数就是main函数,之前讲过每个程序都需要有一个main函数作为程序入口,程序所进行的操作实际就是main函数里的内容。

函数最大的意义就是可以进行模块化编程,简单来说就是对同一类问题可以只用一个函数求解,类比数学中的函数就是我们对确定的可以只编写一个程序,无论的取值,我们都可以用这一个程序来求解,这一个程序就可以成为一个模块,而需要求解的问题就可以通过对其几个子问题模块的组合来解决。

函数分类

库函数

库函数包含在各个头文件里,比如平时最常用的scanf,printf也是函数(包含在<stdio.h>库中),除此之外<cmath>头文件中有定义好的各种数学运算函数,如sqrt(平方根)floor(下取整)pow(求幂)等等,还有<cstring>等各种库,只需要记住最常用的一些即可。标准库中的函数我们所要做的就是在程序中包含头文件之后直接调用。

用户自定义函数

这是重点部分,自定义函数就是我们去仿照标准库,去实现一些具有我们想要的功能的函数,具体的定义方法,声明方法等后面补充。

main函数

程序入口,不再赘述。

函数的使用:

函数的声明和定义

1
2
3
4
5
6
7
void myfunc(void); // 函数的声明(declaration)

void myfunc(void) // 函数的定义(definition)
{
printf("This is my function...");
return;
}

函数的声明和定义的基本语法如上,声明和定义的区别就是声明告诉了编译器有个函数叫myfunc,但是编译器不一定知道这个函数是做什么的;而定义则不仅告诉了编译器有这个函数,而且告诉了编译器这个函数可以干什么。

之后我们细看函数定义的语法,void myfunc(void)中,前面的void代表的是返回值类型(Return Type),后面的void代表的是函数参数(Parameters)。函数的返回值可以理解为,而函数参数就可以理解为,若有多个参数用,隔开。

返回值类型就是C语言中的数据类型,比如int,float,double,char等等,而参数则可以有多个,对应数学中的多元函数,下面给出一个求圆面积的例子:

1
2
3
4
5
6
#define PI 3.1415926
double getCircleArea(double radius)
{
double area = PI * radius * radius;
return area;
}

需要注意的是函数定义的返回值类型和在函数体中返回的类型要一致,如上面的例子中,圆面积area是double类型,函数的返回值也是double类型,因此函数体返回的语句为return area.再比如main函数一般为int main(),return 0;

回到开始的例子,

1
2
3
4
5
void myfunc(void) 
{
printf("This is my function...");
return;
}

之前知道C语言中void代表忽略或者没有,所以这个例子中的函数1.不需要参数。2.没有返回值。

函数的调用:

自定义函数在程序中的结构

1.
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

// 函数的声明

int main()
{
// 调用函数
return 0;
}

// 函数的定义

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

void myfunc(); // 声明

int main()
{
myfunc();
return 0;
}

void myfunc()
{
// To do ...
return;
}
2.
1
2
3
4
5
6
7
8
9
#include <stdio.h>

// 函数的声明兼定义

int main()
{
// 调用函数
return 0;
}

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void myfunc()
{
// To do ...
return;
}

int main()
{
myfunc();
return 0;
}

调用时返回值类型与等号左值相对应

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

#define PI 3.1415926

double getCircleArea(double radius)
{
double area = PI * radius * radius;
return area;
}

int main()
{
double radius = 4;
double area = getCircleArea(radius);
return 0;
}

嵌套调用:函数不止在主函数中可以调用,在一个函数中可以调用另一个函数

eg:见ppt Page.19

需要注意的是如果函数A在函数B中被调用,A一定要在B的定义之前被声明。

变量:

形参和实参:

形参是指函数定义和声明中的参数,而实参是指调用函数时传入的参数

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int add(int A, int B)
{
return A + B;
}

int main()
{
int a = 4, b = 5;
int c = add(a, b);
return 0;
}

上述代码中A,B为形参, a,b为实参。(形参和实参可以同名)

变量的作用域:

一般来说,变量的作用域就是定义变量的那一个语句块(那一对大括号之间)。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int global;

int main()
{
int a;
if(a == 0)
{
int b;
}
else
{
int c;
}
return 0;
}

如上述例子,变量a的作用域是整个main函数,而b,c的作用域则是它们各自所在的if语句块。

a,b,c都统称局部变量,除此之外,也有特殊变量叫全局变量,它定义在main函数之前,作用域是整个程序。

注意,自定义函数的参数属于局部变量,它的作用域就是函数体内。

变量类型:

auto和register

逐渐弃用,看看ppt就行

static:

用在局部变量,延长变量寿命,在函数体中的变量若没有static,每次调用后都会被释放,每次调用时都是重新申请资源,而static修饰后每次调用都是在上次调用的基础上。

用在全局变量,单文件没影响,多文件本来全局变量是多个文件互通,加static修饰后只在当前文件内可用。

extern:

在其他文件内定义的变量使用前声明时用到extern.