江小南

V1

2022/11/27阅读:27主题:萌绿

【408篇】C语言笔记-第七章(函数)

第一节:函数的声明与定定义

1. 函数的声明与定义

函数间的调用关系是:由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意次。

#include "func.h"

int main() {
    int a=10;
    a=print_star(a);
    print_message();
    print_star(a);
    return 0;
}
#include "func.h"

int print_star(int i){
    printf("***************\n");
    printf("print_start %d\n",i);
    return i+3;
}

void print_message(){
    printf("how do you do\n");
    print_star(3);
}
#ifndef INC_7_1_STATEMENT_FUNC_H
#define INC_7_1_STATEMENT_FUNC_H
#include <stdio.h>
#include <stdlib.h>

int print_star(int i);
void print_message();
#endif //INC_7_1_STATEMENT_FUNC_H
F:\Computer\Project\practice\7\7.1-statement\cmake-build-debug\7_1_statement.exe
***************
print_start 10
how do you do
***************
print_start 3
***************
print_start 13

进程已结束,退出代码为 0

func.c是子函数print_star和print_message的实现,也称定义。main.c是main函数,func.h中存放的是标准头文件的声明和main函数中调用的两个子函数的声明。如果不在头文件中对使用的函数进行声明,那么在编译时会出现警告。

C语言编译和执行具有以下特点:

  1. 一个C程序由一个或多个程序模块组成,每个程序模块作为一个源程序文件。这样处理便于分别编写、分别编译、进而提高调试效率。一个源程序文件可以为多个C程序公用。

  2. 一个源程序文件由一个或多个函数及其他有关内容(如命令行,数据定义等)组成。一个源程序文件是一个编译单位

  3. C程序的执行是从main函数开始的,如果在main函数中调用其他函数,那么在调用后会返回到main函数中,在main函数中结束整个程序的运行。

  4. 所有函数都是平行的,即在定义函数时是分别进行的,并且是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。但函数间是可以互相调用的,即可以嵌套调用,但不能调用main函数,main函数时由系统调用的。

函数的声明与定义的差异:

  1. 函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等。它是一个完整的,独立的函数单位。

  2. 函数声明的作用是把函数的名字、函数类型及形参的类型、个数和顺序通知编译系统,以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。

隐式声明:函数如果不显示地声明返回类型,那么它默认返回整型。一般都需要显示声明。

2. 函数的分类

函数分为两种类型:

  1. 标准函数:即库函数,这是由系统提供的,用户不必自己定义的函数,可以直接使用他们。如printf函数,scanf函数。

  2. 用户自己定义的函数:用以解决用户的专门需要。分为无参函数和有参函数

第二节:函数的递归调用

函数自身调用自身的操作,称为递归函数,递归函数一定要有结束条件,否则会产生死循环。

使用递归在解决一些问题时,可以让问题变得简单,降低编程难度。

题目:假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n(n为正整数,可自行指定)个台阶有几种走法?

#include <stdio.h>

int step(int n){
    if(1==n || 2==n){  // 结束条件
        return n;
    }
    return step(n-1)+step(n-2);  // 公式
}
int main() {
    int n;
    int ret;
    scanf("%d",&n);
    ret=step(n);
    printf("step total=%d\n", ret);
    return 0;
}
F:\Computer\Project\practice\7\7.2-recursion\cmake-build-debug\7_2_recursion.exe
5
step total=8

进程已结束,退出代码为 0

方法步骤:找公式,写结束条件。

第三节:全局变量

1. 全局变量-形参-实参解析

在不同函数之间传递数据时,可以使用的方法如下:

  1. 参数:通过形式参数和实际参数。
  2. 返回值:用return语句返回计算结果。
  3. 全局变量:外部变量。

全局变量存储在数据段,所以main函数和print函数都是可见的。全局变量不会因为某个函数执行结束而消失,在整个进程的执行过程中是始终有效。工作中应尽量避免使用全局变量

如果局部变量和全局变量重名,那么将采取就近原则,即实际获取和修改的值是局部变量的值

全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟存储单元

关于形参与实参的一些说明:

  1. 定义函数中指定的形参,如果没有函数调用,那么他们并不占用内存中的存储单元,只有在发生函数调用时,形参才会被分配内存单元。调用结束后,形参所占的内存单元会被释放。

  2. 实参可以是常量,变量或者表达式,但要求他们有确定的值。

  3. 形参可以有多个,使用逗号隔开。同时指定形参的类型。

  4. 实参与形参的个数相等,类型相匹配,且实参与形参按照顺序对应,一一传递。

  5. 实参向形参数据传递是单向“值传递”,只能由实参传给形参。

  6. 形参相当于局部变量,因此不能在定义局部变量与参数同名。

2. 局部变量与全局变量

1. 局部变量

在一个函数内部定义的变量称为内部变量。它只在本函数范围内有效,即只有在本函数内才能使用这些变量,也称局部变量。

局部变量的有效范围是离自己最近的花括号

2. 外部变量

函数之外定义的变量称为外部变量。外部变量可以为文件中的其他函数共用,它的有效范围是从定义变量的位置开始到本源文件结束,所以也称全程变量。

C语言一般要求把程序中的函数做成一个封闭体,除可以通过“实参->形参”的渠道与外界发生联系外,没有其他渠道

分类:

后端

标签:

C#

作者介绍

江小南
V1