文章目录
- 一、函数的调用
- 1.函数的调用方式
- 2.嵌套调用
- 3.递归调用
- 二、内部函数和外部函数
- 1.内部函数
- 2.外部函数
- 三、局部变量和全局变量
- 1.局部变量
- 2.全局变量
- 四、总结
一、函数的调用
在我们编写C语言程序的过程中,我们有时候需要用到一些工具,函数就像是完成某项特定功能的工具,而使用函数的过程就是函数的调用
1.函数的调用方式
就如果我们日常生活中的工具一般,函数的调用也不止一种方式。函数的调用方式分为三种,包括函数语句调用、函数表达式调用、函数参数调用,下面我会对这三种情况进行一一讲解:
①.函数语句调用
把函数调用作为一个语句就称为函数语句的调用。函数语句调用是最常见的函数调用方式,如下所示:
Showtime(); //显示一条信息
这个函数的功能就是在函数的内部显示一条消息,这是不要求函数带返回值,只要求完成特定的操作。
我们可以来看一个例子:
#include <stdio.h>
void Showtime()
{
printf("Hello CSDN!");
}
int main()
{
Showtime();
return 0;
}
这个例子就使用了调用函数语句调用方式,通过调用函数的方式完成打印一条信息的功能,进而观察函数语句调用的使用方式。
②.函数表达式调用
函数出现在一个表达式中,这时要求函数必须带回一个确定的值。而这个值则作为参加表达式运算的一部分,如下所示:
Total = Num1 * adds(3, 5);
可以看到,函数adds在这条语句中的功能就是使两个数相加。在表达式中,adds将相加的结果与Num1,将得到的值赋给Total变量。
③.函数参数调用
函数调用作为一个函数的实参,也就是将函数返回值作为实参,传递到函数中使用。函数出现在一个表达式种,这时要求函数带回一个确定的值,这个值用于参加表达式的运算,如下所示:
Total = adds(10, adds(3, 5));
在这条语句中adds函数的功能和上面一致,然后将相加的结果作为函数的参数,继续进行计算。
2.嵌套调用
在C语言中,函数的定义都是独立的。也就是说,一个函数体内不能包括定义的另外一个函数。例如这样的代码就是错误的:
int main()
{
void Showtime()
{
printf("Hello CSDN!");
}
return 0;
}
我们在主函数main函数里定义了一个Showtime函数,目的是输出一句话,但这在C语言种是不允许的。
虽然C语言不允许进行嵌套定义,但是是可以嵌套调用函数的,也就是说,我们可以在一个函数体内调用另外一个函数,例如:
void Showtime()
{
printf("Hello CSDN!");
}
void Display()
{
Showtime();
}
我们在定义的Display函数中调用了Showtime函数,在C语言中是被允许的。
3.递归调用
C语言中的函数都是支持递归的,也就是说,每一个函数都可以直接或者间接地调用自己。所谓的间接调用,就是指递归函数调用的下层函数中再调用自己。而递归之所以能够实现,就是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和还函数的其他执行过程不发生关系。
一起来看一个例子:
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "bit";
printf("%d\n", my_strlen(arr));
return;
}
我们这里用递归的方法模拟实现一个strlen函数,大家可以看着代码尝试理解一下,这里就不一一解释了。
二、内部函数和外部函数
通过前面的学习我们知道函数是C语言组成的基本单位,可以把一个或者多个函数保存为一个文件,这样的文件就被我们称为源文件。当一个源程序由多个源文件组成时,可与指定函数不能被其他文件调用。所以,C语言又把函数分为了两类:内部函数和外部函数。
1.内部函数
定义一个函数,如果希望这个函数只被所在的源文件使用,那么就称这样的函数为内部函数。内部函数又名静态函数。使用内部函数,可以使函数只局限在函数所在的源文件,如果在不同的源文件有同名的内部函数,则二者互不影响。在定义内部函数时,我们要在函数返回值和函数名前面加上关键字static进行修饰,如下所示:
static 返回值类型 函数名(参数列表)
2.外部函数
外部函数则和内部函数相反,外部函数是可以被其他源文件调用的函数。定义外部函数要使用关键字extern进行修饰。例如:
extern int Adds(int Num1, int Num2);
这里要额外提一句,在C语言中定义函数时,如果不说明函数时内部函数还是外部函数,那么将默认指定函数为外部函数。也就是说,定义外部函数时可以省略关键字extern。
三、局部变量和全局变量
我们这里先来引入一个作用域的概念,作用域可以决定程序中的哪些语句是可用的,也就是程序中的可见性。作用域包括局部作用域以及全局作用域,局部变量具有局部作用域,全局变量具有全局作用域。下面我们来具体看看有关局部变量和全局变量的知识点。
1.局部变量
在一个函数的内部定义的变量就是局部变量。这些变量声明在函数内部,无法被其他函数所使用。函数的形式参数也属于局部变量,作用范围仅限于函数内部的所有语句块。
一起来看一段代码:
#include <stdio.h>
int main()
{
int Num1 = 1; //Num1的作用域在整个main函数中
if(Num1 > 0)
{ //Num2的作用域在if语句块中
int Num2 = 2;
if(Num2 > 0)
{ //Num3的作用域在if语句块中
int Num3 = 3;
//将三个都在此作用域的函数进行输出
printf("%d %d %d", Num1, Num2, Num3);
}
}
return 0;
}
程序中有三个作用域范围,其中主函数main是最大的作用域范围,依次下来就是两个if语句块,对应的,他们都只能位于自己对应的函数内产生作用。从上述代码我们可以看出,一个局部变量的作用范围可以由包含变量的一对大括号所限定,这样就可以更好地观察局部变量的作用域。
2.全局变量
如果一个变量在所有函数的外部声明,那么这个变量就是全局变量。简单来说,全局变量是可以在程序的任意位置进行访问的变量。
这里要注意,全局变量不属于某个函数,而是属于整个源文件。如果有哪个外部文件需要进行使用,则要用关键词extern进行引用修饰。
四、总结