函數的由來:
程序 = 算法 + 數據
C程序 = 數據 + 函數
面向過程的程序設計:
首先將複雜的問題分解爲一個個容易解決的問題
分解過後的問題可以按照步驟一步步完成
函數是面向過程在C語言中的實現
解決問題的每個步驟可以用函數實現
函數聲明與函數定義:
聲明的意義在於告訴編譯器程序單元的存在
定義則明確指示程序單元的意義
C語言中通過extern進行程序單元的聲明
一些程序單元在聲明時可以忽略extern
我們來看下面代碼,體會聲明與定義的不同之處:
先定義一個test_O.c文件,定義一些變量和函數
#include <stdio.h>
int g_var = 10; //如果改爲:float g_var = 10, 則打印g_var的值將出現不確定的結果(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);
}
然後在test.c中使用這些變量和函數:
#include <stdio.h>
#include <malloc.h>
extern int g_var; //在外部定義,但未告訴編譯器是如何定義的。變量的定義伴隨着內存的分配,所以在這個地方並不會分配空間
extern struct Test; //在某些情況下,去掉extern也是可以的
int main()
{
extern void f(int i, int j);
extern int g(int x);
struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test)); //如果用p指向一片堆上的空間,則報錯
//因爲sizeof結構體類型的大小無法在這個文件中被確定
//我們無法依靠程序被編譯的順序來保證上面代碼的合理性
//報錯:invalid application of ‘sizeof’ to incomplete type ‘struct Test’ 未完全定義的結構體
printf("p = %p\n", p);
//g_var = 10; //error
printf("g_var = %d\n", g_var);
f(1, 2);
printf("g(3) = %d\n", g(3));
free(p);
return 0;
}
小結:
函數是面向過程思想在C語言中的體現
面向過程是由上至下分解問題的設計方法
程序中的定義和聲明完全不同
C語言中通過extern對程序單元進行聲明