0:C語言程序是由什么來構(gòu)成草则?
C語言程序主要是由函數(shù)間的相互調(diào)用來構(gòu)成的。C語言中函數(shù)為核心鞍陨。
1. C語言中的函數(shù)
-
函數(shù)的由來
函數(shù)的由來
2. 函數(shù)的意義
-
模塊化程序設(shè)計
模塊化程序設(shè)計 -
C語言中的模塊化
C語言中的模塊化
3. 面向過程的程序設(shè)計
- 面向過程是一種以過程為中心的編程思想
- 首先將復(fù)雜的問題分解為一個個容易解決的問題
- 分解過后的問題可以按照步驟一步步完成
- 函數(shù)是面向過程在C語言中的體現(xiàn)
- 解決問題的每個步驟可以用函數(shù)來實現(xiàn)
4. 聲明和定義
- 聲明的意義在于告訴編譯器程序單元的存在帜矾,編譯器只是知道程序單元的存在嫉嘀,并不知道程序單元是如何存在。
- 定義則明確指示程序單元的意義,即指明了程序單元是如何存在。
- C語言中通過extern進行程序單元的聲明亏娜。
- 一些程序單元在聲明時可以省略extern。
程序說明:聲明和定義的不同
1.c
---
#include <stdio.h>
#include <malloc.h>
extern int g_var; // 聲明全局變量蹬挺, 告訴編譯器g_var是存在的维贺,并沒有告訴編譯器是如何存在的,即編譯器編譯到這一行時巴帮,編譯器知道了g_var存在溯泣,不需要給它分配空間,因為在其他的文件中已經(jīng)為g_var分配了空間榕茧。
extern struct Test; // 聲明結(jié)構(gòu)體
int main()
{
extern void f(int i, int j); // 聲明函數(shù)
extern int g(int x); // 聲明函數(shù)
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);
}
輸出結(jié)果:
p = (nil)
g_var = 10
i + j = 3
g(3) = 16
上面程序很好的演示了聲明和定義的方式垃沦;下面程序中將給p指針分配內(nèi)存空間,觀察輸出結(jié)果
#include <stdio.h>
#include <malloc.h>
extern int g_var; // 聲明全局變量雪猪, 告訴編譯器g_var是存在的栏尚,并沒有告訴編譯器是如何存在的,即編譯器編譯到這一行時只恨,編譯器知道了g_var存在译仗,不需要給它分配空間,因為在其他的文件中已經(jīng)為g_var分配了空間官觅。
extern struct Test; // 聲明結(jié)構(gòu)體
int main()
{
extern void f(int i, int j); // 聲明函數(shù)
extern int g(int x); // 聲明函數(shù)
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;
}
輸出結(jié)果:
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需要得到堆內(nèi)存中的一片連續(xù)內(nèi)存空間,這片連續(xù)空間的大小需要通過sizeof(struct Test)獲得休涤,struct Test為結(jié)構(gòu)體類型咱圆,struct Test在此文件中只聲明沒有定義,編譯器不知道struct Test的大小功氨。
總結(jié):
- 在C語言中序苏,變量的定義必然伴隨的內(nèi)存的分配。變量的聲明僅僅是告訴編譯器有這樣的標識捷凄,不會去分配內(nèi)存空間忱详。
- C編譯器在編譯時,不會依賴文件之間的編譯順序跺涤。
5. 小結(jié)
- 函數(shù)是面向過程思想在C語言中的體現(xiàn)匈睁;
- 面向過程是由上至下分解問題的設(shè)計方式;
- 程序中的定義和聲明完全不同桶错;
- C語言中通過過extern對程序單元進行聲明