第43课 - 函数的意义

第43课 - 函数的意义_面向过程

1. C语言中的函数

追溯一下C语言发展的历史,我们知道C语言在早期是用在科学计算上的,而科学计算就是使用各种算法处理数据

在C语言中就是使用函数实现算法。

第43课 - 函数的意义_编译器_02

2. 函数的意义

(1)模块化程序设计

第43课 - 函数的意义_面向过程_03

(2)C语言中的模块化 ==> 使用函数完成模块化编程

第43课 - 函数的意义_科学计算_04

3. 面向过程的程序设计

(1)面向过程是一种以过程(过程即解决问题的过程)为中心的编程思想。首先将复杂的问题分解为一个个容易解决的问题,分解过后的问题可以按照步骤一步步完成。

(2)函数是面向过程在C语言中的体现,解决问题的每个步骤可以用函数来实现。

4. 声明和定义

(1)声明的意义在于告诉编译器程序单元的存在

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

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

(4)一些程序单元在声明时可以省略extern,比如声明结构体的类型,extern struct Test <==> struct test

【声明和定义不同】

// global.c

#include <stdio.h>

int g_var = 10;
// float g_var = 10;

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>

// 声明,告诉编译器g_var在外部的文件中
extern int g_var;
// extern float g_var;


struct Test; // extern struct Test; extern可以省略

int main()
{
// 声明两个函数
extern void f(int,int);
extern int g(int);

struct Test* p = NULL; // 可以这样定义指针,,但是不能定义该结构体对用的变量

// struct Test* p = (struct Test*)malloc(sizeof(struct Test)); // error,因为在编译该文件时不知道struct Test的具体成员,也就不知道它的大小

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

//g_var = 10;

printf("g_var = %d\n", g_var); // 如果前面是 extern float g_varl; 这里打印垃圾值,浮点数和整型在内存中的存储方式不同

f(1, 2); // i + j = 3

printf("g(3) = %d\n",g(3)); // g(3) = 16

free(p);

return 0;
}