2019-03-09 計算機二級C語言程序設計之對函數的進一步討論

參考資料:高教版《全國計算機等級考試二級教程——C語言程序設計》

傳給main函數的參數

可以在運行C 程序時胧卤,通過運行C程序的命令行把參數傳送給C程序勃黍。

main函數通臣伲可用兩個參數蜒犯,如:

main(int argc, char **argv);

其中argc和argv是兩個參數名,可由用戶自己命名硫戈,但它們的類型是固定的锰什。第一個參數必須是整型,第二個參數必須是一個指向字符型的指針數組的指針丁逝,這個字符型指針數組的每個指針都指向一個字符串汁胆。

因此,第二個參數argv還可以直接定義成基類型為字符型的指針數組:

char *argv[];

對包含以上主函數的霜幼、名為myc的文件進行編譯連接嫩码,生成名為myc.exe的可執(zhí)行文件后,即可在命令提示符下輸入命令“myc”來執(zhí)行該程序辛掠。這就成為命令行谢谦,myc即為執(zhí)行程序的命令。

這時argc中的值為1萝衩,argv[0]中將存放字符串“ myc”的首地址(即指向字符串 myc)回挽。

命令行中,各參數之間用空格符或tab符隔開猩谊,空格符不作為參數的內容千劈。

注:如果要把空格也作為參數的內容,應該把字符串放在一對雙引號內牌捷。

例1 若以下程序存放在myc.c文件中墙牌,在編譯連接后,生成一個myc.exe文件暗甥,輸出argc和argv中的數據喜滨。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;
    printf("argc = %d\n", argc);
    for(i = 1; i < argc; i++)
        printf("%s", argv[i]);
    printf("\n");
}

若在命令行中輸入:

myc A COMMAND LINE \n (\n代表回車鍵)

程序將輸出:

argc = 4
A COMMAND LINE

通過實參向函數傳遞函數名或指向函數的指針變量

指向函數指針變量的定義

在C語言中函數名代表該函數的入口地址,因此可以定義一種指向函數的指針來存放這種地址撤防。例如:

#include <stdio.h>
double fun(int a, int *p)
{
    ……
}
int main(void)
{
    double (*fp)(int, int *), y;
    int n;
    
    fp = fun;
    ……
    y = (*fp)(56, &n);  //此處通過指向函數的指針調用fun函數
    ……
}

在這里虽风,說明符(*fp)(int, int *)說明fp是一個指向函數的指針變量,這個函數必須是double類型寄月。

注意:若寫成fp(int, int )辜膝,則說明的fp就不是指針變量,而是說明fp是一個函數漾肮,該函數的返回值類型是基類型為double的指針類型**厂抖。

說明符后面一對圓括號中是類型名,用以說明所指函數的參數個數和參數的類型克懊,這些類型名應該與所指函數參數的類型一一對應忱辅。

注意:如果函數沒有形參七蜘,這一對圓括號也不可以省略。

表達式fp = fun把fun函數的地址賦予指針變量fp耕蝉,此處fp的類型必須與fun的類型相同崔梗。

語句y = (*fp)(56, &n);實現(xiàn)對函數fun的調用,它與y = fun(56, &n);等價垒在。

函數名或指向函數的指針變量作為實參

函數名或指向函數的指針變量可以作為實參傳遞給函數蒜魄。這時,對應的形參應當是類型相同的指針變量场躯。

例 2 通過給tran函數傳送不同的參數名谈为,求tan x和cot x的值。

#include <stdio.h>
#include <math.h>

double tran(double (*)(double), double (*)(double), double);    //函數說明語句

int main(void)
{
    double y, v;
    
    v = 60 * 3.1416 / 180.0;
    y = tran(sin, cos, v);              //第一次調用
    printf("tan (60) = %10.6f\n", y);
    
    y = tran(cos, sin, v);              //第二次調用
    printf("cot (60) = %10.6f\n", y);
    
    return 0;
}

double tran(double (*f1)(double), double (*f2)(double), double x)
{
    return (*f1)(x) / (*f2)(x);
}

函數tran有三個形參f1踢关,f2伞鲫,x。其中f1和f2是兩個指向函數的指針變量签舞,它們所指函數的返回值必須是double類型秕脓,所指函數有一個double類型的形參。第三形參x是double類型的簡單變量儒搭。

v的值是60°角的弧度吠架。

在第一次調用中,把庫函數sin的地址傳送給指針變量f1搂鲫,把庫函數cos的地址傳送給指針變量f2傍药,tran函數的返回值是sin(x) / cos(x)。

在第二次調用中魂仍,把庫函數cos的地址傳送給指針變量f1拐辽,把庫函數sin的地址傳送給指針變量f2,tran函數的返回值是cos(x) / sin(x)擦酌。

函數的遞歸調用

函數的遞歸調用指的是:函數可以直接或間接地調用自己俱诸。前者稱簡單遞歸,后者稱間接遞歸赊舶。

一個問題要采用遞歸方法來解決睁搭,必須符合以下三個條件:

  1. 可以把要解的問題轉化為一個新的問題,這個新的問題的解法與原來的解法相同锯岖,只是所處理的對象有規(guī)律地遞增或遞減介袜。
  2. 可以應用這個轉化過程使問題得到解決甫何。
  3. 必須要有一個明確的結束遞歸的條件出吹。

例 3 用遞歸的方法求n!

#include <stdio.h>

int fac(int n)
{
    int t;
    
    if(n == 1 || n ==0)
        return 1;
    else
    {
        t = n * fac(n - 1);
        return t;
    }
}

int main(void)
{
    int m, y;
    
    printf("Enter m:");
    scanf("%d", &m);
    
    if(m < 0)
        printf("Input data error!\n");
    else
    {
        y = fac(m);
        printf("\n%d! = %d\n", m, y);
    }
    
    return 0;
}

當函數自己調用自己時,系統(tǒng)將自動把函數中當前的變量和形參暫時保存起來辙喂,在新一輪的調用過程中捶牢,系統(tǒng)將為該次調用的函數所用到的變量和形參開辟另外的存儲單元鸠珠。因此,遞歸調用的層次越多秋麸,同名變量所占用的存儲單元也就越多渐排。

注意:函數的遞歸調用通常會降低程序的運行效率。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末灸蟆,一起剝皮案震驚了整個濱河市驯耻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炒考,老刑警劉巖可缚,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斋枢,居然都是意外死亡帘靡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門瓤帚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描姚,“玉大人,你說我怎么就攤上這事戈次⌒保” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵朝扼,是天一觀的道長赃阀。 經常有香客問我,道長擎颖,這世上最難降的妖魔是什么榛斯? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搂捧,結果婚禮上驮俗,老公的妹妹穿的比我還像新娘。我一直安慰自己允跑,他們只是感情好王凑,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聋丝,像睡著了一般索烹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弱睦,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天百姓,我揣著相機與錄音,去河邊找鬼况木。 笑死垒拢,一個胖子當著我的面吹牛旬迹,可吹牛的內容都是我干的。 我是一名探鬼主播求类,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奔垦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尸疆?” 一聲冷哼從身側響起椿猎,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寿弱,沒想到半個月后鸵贬,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡脖捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年阔逼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地沮。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗜浮,死狀恐怖,靈堂內的尸體忽然破棺而出摩疑,到底是詐尸還是另有隱情危融,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布雷袋,位于F島的核電站吉殃,受9級特大地震影響,放射性物質發(fā)生泄漏楷怒。R本人自食惡果不足惜蛋勺,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸠删。 院中可真熱鬧抱完,春花似錦、人聲如沸刃泡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烘贴。三九已至禁添,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桨踪,已是汗流浹背老翘。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酪捡。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像纳账,于是被迫代替她去往敵國和親逛薇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • 原文地址:C語言函數調用棧(一)C語言函數調用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數調用疏虫。當一個函數執(zhí)...
    小豬啊嗚閱讀 4,590評論 1 19
  • 指針是C語言中廣泛使用的一種數據類型永罚。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構卧秘; ...
    朱森閱讀 3,424評論 3 44
  • 參考資料:《全國計算機等級考試二級教程——C語言程序設計》《21天學通C語言》 庫函數 函數是什么 函數是已命名的...
    NoelleMu閱讀 1,130評論 0 0
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評論 1 51
  • 回公司途中呢袱,顛簸的公交車上,目睹天色漸暗翅敌,華燈初上羞福。聲啞唇干的,沒人有意愿說點什么蚯涮。 只有師傅仍鼓勵著大家治专,誰誰今...
    中間樹子閱讀 294評論 0 0