首页 > 编程笔记 > C语言笔记 阅读:127

C语言函数的声明、定义和调用(非常详细)

在 C 语言程序中,函数是一段具有特定功能的代码块,借助函数,我们可以将代码分解成小的、可重用的模块,从而提高程序的可读性和维护性。

对于初学者来说,掌握函数的声明、定义和调用是学习 C语言函数的第一步:

C语言函数的定义

函数的定义是指编写函数的具体实现,包括它的返回值类型、名称、参数以及执行逻辑。

定义函数的语法如下:

返回值类型 函数名(参数列表) {
    函数体;
    return 返回值; // 如果返回值类型不是 void,则需要返回一个值
}

让我们分解一下这个结构:


来看一个简单的例子,定义一个计算两个整数之和的函数:

int add(int a, int b) {
    int sum = a + b;
    return sum;
}

在这个例子中,add() 函数接受两个整数参数 a 和 b,计算它们的和,并通过 return 返回结果。

C语言函数的调用

定义好函数后,我们需要通过调用来执行它。函数调用通常是将函数名加上参数(如果有)写在程序中合适的位置。调用时,程序会跳转到函数定义处,执行其中的代码,然后返回到调用点继续执行。

调用函数的语法如下:

函数名(实参列表);

结合上面的 add() 函数,我们可以在 main() 函数中调用它:

#include <stdio.h>

int add(int a, int b) {
    int sum = a + b;
    return sum;
}

int main() {
    int result = add(3, 5); // 函数调用
    printf("3 + 5 = %d\n", result);
    return 0;
}

执行程序,输出结果为:

3 + 5 = 8

这里,add(3, 5) 是函数调用,3 和 5 是实参(实际参数),它们被传递给函数的形参 a 和 b,函数计算后返回 8,并赋值给 result。

函数参数传递的细节

在函数调用时,实参会传递给形参。C语言采用的是“按值传递”(pass by value),即形参是实参的副本,对形参的修改不会影响实参。例如:

#include <stdio.h>

void change(int x) {
    x = 10;
}

int main() {
    int a = 5;
    change(a);
    printf("a = %d\n", a);
    return 0;
}

运行程序,输出结果为:

a = 5 
里,change() 函数修改了 x,但 a 的值没有改变,因为 x 是 a 的副本。

除了按值传递,还可以将形参的地址传递给实参,这样对形参的修改,实参也会改变,感兴趣的读者可阅读《C语言指针变量作为函数参数》一文。

C语言函数的声明

在 C语言中,函数的定义和调用顺序有一定的要求:如果函数的定义在调用之后,必须先声明函数,否则编译器会因为找不到函数定义而报错。

函数声明的语法如下:

返回值类型 函数名(参数类型列表);

声明只需要提供函数的“签名”(返回值类型、函数名、参数类型),不需要写函数体。

例如:

#include <stdio.h>

int add(int a, int b); // 函数声明

int main() {
    int result = add(3, 5);
    printf("3 + 5 = %d\n", result);
    return 0;
}

int add(int a, int b) { // 函数定义
    return a + b;
}

在这个例子中,int add(int a, int b); 是函数声明,告诉编译器 add() 函数的存在及其形式。这样,即使定义在后面,调用也不会出错。如果函数定义在调用之前,可以省略声明。

无参数和无返回值的函数

有些函数不需要参数或返回值,这时可以用 void 类型。例如:

#include <stdio.h>

void sayHello() {
    printf("Hello, World!\n");
}

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

执行程序,输出结果为:

Hello, World!

这个函数没有参数,直接调用 sayHello() 即可执行。

函数调用中的常见问题

在定义和调用函数时,初学者可能会遇到一些问题。以下是一些常见情况及解决方法:
 

问题 原因 解决方法
未定义的函数 函数调用前未声明或定义 提前声明函数,或将定义放在调用前
参数个数不匹配 调用时提供的实参个数与定义不符 检查调用时的实参与形参是否一致
返回值缺失 声明了返回值类型但未返回 确保非 void 函数有 return

相关文章