linux c语言函数基础学习总结

本文介绍了Linux环境下C语言的基础知识,包括全局变量的声明与定义,使用extern关键字在不同源文件间共享,函数的声明、调用和定义,以及递归函数的概念和应用。强调了递归函数的终止条件和防止无限递归的重要性。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

linux c语言函数基础学习总结

前言

提示:以下是本篇文章正文内容,下面案例可供参考

变量

全局变量
定义在函数体外部的变量作用域:自定义开始到文件结束,一般默认为0
局部变量
定义在函数体内部的变量
作用域:自定义开始到最近的 } 结束

变量的声明:

在使用变量之前,需要声明变量的存在和类型。变量的声明会告诉编译器在内存中分配一个适当类型的空间来存储变量值。

变量的定义:

变量的定义是指为变量分配内存空间并可选择进行初始化。定义包括变量名和类型

例子如下;

// external_variables.h
extern int globalVariable;  // 声明全局变量的存在和类型

// main.c
#include <stdio.h>
#include "external_variables.h"

int main() {
    // 使用外部声明的全局变量
    printf("globalVariable 的值为:%d\n", globalVariable);

    return 0;
}

// external_variables.c
#include "external_variables.h"

int globalVariable = 100;  // 定义并初始化全局变量

在上面的示例中,我们将全局变量的声明放在名为external_variables.h的头文件中,并使用extern关键字声明其存在和类型。然后,在main.c中,我们包含了external_variables.h头文件,并在main()函数中使用了globalVariable变量。最后,在external_variables.c文件中,我们定义并初始化了globalVariable全局变量。

通过使用extern关键字,我们可以在不同的源文件中共享全局变量,使得全局变量在多个文件中可见和可访问。这在大型程序中非常常见,因为可以用于在不同的模块中共享数据。

需要注意的是,extern关键字只是声明了变量或函数的存在,并没有分配实际的内存空间。实际的定义和内存分配是在定义的文件中完成的。

自定义函数

函数声明

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

//函数声明
void menu(void); //void 空类型

调用函数

变量名=函数名(实际参数列表);
变量名=函数名(实际参数1,实际参数2,实际参数3);

 #include <stdio.h>

// 函数声明
int sum(int a, int b);  // 声明函数sum的存在和参数类型

int main() {
    int num1 = 10;
    int num2 = 20;
    int result;

    // 函数调用
    result = sum(num1, num2);

    printf("两数之和为:%d\n", result);

    return 0;
}

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

在上面的示例中,我们先在main()函数之前进行了函数声明,声明了函数sum的存在、参数的类型以及返回类型。然后,在main()函数中,我们定义了两个整型变量num1和num2,并通过调用sum()函数,将这两个变量作为参数传递给函数。函数执行完毕后,返回结果存储在变量result中,最后通过printf()函数打印出结果。

通过以上步骤,我们成功地调用了函数sum(),实现了求两个数之和的功能。

需要注意的是,在函数调用时,参数的顺序、类型和数量要与函数声明和定义中的参数匹配,以确保正确传递和使用参数。同时,函数的返回类型要与函数调用的上下文相匹配,以正确处理函数的返回值。

函数定义

函数是一个完成特定功能的代码模块,通常有参数,也可以没有参数;通常要求有返回值,也可以是空值。一般类型·如下
<数据类型> <函数名称> (<形式参数说明>)
{
语句序列;
return [(表达式)]
}
函数名称是一个标识符,要求符合标识符的命名规则。

数据类型是整个函数返回值的类型。这里可以包括存储类型说明符、数据类型说明符以及时间域说明符。如果函数不需要有返回值时,函数类型说明符可以写为void。

形式参数说明就是形式参数的列表,简称形参。形参可以是任意类型的变量,各参数之间用逗号分隔。在进行函数调用时,调用函数将赋予这些形式参数实际的值。

函数名后有一对花括弧。“t”中的内容称为函数体。函数体中有若干条语句(大于或等于零个),实现特定的功能。注意:在函数体中,表达式语句里使用的变量必须事先已有说明,否则不能使用。

return (<表达式>)]语句中表达式的值,要求和函数名前的数据类型保持一致。如果数据类型为void,可以省略,也可以写成“return;”。
例如,下面是一个很简单的函数定义。

库函数

引入头文件

#include <stdio.h>

调用库函数

在代码中,使用库函数名和适当的参数来进行函数调用。确保调用的参数类型和数量与库函数声明中的要求相符。

变量名=函数名(实际参数列表);
变量名=函数名(实际参数1,实际参数2,实际参数3);

递归函数

递归函数定义

递归函数是指在函数的定义中使用函数自身的技术。递归函数通过将一个大的问题分解为更小的子问题来解决问题
递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。递归函数调用的执行过程分为两个阶段。
递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件。回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。

以下是递归函数的定义格式:

return_type function_name(parameters) {
    // base case(基本情况)
    if (condition) {
        // 处理基本情况的代码
    }
    // recursive case(递归情况)
    else {
        // 处理递归情况的代码
        // function_name(parameters); // 调用自身
        // ...(其他代码)
    }
}

递归调用的形式

递归调用有两种形式:直接递归和间接递归。

直接递归:在直接递归中,函数直接调用自身。

void function() {
    // 其他代码
    function();  // 直接调用自身
    // 其他代码
}

直接递归的特点是函数直接调用自身。当达到递归终止条件时,递归将停止,避免无限递归的发生。需要注意的是,递归函数在每层递归调用中都会创建一个函数栈帧,占用系统栈空间。因此,如果递归深度过大,会导致栈溢出的问题

间接递归:在间接递归中,函数通过一系列的函数调用链来调用其他函数,最终又回过头来调用自身。

void function1() {
    // 其他代码
    function2();  // 调用另一个函数
    // 其他代码
}

void function2() {
    // 其他代码
    function1();  // 回过头来调用自身
    // 其他代码
}

间接递归的特点是函数之间形成一个调用链,最终又回到起始函数。通过这种调用链的方式,实现了函数之间的递归调用。

无论是直接递归还是间接递归,都需要在递归终止条件下,递归调用能够停止,以避免无限递归的问题。在编写递归函数时,务必确保递归终止条件的正确性和有效性,以确保递归的正确性和终止性。

递归的条件

使用递归时,需要考虑递归的终止条件,也称为递归基。终止条件决定了递归调用何时停止,以避免无限递归。
终止条件应满足以下几个要素:

基本情况:终止条件应描述一个最简单的情况,不需要继续递归调用,能够直接返回结果或执行特定的操作。

逐步靠近终止条件:每次递归调用都应使递归的输入参数向终止条件靠近,以确保在有限次递归之后达到终止条件。

能够处理最底层的问题:终止条件应对最小规模的问题进行处理,即到达一个规模足够小的问题时能够给出明确的结果。

总结

在学习中,更加明白了c语言基础的重要性,自己现在的掌握程度远远不够,需要继续把基础打扎实,多多复习,继续学习未掌握的部分。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值