第43课 函数的意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第43课 函数的意义相关的知识,希望对你有一定的参考价值。

1. C语言中的函数

(1)函数的由来:

  程序 = 数据 + 算法    →   C程序 = 数据 + 函数

(2)模块化程序设计

技术分享 

(3)C语言中的模块化

技术分享 

2. 面向过程的程序设计

(1)面向过程是一种以过程为中心的编程思想

(2)首先将复杂的问题分解为一个个容易解决的问题

(3)分解过后的问题可以按照步骤一步步完成

(4)函数面向过程在C语言中的体现

(5)解决问题的每个步骤可以用函数来实现

3. 声明和定义

(1)声明的意义在于告诉编译器程序单元以下均指变量或函数的存在

(2)定义则明确指示程序单元的意义

(3)C语言中通过extern进行程序单元的声明。

(4)一些程序单元在声明时可以省略extern(如结构体)

(5)严格意义上的声明和定义并不相同

【实例分析】声明和定义不同

//global.c ——注意不是头文件

#include <stdio.h>

float g_var = 10.0f; //注意,这里定义为float型的

struct Test
{
    int x;
    int y;
};

void f(int i,int j)
{
    printf("i + j = %d\\n",i + j);
}

int g(int x)
{
    return (int)( 2 * x + g_var); //在本文件中g_var以float型处理
}

//43-1.c

#include <stdio.h>
#include <malloc.h>

//这里只是声明,告诉编译器该全局变量在外部的global.c文件己经存在!(注意,不是头文件)
extern int g_var;  //注意,这里声明为int。但外部定义为float型。在处理这个.c文件时,编译器会处g_var当成整型来处理,但实际上内存中是以float存储的!
                   //这里声明为int是为了说明,声明和定义是不同的!

struct Test; //在global.c文件中,对于结构体声明无须加extern。

int main()
{
    extern void f(int,int); //这里只是声明,相当于告诉编译器,这个函数在外部文件中己经存在。

    extern int g(int);

    struct Test* p = NULL; //这里合法的

    //这里是错误的,因为结构体是在外部定义的,虽然在编译global.c时编译器是知道这个结构体的大小的。
    //但由于文件是分别编译的,编译只会按本文件中定义的类型来编译。由于本文件中找不到他的定义//所以也就无法知道该结构体实际的大小,因此会报错。这就是声明和定义的区别!
    //struct Test* p = (struct Test*)malloc(sizeof(struct Test));//编译器提示这是一个不完全的类型

    printf("p = %p\\n", p);

    //g_var = 10;  //这里可以取消注释来观察g_var值的变化!

    printf("g_var = %d\\n", g_var);//会把内存中浮点型的g_var当成int型来处理!

    f(1, 2);
   
    printf("g(3) = %d\\n",g(3)); //g()函数(在global.c中),把g_var当成float型处理。

    free(p);

    return 0;
}

4. 小结

(1)函数是面向过程思想在C语言中的体现

(2)面向过程是由上至下分解问题的设计方法

(3)程序中的定义和声明完全不同

(4)C语言中通过extern对程序单元进行声明

以上是关于第43课 函数的意义的主要内容,如果未能解决你的问题,请参考以下文章

第43课 继承的概念和意义

第43课 继承的概念及意义

第39课 程序中的三国天下

第56课.函数模板的概念和意义

数据--第20课-递归的应用实战二

第56课 函数模板的概念和意义