C语言教程-C中的函数调用
在讨论函数调用之前,我们需要了解C编程语言中的函数。函数是一组用于执行预定义操作并返回值的任务。大型程序可以分成小的代码块,这有助于理解逻辑、调试和修改。
在C编程语言中,函数分为两部分:库函数/内置函数和用户定义函数。
库函数/内置函数
库函数是预定义函数,它们的任务在C头文件中已经定义。因此,不需要编写这些特定函数的代码,我们可以在程序中直接调用它们。例如,printf()
、scanf()
、getch()
等都是C库中的预定义函数,它们的含义是无法改变的。
让我们编写一个使用库函数的C程序示例。
Predefined.c
#include <stdio.h> // 包含了 printf、scanf() 等内置函数
#include <conio.h> // 包含了 getch() 内置函数
void main() {
printf("欢迎来到 JavaTpoint.com\n");
printf("这是C语言中的库函数或内置函数\n");
getch(); // 内置函数
}
用户定义函数
在C编程语言中,我们可以使用用户定义函数根据程序员的需求执行一些特定的操作。用户定义函数分为三种类型:函数声明、函数定义和函数调用。
函数声明
函数声明定义了函数的名称和返回类型。在使用函数之前,我们需要在程序的main()
函数之外声明它。
语法:
返回数据类型 函数名称 (数据类型 参数);
函数声明示例:
int add(int num1, int num2);
在上面的示例中,int
是函数名add
的返回数据类型,该函数包含两个整数参数num1
和num2
。此外,我们还可以使用以下方式来写上述函数声明:
int add(int, int);
函数定义
函数定义在程序中实际定义了函数的主体,用于执行函数的具体任务。
语法:
返回数据类型 函数名称 (参数列表) {
// 在函数中执行的语句
}
在上面的语法中,函数定义包含了以下三个部分:
- 返回数据类型:定义函数返回值的数据类型。返回数据类型可以是整数、浮点数、字符等。
- 函数名称:定义函数的实际名称,并包含一些参数。
- 参数/参数列表:是传递到函数中的参数。参数可以是任意类型、顺序和数量。
我们来看一个示例,演示函数定义:
int min(int n1, int n2); // min() 是函数名,它包含 n1 和 n2 作为参数
{
int out; // 声明局部变量
if (n1 > n2)
out = n1; // 当 n1 大于 n2 时,返回 n1
else
out = n2; // 当 n2 大于 n1 时,返回 n2
return out;
}
函数调用
函数调用是C编程语言中的重要部分。它在程序中被调用,每当需要调用函数时,就会被执行。函数调用只需在主main()
函数中用函数名调用即可。我们可以在函数调用时传递参数给函数。
语法:
Add(a, b) // a 和 b 是参数
让我们考虑一个程序示例,展示C语言中的函数调用。
Add.c
#include <stdio.h>
int add(int a, int b); // 声明 add() 函数
void main() {
int sum;
int a, b;
printf("输入第一个和第二个数字\n");
scanf("%d %d", &a, &b);
sum = add(a, b); // 调用 add() 函数
printf("两个数字的和是 %d", sum);
}
int add(int n1, int n2) // 传递 n1 和 n2 参数
{
int c;
c = n1 + n2;
return c;
}
值传递
当实际参数的单个或多个值被复制到函数调用的形式参数时,该方法称为值传递。因此,它不会通过形式参数改变函数的实际参数值。
让我们编写一个程序示例,演示C语言中的值传递。
Call_Value.c
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("x = %d, y = %d 在调用函数之前从 main 中", x, y);
CallValue(x, y);
printf("\nx = %d, y = %d 在调用函数之后从 main 中", x, y);
return 0;
}
int CallValue(int x, int y) {
x = x + 5;
y = y + 5;
printf("\nx = %d, y = %d 在模块函数中", x, y);
}
引用传递
在这种方法中,实际参数的地址复制到函数调用的形式参数中,称为引用传递。如果在形式参数中对实际参数进行了更改,则实际参数的值也会改变。
让我们编写一个程序示例,演示C语言中的引用传递。
Call_Ref.c
#include <stdio.h>
int main() {
int x = 10, y = 20;
printf("x = %d, y = %d 在调用函数之前从 main 中", x, y);
CallRef(&x, &y);
printf("\nx = %d, y = %d 在调用函数之后从 main 中", x, y);
return 0;
}
int CallRef(int *a, int *b) {
*a = *a + 5;
*b = *b + 5;
printf("\nx = %d, y = %d 在模块函数中", *a, *b);
}
输出:
x = 10, y = 20 在调用函数之前从 main 中
x = 15, y = 25 在模块函数中
x = 15, y = 25 在调用函数之后从 main 中