第八章 程序的結(jié)構(gòu)

思考如何去學(xué)習(xí)一章新的知識(shí)呢?华糖?麦向??客叉?

  • 這章主要講的是什么呢诵竭?
    1.數(shù)據(jù)如何傳給函數(shù)
    2.函數(shù)如何返回結(jié)果
    3.如何定義自己的函數(shù)
    4.函數(shù)原型的概念和使用場(chǎng)合
    5.函數(shù)使用指針參數(shù)的優(yōu)勢(shì)

將程序分成適度的自包含單元是開發(fā)任一程序的基本方式

8.1 程序的結(jié)構(gòu)

8.1.1 變量的作用域和生存期

  • 變量在一個(gè)塊內(nèi)聲明時(shí)創(chuàng)建话告,在這個(gè)塊結(jié)束時(shí)銷毀,這種變量稱為自動(dòng)變量
  • 給定變量可以在某個(gè)程序代碼塊中訪問和引用卵慰,這個(gè)程序代碼塊稱為變量的作用域
  • 變量存在的時(shí)間稱為變量的生存期

8.1.2 變量的作用域和函數(shù)

8.2 函數(shù)

8.2.1 定義函數(shù)

函數(shù)頭定義了函數(shù)的名稱沙郭、函數(shù)的參數(shù)、函數(shù)返回值的類型

函數(shù)的一般形式如下所示:

Return_type  Function_name(Parameters-separated by commas )  參數(shù)用逗號(hào)分開
{
//statements.....
}

術(shù)語“變?cè)北硎菊{(diào)用函數(shù)時(shí)提供的對(duì)應(yīng)于參數(shù)的值

調(diào)用函數(shù)的一般形式:

Function_name(List of Arguments - separated by commas) 以逗號(hào)分隔的參數(shù)列表

1函數(shù)的命名

  • 在函數(shù)名稱中用下劃線字符分開每個(gè)單詞
  • 將每個(gè)單詞的第一個(gè)字母大寫
  • 將除第一個(gè)單詞之外的每個(gè)單詞的第一個(gè)字母大寫

2 函數(shù)的參數(shù)

出現(xiàn)問題的時(shí)候怎么解決問題

函數(shù)頭 說明
bool SendMessage(char*text) 該函數(shù)有一個(gè)參數(shù)text,其類型是char指針類型裳朋,該函數(shù)返回一個(gè)bool類型的值病线。
void PrintData(int count, double *data) 該函數(shù)有兩個(gè)參數(shù),一個(gè)是int類型的鲤嫡,另一個(gè)是double指針類型氧苍,該函數(shù)沒有返回值
int SumIt(int x[], size_t n) 該函數(shù)的第一個(gè)參數(shù)是一個(gè)int []類型的數(shù)組,第二個(gè)參數(shù)把數(shù)組的元素指定為一個(gè)size_t類型的值泛范。該函數(shù)返回一個(gè)int 類型的值。
char message GetMessage(void) 這個(gè)函數(shù)沒有參數(shù)紊撕,返回一個(gè)char*類型的指針
  • 函數(shù)的參數(shù)是一列變量名稱和它們的類型罢荡,參數(shù)之間以逗號(hào)分隔。
    參數(shù)提供了調(diào)用函數(shù)給被調(diào)用函數(shù)傳遞信息的方法对扶。
    調(diào)用函數(shù)是給它們指定的值稱為“變?cè)?/li>

3 指定返回值的類型

  • 常見函數(shù)的形式如下:
Return_type  Function_name(List of Paramters - separated by commas)
{
//statements.....
}
  • 返回值可以指定為c語言中任意合法的類型: 枚舉類型和指針区赵。

  • 希望能返回一個(gè)能靈活返回指向各種類型的地址時(shí),可以使用void*的返回類型:即指向void的指針浪南,返回值是一個(gè)地址值笼才,但沒有指定返回類型。

8.2.2 Return 語句

  1. return 語句最簡(jiǎn)潔的形式是:返回類型聲明為void的函數(shù)络凿,它不返回任何值骡送。
return ;

2.較常見的return 語句形式是:返回類型沒有聲明為void的函數(shù),返回給調(diào)用程序的值是計(jì)算expression的結(jié)果絮记。

return expression

8.3 按值傳遞機(jī)制

給函數(shù)傳送變?cè)獣r(shí)摔踱,變?cè)挡粫?huì)直接傳遞給函數(shù),而是先制作變?cè)档酶北驹狗撸鎯?chǔ)在棧上派敷,再使這個(gè)副本可用于函數(shù),而不是使用初始值
這個(gè)機(jī)制是C語句中的所有的變?cè)祩鬟f給函數(shù)的方式撰洗,稱為按值傳遞機(jī)制
pass - by -value mechanism

8.4 函數(shù)原型

  • 函數(shù)原型是一個(gè)定義函數(shù)基本特性的語句篮愉,它定義了函數(shù)的名稱、返回值的類型和每個(gè)參數(shù)的類型差导,與函數(shù)頭相比试躏,要在函數(shù)原型的后面加上分號(hào)。
    函數(shù)聲明也叫函數(shù)原型设褐,因?yàn)楹瘮?shù)原型提供了函數(shù)的所有的外部規(guī)范冗酿。
    在程序中包含頭文件時(shí)埠对,這個(gè)頭文件會(huì)在程序中為庫函數(shù)添加函數(shù)原型。

  • 參數(shù)類型double*等價(jià)于函數(shù)定義中參數(shù)類型double[]裁替。
    函數(shù)是如何定義的呢项玛??弱判?

  • 最好總是把函數(shù)的聲明放在程序的源文件中襟沮。
    main()函數(shù)不需要定義函數(shù)原型。
代碼一:
//  #include & #define directives ....
int main()
{
      //code in main() ...
{

double Average(double x[ ], size_t n)
{
    // return sum(x,n)/n;
}

double sum(double x[], size_t  n)
{
    // statements
}

size_t GetData(double *data, size_t max_count)
{
    //statements
}

源文件:
函數(shù)原型:

  • 函數(shù)原型放在源文件的開頭處昌腰,而且在所有函數(shù)的定義和頭文件之前
    在源文件中开伏,函數(shù)原型在所有函數(shù)的外部,函數(shù)的作用是從其聲明處開始一直到源文件的結(jié)尾遭商。
代碼二:
//#include &#define directives ....

//funcation prototypes
double Average(double data_values[], size_t count);
double Sum(double *x , size_t n);
size_t  GetData(double*, size_t);

int main(void)
{
    // Code in main() ...
}

//Definitions for Average( ), sum( ) and GetData( ) ....

8.5 指針用作參數(shù)和返回值

8.5.1 常量參數(shù)

  • 將const關(guān)鍵字應(yīng)用于指針參數(shù)固灵,指定函數(shù)不修改該變?cè)赶虻闹?/li>
bool  SendMessage(const  char* pmessage)
{
    //code to send the message
    return true;
}

參數(shù)pmessage的類型是指向const char 的指針
把const 關(guān)鍵字放在開頭,指定被指向數(shù)據(jù)是常量劫流。

指針的指針參數(shù)(參數(shù)是指向指針的指針時(shí))巫玻,const的一種用途
不能把指針指向const,但可以把(指針指向的指針)指定為const祠汇,防止修改指針指向的內(nèi)容

void sort(const char** str, size_t n)

參數(shù)const char** str是指向const char 的指針的指針類型

第二種const的可能用途是

void replace(char *const * str, size_t n);

參數(shù) char *const * str 是指向char的常量指針的指針

第三種const可能的用途

size_t max_length(const char* const* str , size_t  n)

第一個(gè)參數(shù)const char* const* str是指向const char的常量指針的指針類型仍秤。

8.5.2 返回指針的風(fēng)險(xiǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市可很,隨后出現(xiàn)的幾起案子诗力,更是在濱河造成了極大的恐慌,老刑警劉巖我抠,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苇本,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菜拓,警方通過查閱死者的電腦和手機(jī)圈澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尘惧,“玉大人康栈,你說我怎么就攤上這事∨绯龋” “怎么了啥么?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贰逾。 經(jīng)常有香客問我悬荣,道長,這世上最難降的妖魔是什么疙剑? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任氯迂,我火速辦了婚禮践叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚼蚀。我一直安慰自己禁灼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布轿曙。 她就那樣靜靜地躺著弄捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪导帝。 梳的紋絲不亂的頭發(fā)上守谓,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音您单,去河邊找鬼斋荞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虐秦,可吹牛的內(nèi)容都是我干的平酿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼羡疗,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了别洪?” 一聲冷哼從身側(cè)響起叨恨,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挖垛,沒想到半個(gè)月后痒钝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痢毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年送矩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪替。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋荸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凭舶,到底是詐尸還是另有隱情晌块,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布帅霜,位于F島的核電站匆背,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏身冀。R本人自食惡果不足惜钝尸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一括享、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧珍促,春花似錦铃辖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沐悦,卻和暖如春成洗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏否。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瓶殃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人副签。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓遥椿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淆储。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冠场,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,517評(píng)論 1 51
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,310評(píng)論 0 6
  • 1.寫一個(gè)NSString類的實(shí)現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,767評(píng)論 2 37
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型本砰。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一碴裙。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,444評(píng)論 3 44
  • 多多是一只拉布拉多点额,現(xiàn)在9個(gè)月了舔株。先生非常喜歡狗,一直就想我們自己住了之后就養(yǎng)一只狗狗还棱,于是2016年十二月份载慈,多...
    笨笨小小豬閱讀 229評(píng)論 0 3