c语言基础知识帮助理解(详解函数)

C/C++
169
0
0
2024-04-13

1. 函数是什么

函数是一段可以执行特定任务的代码块。它可以接受输入参数并返回一个值。函数使得代码可以被模块化,重复使用,并提高代码的可读性和可维护性

2. 库函数

像 printf , scanf 的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C 语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。

库函数是由编译器或操作系统提供的函数,用于执行常见的任务,如输入输出、字符串处理、数学计算等。库函数可以直接使用,不需要额外的编写和编译

下面是一个使用库函数的示例代码,计算并打印正弦值:

#include <stdio.h>
#include <math.h>

int main() {
    double angle = 30;
    double sinValue = sin(angle);
    printf("Sin value of %lf degrees: %lf\n", angle, sinValue);
    
    return 0;
}
其中各种库函数及其对应的头文件可以去cplusplus.com 查看,接下来我给出一个实例:

同时也能帮助到各位理解上面的代码,c语言中库函数亦不少,本文便不进行大量阐述。日后我会再写文章来详细讲解。

3. 自定义函数

自定义函数: 自定义函数是由程序员根据需求自行编写的函数。它们可以完成特定的任务,并可以通过函数名调用执行。自定义函数在代码中经常被使用,可以提高代码的模块化和可重用性。

  • ret_type是返回值的类型
  • fun_name是自定义函数名
  • para1是函数的形式参数

下面是一个自定义函数的示例代码,用于计算两个整数的和:

#include <stdio.h>

// 自定义函数,用于计算两个整数的和
int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 10;
    
    int sum = add(x, y);
    printf("Sum: %d\n", sum);
    
    return 0;
}

4. 函数参数

4.1实际参数(实参)

函数的实际参数是在函数调用时传递给函数的值。实际参数可以是常量、变量、表达式或其他函数的返回值。实际参数的值被传递给函数的形式参数,从而在函数内部使用。实际参数的值可以影响函数的行为和结果。

4.2形式参数(形参)

形式参数是在函数定义中声明的变量,用于接收函数调用时传递的实际参数的值。形式参数在函数定义中起到占位符的作用,它们的值在函数调用时由实际参数提供。形式参数只在函数内部可见,其作用域仅限于函数内部。

下面用代码事例来进一步阐述:

#include <stdio.h>

// 函数定义,使用形式参数
void printSum(int a, int b) {
    int sum = a + b;
    printf("Sum: %d\n", sum);
}

int main() {
    int x = 5;
    int y = 10;
    
    // 函数调用,使用实际参数
    printSum(x, y);
    
    return 0;
}

在上述示例代码中,我们定义了一个名为printSum()的函数,它接受两个形式参数ab。在main()函数中,我们声明了两个整数变量xy,并将它们作为实际参数传递给printSum()函数。在printSum()函数内部,形式参数ab接收到相应的值,并计算它们的和。最后,在函数中打印出结果

需要注意的是:形参实例化之后其实相当于实参的一份临时拷贝,想要改变参数的值,单单传值操作是不行的哦,我们要进行传址操作(后面讲)

5.函数的调用

5.1传值调用

传值调用是指在函数调用时,将实际参数的值复制给形式参数,二者的地址是不同的,即函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参

5.2传址调用 (传递地址)
  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量

接下来用一段代码来详细说明:

void changeValue(int *ptr) {
    *ptr = 10;
    printf("Inside function: %d\n", *ptr);
}

int main() {
    int x = 5;
    printf("Before function call: %d\n", x);
    
    changeValue(&x);
    
    printf("After function call: %d\n", x);
    
    return 0;
}

此为传地址调用:可以清楚地发现,x的值被改变了

-------------------------------------------------------------------------------------------------------------------------------

传值

void changeValue(int ptr) {
    ptr = 10;
    printf("Inside function: %d\n", ptr);
}

int main() {
    int x = 5;
    printf("Before function call: %d\n", x);

    changeValue(x);

    printf("After function call: %d\n", x);

    return 0;
}

而传值调用发现:根本改变不了,再结合之前的说明相信各位更加能理解清楚了

6. 函数的嵌套调用和链式访问

6.1 嵌套调用

函数的嵌套调用是指在一个函数内部调用另一个函数。这种调用方式可以实现函数的层层嵌套,每个函数负责不同的功能,使代码结构更加清晰和模块化。通过函数的嵌套调用,可以将复杂的问题分解成更小的子问题,并通过调用不同的函数来解决这些子问题

int multiply(int a, int b) {
    return a * b;
}

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

int main() {
    int x = 5;
    int y = 3;
    
    int result = multiply(add(x, y), y);
    
    printf("Result: %d\n", result);
    
    return 0;
}
定义了两个函数multiply()add(),分别用于实现乘法和加法运算。在main()函数中,我们声明了两个整数变量xy,并将它们作为实际参数传递给add()函数。add()函数返回x + y的结果,然后将这个结果作为实际参数传递给multiply()函数。最后,multiply()函数返回result * y的结果,这个结果被赋值给变量result
6.2 链式访问

把一个函数的返回值作为另外一个函数的参数

printf("%d", printf("%d", printf("%d", 43)));

第一个printf打印32,返回值是2

  • 所以第二个printf打印2,返回值是1
  • 第三个printf答应1

7. 函数的声明和定义

7.1 函数声明

函数的声明是指在使用函数之前事先告诉编译器函数的名称、返回类型和参数列表 。函数的声明一般出现在函数的使用之前。要满足先声明后使用

7.2函数定义

函数的定义是指函数的具体实现,交待函数的功能实现

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

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

int main() {
    int x = 5;
    int y = 3;
    
    int result = add(x, y);
    
    printf("Result: %d\n", result);
    
    return 0;
}
声明了一个函数add(),告诉编译器函数的名称、返回类型和参数列表。然后,在源文件中定义了这个函数,提供了具体的实现代码。在main()函数中,我们调用了add()函数,传递了两个实际参数xy,并将返回值赋值给变量result。最终,在main()函数中打印出result的值

函数的声明和定义可以分开进行,也可以合并在一起。如果函数的声明和定义在同一个源文件中,函数处于前方,可以省略函数的声明,直接定义函数即可。如果函数的声明和定义分开在不同的源文件中,需要在使用函数之前先进行函数的声明 。

这次先到这里的,下次会进行函数递归和数组的详细讲解的。谢谢大家!!!