參考資料:高教版《全國計算機等級考試二級教程——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)擦酌。
函數的遞歸調用
函數的遞歸調用指的是:函數可以直接或間接地調用自己俱诸。前者稱簡單遞歸,后者稱間接遞歸赊舶。
一個問題要采用遞歸方法來解決睁搭,必須符合以下三個條件:
- 可以把要解的問題轉化為一個新的問題,這個新的問題的解法與原來的解法相同锯岖,只是所處理的對象有規(guī)律地遞增或遞減介袜。
- 可以應用這個轉化過程使問題得到解決甫何。
- 必須要有一個明確的結束遞歸的條件出吹。
例 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)將為該次調用的函數所用到的變量和形參開辟另外的存儲單元鸠珠。因此,遞歸調用的層次越多秋麸,同名變量所占用的存儲單元也就越多渐排。
注意:函數的遞歸調用通常會降低程序的運行效率。