Administrator
Administrator
发布于 2024-09-05 / 19 阅读
0
0

第6章:函数

6.1 函数的定义与声明

1. 函数的定义

函数定义是指编写函数的具体实现部分,包括函数的返回类型、函数名、参数列表和函数体。

基本形式:

返回类型 函数名(参数类型 参数名, ...) {
    // 函数体
    // 需要执行的代码
    return 返回值; // 如果有返回值
}

示例:

#include <stdio.h>

// 函数定义
int add(int a, int b) {
    return a + b; // 返回两个整数的和
}

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

2. 函数的声明

函数声明是指在使用函数之前告诉编译器函数的返回类型、函数名和参数类型。函数声明通常放在文件的顶部或头文件中。

基本形式:

返回类型 函数名(参数类型, ...);

示例:

#include <stdio.h>

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

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

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

6.2 函数参数传递

函数的参数传递有两种方式:值传递引用传递(实际上是地址传递)

1. 值传递

在值传递中,将参数的副本传递给函数。函数内的操作不影响原始参数。

示例:

#include <stdio.h>

void modifyValue(int x) {
    x = 100; // 修改的是副本,不影响原始变量
}

int main() {
    int a = 10;
    modifyValue(a);
    printf("a after modifyValue: %d\n", a); // 输出仍然是10
    return 0;
}

2. 引用传递(地址传递)

在引用传递中,将参数的地址传递给函数。函数内的操作可以影响原始参数。

示例:

#include <stdio.h>

void modifyValue(int *x) {
    *x = 100; // 修改的是地址对应的实际变量
}

int main() {
    int a = 10;
    modifyValue(&a);
    printf("a after modifyValue: %d\n", a); // 输出为100
    return 0;
}

6.3 函数返回值

函数可以返回一个值,也可以不返回值。void类型的函数表示不返回任何值。

1. 返回值

函数的返回类型决定了它能返回什么样的值。

示例:

#include <stdio.h>

// 返回整数的函数
int getMax(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

int main() {
    int max = getMax(10, 20);
    printf("Max value is: %d\n", max);
    return 0;
}

2. 无返回值的函数

如果函数不需要返回任何值,可以使用void作为返回类型。

示例:

#include <stdio.h>

// 不返回任何值的函数
void printHello() {
    printf("Hello, World!\n");
}

int main() {
    printHello(); // 调用无返回值函数
    return 0;
}

6.4 递归函数

递归函数是指在函数的定义中调用该函数自身。递归函数在解决问题时,通常将问题分解为更小的相同类型的问题。

示例:计算阶乘

#include <stdio.h>

// 递归函数计算阶乘
int factorial(int n) {
    if (n == 0) {
        return 1; // 基本情况:0! = 1
    } else {
        return n * factorial(n - 1); // 递归情况
    }
}

int main() {
    int num = 5;
    printf("Factorial of %d is: %d\n", num, factorial(num));
    return 0;
}

6.5 内联函数

在C语言中,内联函数可以通过inline关键字定义,建议编译器将函数调用扩展为函数体,以减少函数调用的开销。

注意:内联函数是一种优化建议,编译器可以选择忽略。

示例:

#include <stdio.h>

// 内联函数
inline int square(int x) {
    return x * x;
}

int main() {
    int num = 5;
    printf("Square of %d is: %d\n", num, square(num));
    return 0;
}

练习

  1. 编写一个函数,计算两个整数的最大公约数(GCD)。
  2. 编写一个递归函数,计算斐波那契数列的第n个数。
  3. 编写一个函数,传入一个数组和数组的大小,返回数组中最大元素的值。
  4. 编写一个程序,使用inline函数计算两个数的乘积。

完成这些练习后,你将对C语言中的函数有深入的理解。


评论