函數(shù)

函數(shù)的學(xué)習(xí)不得不說(shuō)還是挺好用的,使代碼的編寫(xiě)更加清晰唤锉。不管別人如何,還是得做好自己的學(xué)習(xí)總結(jié)别瞭。

什么是函數(shù)窿祥,為什么要使用函數(shù)?

  • 函數(shù)是完成特定任務(wù)的獨(dú)立代碼單元蝙寨;
  • 降低復(fù)雜性晒衩,避免重復(fù)代碼段,限制了改動(dòng)帶來(lái)的影響墙歪,隱含順序听系,改進(jìn)性能,
  • 進(jìn)行集中控制虹菲,隱含數(shù)據(jù)結(jié)構(gòu)靠胜,隱含指針操作,隱含全局變量毕源。
    我們可以對(duì)函數(shù)進(jìn)行調(diào)用浪漠,這樣避免了我們一大串代碼寫(xiě)在一個(gè)main函數(shù)中。

C語(yǔ)言中對(duì)函數(shù)的分類(lèi)霎褐,下面來(lái)簡(jiǎn)單總結(jié)一下郑藏。

有無(wú)返回值參數(shù)就不多說(shuō)了。void main 無(wú)返回值瘩欺,不過(guò)老師不建議使用無(wú)返回值的函數(shù),具體原因自己也不太清楚拌牲,待會(huì)可以百度一下俱饿;int main 有返回值。

形式參數(shù)和實(shí)際參數(shù)

  • 形參出現(xiàn)在函數(shù)定義中塌忽,在整個(gè)函數(shù)體內(nèi)都可以使用拍埠,離開(kāi)該函數(shù)則不能使用(如31行中的,a土居、b)枣购;
  • 實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)中也不能使用(如43行的m、n),實(shí)參可以是常量运准、變量胚膊、表達(dá)式、函數(shù)等分瘾,
  • 在進(jìn)行函數(shù)調(diào)用時(shí)胎围,都必須具有確定的值,以便把值傳給形參德召;
  • 實(shí)參和形參在數(shù)量上白魂、類(lèi)型上、順序上應(yīng)嚴(yán)格一致上岗,否則會(huì)報(bào)錯(cuò)(類(lèi)型不匹配)
  • 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的福荸,只能把實(shí)參的值傳送給形參,在函數(shù)調(diào)用過(guò)程中肴掷,形參的值發(fā)生改變敬锐,實(shí)參的值不改變。

函數(shù)的返回值

函數(shù)的返回值只能通過(guò)return語(yǔ)句返回主調(diào)函數(shù)
return 語(yǔ)句的一般形式為:
return 表達(dá)式捆等;或 return (表達(dá)式)滞造;

函數(shù)的調(diào)用

在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的
C語(yǔ)言中函數(shù)調(diào)用的一般形式
函數(shù)名 (實(shí)際參數(shù)表) //無(wú)參函數(shù)則無(wú)實(shí)際參數(shù),如果有多個(gè)參數(shù)則用逗號(hào)隔開(kāi)栋烤。

int sum(int *a,int n)
    {
        int sum=0;
        int i;
        for (i = 0; i < n; ++i)
        {
            sum+=a[i];
        }
        return sum;
    }
int main(int argc, char const *argv[])
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int s=0;
    s=sum(a,10);
    printf("累加結(jié)果為:%d\n",s );
    return 0;
}

函數(shù)的調(diào)用還是挺好用的谒养,使函數(shù)的結(jié)構(gòu)更加清晰,避免出錯(cuò)明郭。

被調(diào)函數(shù)的聲明和函數(shù)原型:

  • 在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行聲明买窟,這于使用變量之前對(duì)變量進(jìn)行變量說(shuō)明是一樣的。目的是使辨析系統(tǒng)知道 被調(diào)函數(shù)的返回值類(lèi)型薯定。
  • 其一般形式為
    類(lèi)型說(shuō)明符 被調(diào)函數(shù)名(類(lèi)型 形參始绍,類(lèi)型 形參,......);
    或者
    類(lèi)型說(shuō)明符 被調(diào)函數(shù)名(類(lèi)型话侄,類(lèi)型.........)亏推;

C語(yǔ)言中規(guī)定以下幾種情況可以省去聲明;

1:被調(diào)函數(shù)的返回值是整型或字符型年堆,可以不對(duì)被調(diào)函數(shù)聲明吞杭;
2:被調(diào)函數(shù)聲明在主調(diào)函數(shù)之前
3:在所有函數(shù)之前預(yù)先說(shuō)明了各個(gè)函數(shù)的類(lèi)型
4:對(duì)庫(kù)函數(shù)的調(diào)用不需要再做說(shuō)明,但是必須把該函數(shù)的頭文件用include命令包含变丧。

函數(shù)的嵌套調(diào)用:

  • C語(yǔ)言不允許嵌套定義函數(shù)芽狗,但是允許在一個(gè)函數(shù)的定義中出現(xiàn)另一個(gè)函數(shù)。這樣就出現(xiàn)了函數(shù)函數(shù)嵌套調(diào)用痒蓬。
    計(jì)算 s=(22)!+(33)!

函數(shù)的遞歸調(diào)用:

  • 一個(gè)函數(shù)在它的主體中調(diào)用他的自身稱(chēng)為遞歸調(diào)用童擎。這種函數(shù)稱(chēng)為遞歸函數(shù)滴劲。
    執(zhí)行的過(guò)程中將反復(fù)調(diào)用自身,每調(diào)用一次都進(jìn)入新的一層顾复。
long jiecheng(int n)
{
    long ret = -1;
    if(n<0)
        printf("n<0,input error\n");
    else if(n==0||n==1)
        ret = 1;
    else
        ret = jiecheng(n-1)*n;
}
int main()
{
    int n;
    long y;
    printf("input a intrager number:\n");
    scanf("%d",&n);
    y=jicheng(n);
    printf("%d!=%ld\n",n,y);
    return 0;
}

這是一個(gè)求階層的問(wèn)題班挖,其中使用到了函數(shù)的遞歸調(diào)用。其中的ret=jieceng(n-1)*n這里捕透。

數(shù)組作為函數(shù)的參數(shù)

數(shù)組可以作為函數(shù)的參數(shù)使用聪姿,進(jìn)行數(shù)據(jù)傳送。數(shù)組作為函數(shù)參數(shù)有兩種形式乙嘀,一種是把數(shù)組元素作為實(shí)參使用末购;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。

數(shù)組作為函數(shù)的參數(shù)

  • 數(shù)組可以作為函數(shù)的參數(shù)使用虎谢,進(jìn)行數(shù)據(jù)傳送盟榴。數(shù)組作為函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素作為實(shí)參使用婴噩;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用擎场。
    判斷一個(gè)整型數(shù)組中個(gè)元素的值,如果大于0几莽,則輸出該值迅办,否則輸出0,
    1:數(shù)組元素作為實(shí)際參數(shù)時(shí)章蚣,數(shù)組元素的類(lèi)型和函數(shù)形參的類(lèi)型保持一致站欺,這時(shí)數(shù)組元素是一個(gè)普通變量。
    數(shù)組名作為函數(shù)參數(shù)時(shí)纤垂,要求形參和實(shí)參都必須是類(lèi)型相同的矾策。
    2:數(shù)組元素做函數(shù)參數(shù)時(shí),形參和實(shí)參是由編譯器分配的兩個(gè)不同的內(nèi)存單元峭沦,在函數(shù)調(diào)用時(shí)發(fā)生的值傳遞是把實(shí)參變量賦予形參變量贾虽。
    在用數(shù)組名做函數(shù)參數(shù)時(shí),不是進(jìn)行值傳送吼鱼,即不是把參數(shù)組的每一個(gè)元素的值都賦予形參組的各個(gè)元素蓬豁。因?yàn)閷?shí)際形參數(shù)組并不存在,編譯數(shù)組并不為形參數(shù)組分配內(nèi)存菇肃。數(shù)組名就是數(shù)組的首地址地粪,。數(shù)組做函數(shù)參數(shù)時(shí)說(shuō)進(jìn)行的傳送只是地址的傳送巷送,也就是說(shuō)把實(shí)參數(shù)組的首地址賦給形參數(shù)組名,形參數(shù)組名取得改首地址后矛辕,也就等于有了實(shí)在的數(shù)組笑跛。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組付魔,共同擁有一段空間。

局部變量和全局變量

  • 局部變量也稱(chēng)為內(nèi)部變量飞蹂,局部變量是在函數(shù)內(nèi)定義的几苍,其作用域僅限于函數(shù)內(nèi),離開(kāi)該函數(shù)后再使用這種變量是非法的陈哑。
    注意:
    1:主函數(shù)中定義的變量也只能在主函數(shù)中使用
    2:形參變量是屬于被調(diào)函數(shù)的局部變量妻坝,實(shí)參變量屬于主調(diào)函數(shù)
    3:允許在不同的函數(shù)中使用相同的變量名;
    4:在復(fù)合語(yǔ)句中定義的變量惊窖,作用域僅限于復(fù)合語(yǔ)句中刽宪。

  • 全局變量也稱(chēng)為外部變量,它是在函數(shù)外部定義的界酒;他不從屬于哪個(gè)函數(shù)圣拄,他屬于一個(gè)程序源文件。其作用域是整個(gè)源程序毁欣。

*局部變量會(huì)屏蔽全局變量庇谆。

變量的存儲(chǔ)類(lèi)別:

  • 動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式
    從變量值的生存期來(lái)劃分可分為,靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式凭疮。
    靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式饭耳。
    動(dòng)態(tài)存儲(chǔ)方式是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)分配存儲(chǔ)空間的方式。
    用戶(hù)存儲(chǔ)空間可以分為三部分:
    (1)程序區(qū)
    (2)靜態(tài)數(shù)據(jù)區(qū)
    (3)動(dòng)態(tài)數(shù)據(jù)區(qū)
    全局變量存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)执解,程序開(kāi)始時(shí)分配寞肖,結(jié)束時(shí)釋放,占據(jù)固定單元材鹦。
  • 動(dòng)態(tài)存儲(chǔ)區(qū)存放以下數(shù)據(jù):
    函數(shù)形參逝淹,
    自動(dòng)變量(未加static修飾的局部變量),
    函數(shù)調(diào)用的現(xiàn)場(chǎng)保護(hù)和返回地址桶唐。

static聲明局部變量

  • 有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用后不消失而保留原值栅葡,這使就指定局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static聲明尤泽。

  • 對(duì)靜態(tài)局部變量的說(shuō)明:
    局部變量屬于靜態(tài)存儲(chǔ)類(lèi)別欣簇,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配單元,整個(gè)程序運(yùn)行期間都不釋放坯约。
    靜態(tài)局部變量在編譯時(shí)賦值熊咽,只賦值一次;
    不賦初值的話闹丐,編譯器默認(rèn)符0横殴;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衫仑,更是在濱河造成了極大的恐慌梨与,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件文狱,死亡現(xiàn)場(chǎng)離奇詭異粥鞋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瞄崇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)呻粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苏研,你說(shuō)我怎么就攤上這事等浊。” “怎么了楣富?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵凿掂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纹蝴,道長(zhǎng)庄萎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任塘安,我火速辦了婚禮糠涛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兼犯。我一直安慰自己忍捡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布切黔。 她就那樣靜靜地躺著砸脊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纬霞。 梳的紋絲不亂的頭發(fā)上凌埂,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音诗芜,去河邊找鬼瞳抓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伏恐,可吹牛的內(nèi)容都是我干的孩哑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翠桦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼横蜒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丛晌,失蹤者是張志新(化名)和其女友劉穎鹰霍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茵乱,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年孟岛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓶竭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠羞,死狀恐怖斤贰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情次询,我是刑警寧澤荧恍,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站屯吊,受9級(jí)特大地震影響送巡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盒卸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一骗爆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔽介,春花似錦摘投、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至薇组,卻和暖如春外臂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背体箕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工专钉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人累铅。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓跃须,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親娃兽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菇民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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