第七章 函數(2)

將結構作爲函數的參數就比數組簡單多了,基本就跟其他數據類型差不多了,在這種情況下,函數也是是由原始結構的複本。


有的時候結構本身比較大,這個時候將結構的地址(&struct)而不是結構本身傳遞給函數,這個時候函數頭或者函數原型就要把形參聲明爲指針類型struct *struct,如果不想改變結構,還得前面加上const,這樣形參就是const struct *struct


也可以將string作爲參數傳遞給函數,這個時候函數的形參就是一個string類。這個也很簡單,跟傳其他數據類型一樣。


同理,array也是一個類,也可以作爲參數傳遞給函數,用法跟普通變量一樣,用戶可以選擇直接傳遞array對象或者傳遞他的地址


瞭解了函數之後就可以運用遞歸了,就是一個函數調用自己。如果遞歸函數調用自己,則被調用的函數也就調用自己,這將無限循環下去,通常做法是將遞歸函數調用放在if語句中,來設置終止遞歸的條件. 

遞歸理解起來不難,看書中的兩個例子就能明白。有了遞歸之後就可以是實現很多算法,如著名的移動塔羅牌。怎麼設計這個遞歸函數就是一門很大學問了。


最後我們來看看函數指針。與數據相似,函數也有地址。可以編寫將另一函數地址作爲參數的函數,這樣第一個函數將能夠找到第二個函數,並運用它。具體有什麼好處,現在還體會不出來。。。先知道有這麼一個東西存在吧

首先講獲取函數的地址:只要使用函數名即可,注意不要跟着參數。

例如一個函數fun(),fun就是函數的地址,

然後怎麼聲明函數指針來,舉個例子

double pam(int); //一個傳遞int參數返回double的函數

那它的指針要這樣聲明和賦值

double (*pf) (int);

*pf = pam;

注意一點要把*pf括起來,要不就是聲明瞭一個返回double*的新函數pf。

聲明瞭指針函數之後就可以使用指針來調用函數,接着上例:

double x = pam(4);

double y = (*pf) (5);


如果要把上例中的函數指針作爲另一個函數的參數,函數原型應該這樣寫

void estimate(int lines, double (*pf) (int));

調用的時候就是estimate(line_input, pam);


本章剩下一點稍微深入探討了函數指針,但也沒怎麼看出來函數指針的作用,這裏就不多說了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章