43_函數的意義

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對程序單元進行聲明
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容