在讨论函数调用之前,我们需要了解C编程语言中的函数。函数是一组用于执行预定义操作并返回值的任务。大型程序可以分成小的代码块,这有助于理解逻辑、调试和修改。

1.png

在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的返回数据类型,该函数包含两个整数参数num1num2。此外,我们还可以使用以下方式来写上述函数声明:

int add(int, int);

函数定义

函数定义在程序中实际定义了函数的主体,用于执行函数的具体任务。

语法:

返回数据类型 函数名称 (参数列表) {
    // 在函数中执行的语句
}

在上面的语法中,函数定义包含了以下三个部分:

  1. 返回数据类型:定义函数返回值的数据类型。返回数据类型可以是整数、浮点数、字符等。
  2. 函数名称:定义函数的实际名称,并包含一些参数。
  3. 参数/参数列表:是传递到函数中的参数。参数可以是任意类型、顺序和数量。

我们来看一个示例,演示函数定义:

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 中

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想