0:C語言程序是由什么來構成?
C語言程序主要是由函數間的相互調用來構成的。C語言中函數為核心。
1. C語言中的函數
-
函數的由來
函數的由來
2. 函數的意義
-
模塊化程序設計
模塊化程序設計 -
C語言中的模塊化
C語言中的模塊化
3. 面向過程的程序設計
- 面向過程是一種以過程為中心的編程思想
- 首先將復雜的問題分解為一個個容易解決的問題
- 分解過后的問題可以按照步驟一步步完成
- 函數是面向過程在C語言中的體現
- 解決問題的每個步驟可以用函數來實現
4. 聲明和定義
- 聲明的意義在于告訴編譯器程序單元的存在,編譯器只是知道程序單元的存在,并不知道程序單元是如何存在。
- 定義則明確指示程序單元的意義,即指明了程序單元是如何存在。
- C語言中通過extern進行程序單元的聲明。
- 一些程序單元在聲明時可以省略extern。
程序說明:聲明和定義的不同
1.c
---
#include <stdio.h>
#include <malloc.h>
extern int g_var; // 聲明全局變量, 告訴編譯器g_var是存在的,并沒有告訴編譯器是如何存在的,即編譯器編譯到這一行時,編譯器知道了g_var存在,不需要給它分配空間,因為在其他的文件中已經為g_var分配了空間。
extern struct Test; // 聲明結構體
int main()
{
extern void f(int i, int j); // 聲明函數
extern int g(int x); // 聲明函數
struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test));
printf("p = %p\n", p);
//g_var = 10;
printf("g_var = %d\n", g_var);
f(1, 2);
printf("g(3) = %d\n", g(3));
free(p);
return 0;
}
---
global.c
---
#include <stdio.h>
int 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);
}
輸出結果:
p = (nil)
g_var = 10
i + j = 3
g(3) = 16
上面程序很好的演示了聲明和定義的方式;下面程序中將給p指針分配內存空間,觀察輸出結果
#include <stdio.h>
#include <malloc.h>
extern int g_var; // 聲明全局變量, 告訴編譯器g_var是存在的,并沒有告訴編譯器是如何存在的,即編譯器編譯到這一行時,編譯器知道了g_var存在,不需要給它分配空間,因為在其他的文件中已經為g_var分配了空間。
extern struct Test; // 聲明結構體
int main()
{
extern void f(int i, int j); // 聲明函數
extern int g(int x); // 聲明函數
struct Test* p = (struct Test*)malloc(sizeof(struct Test));
printf("p = %p\n", p);
//g_var = 10;
printf("g_var = %d\n", g_var);
f(1, 2);
printf("g(3) = %d\n", g(3));
free(p);
return 0;
}
輸出結果:
1.c:13:47: error: invalid application of ‘sizeof’ to incomplete type ‘struct Test’
struct Test* p = (struct Test*)malloc(sizeof(struct Test));
出錯原因:編譯器編譯到p指針時,p需要得到堆內存中的一片連續內存空間,這片連續空間的大小需要通過sizeof(struct Test)獲得,struct Test為結構體類型,struct Test在此文件中只聲明沒有定義,編譯器不知道struct Test的大小。
總結:
- 在C語言中,變量的定義必然伴隨的內存的分配。變量的聲明僅僅是告訴編譯器有這樣的標識,不會去分配內存空間。
- C編譯器在編譯時,不會依賴文件之間的編譯順序。
5. 小結
- 函數是面向過程思想在C語言中的體現;
- 面向過程是由上至下分解問題的設計方式;
- 程序中的定義和聲明完全不同;
- C語言中通過過extern對程序單元進行聲明