C語言程序設(shè)計(jì)(第6章指針)8

字號(hào):

6.8 main函數(shù)的參數(shù)
     C程序大的特點(diǎn)就是所有的程序都是用函數(shù)來裝配的。main( )稱之為主函數(shù),是所有程序運(yùn)行的入口。其余函數(shù)分為有參或無參兩種,均由main( )函數(shù)或其它一般函數(shù)調(diào)用,若調(diào)用的是有參函數(shù),則參數(shù)在調(diào)用時(shí)傳遞。
    main( )
    {
     . . .
     y1 = f1(x1, x2);
     . . .
    }
    f1(int a,int b)
    {
     . . . .
     Y 2 = f 2 ( x 3 , x 4 ) ;
     . . . .
    }
    f2( int m,int n)
    {
     . . . .
     . . . . .
    }
     在前面課程的學(xué)習(xí)中,對(duì)main( )函數(shù)始終作為主調(diào)函數(shù)處理,也就是說,允許main( )調(diào)用其它函數(shù)并傳遞參數(shù)。事實(shí)上, main( )函數(shù)既可以是無參函數(shù),也可以是有參的函數(shù)。對(duì)于有參的形式來說,就需要向其傳遞參數(shù)。但是其它任何函數(shù)均不能調(diào)用main( )函數(shù)。當(dāng)然也同樣無法向main( )函數(shù)傳遞,只能由程序之外傳遞而來。這個(gè)具體的問題怎樣解決呢?
    我們先看一下main( )函數(shù)的帶參的形式:
    main(argc, argv)
    int argc,char * argv[];
    {
     . . . . .
    }
     從函數(shù)參數(shù)的形式上看,包含一個(gè)整型和一個(gè)指針數(shù)組。當(dāng)一個(gè)C的源程序經(jīng)過編譯、鏈接后,會(huì)生成擴(kuò)展名為. E X E的可執(zhí)行文件,這是可以在操作系統(tǒng)下直接運(yùn)行的文件,換句話說,就是由系統(tǒng)來啟動(dòng)運(yùn)行的。對(duì)main( )函數(shù)既然不能由其它函數(shù)調(diào)用和傳遞參數(shù),就只能由系統(tǒng)在啟動(dòng)運(yùn)行時(shí)傳遞參數(shù)了。
     在操作系統(tǒng)環(huán)境下,一條完整的運(yùn)行命令應(yīng)包括兩部分:命令與相應(yīng)的參數(shù)。其格式為:
     命令參數(shù)1 參數(shù)2 . . . .參數(shù)n¿
     此格式也稱為命令行。命令行中的命令就是可執(zhí)行文件的文件名,其后所跟參數(shù)需用空格分隔,并為對(duì)命令的進(jìn)一步補(bǔ)充,也即是傳遞給main( )函數(shù)的參數(shù)。
     命令行與main( )函數(shù)的參數(shù)存在如下的關(guān)系:
    設(shè)命令行為: program str1 str2 str3 str4 str5
    其中program 為文件名, 也就是一個(gè)由program.c 經(jīng)編譯、鏈接后生成的可執(zhí)行文件program.exe,其后各跟5個(gè)參數(shù)。對(duì)main( )函數(shù)來說,它的參數(shù)arc記錄了命令行中命令與參數(shù)的個(gè)數(shù),共6個(gè),指針數(shù)組的大小由參數(shù)argc的值決
    定,即為char *argv[6],指針數(shù)組的取值情況如圖6 - 1 5所示。
     數(shù)組的各指針分別指向一個(gè)字符串。應(yīng)當(dāng)引起注意的是接收到的指針數(shù)組的各指針是從命令行的開始接收的,首先接收到的是命令,其后才是參數(shù)。
     下面用實(shí)例來說明帶參數(shù)的main( )函數(shù)的正確使用。
    [例6-29] 利用圖形庫(kù)函數(shù)繪制一個(gè)變化的環(huán)。它是把一個(gè)半徑為R 1的圓周分成n份,然后以每個(gè)等分點(diǎn)為圓心,以R s為半徑畫n個(gè)圓(關(guān)于作圖的詳細(xì)理論本教材第9章第1節(jié)作了專門介紹,這里只作簡(jiǎn)單分析)。利用main( )函數(shù)的帶參數(shù)形式,我們可以從鍵盤以命令行的方式輸入R1和Rs及屏幕的背景色。
    #include /*包含圖形庫(kù)函數(shù)的頭文件* /
    #include
    #define pi 4.1415926
    main(argc, argv)
    int argc;char *argv[]; /* 定義帶參數(shù)的main( ) * /
    {
     int x,y,r1,rs,color;
     double a;
     int gdriver=DETECT,gmode;
     initgraph(&gdriver,&gmode,"..\\bgi ");/* 啟動(dòng)圖形工作方式* /
     r1 = atoi(argv[1]); / *計(jì)算基礎(chǔ)圓半徑* /
     rs = atoi(argv[2]); / *計(jì)算同心圓半徑* /
     color = atoi(argv[3]); / *背景色* /
     cleardevice( ); / *清除圖形屏幕* /
     setbkcolor(color); / *設(shè)置背景色* /
     setcolor(4); / *設(shè)置圖形顯示顏色* /
     for(a=0; a<=2*pi;a+=pi/18) / *繪制同心圓* /
     {
     x = r1 * cos(a) + 320;
     y = r1 * sin(a) + 240;
     circle(x, y, rs); / *以圓心坐標(biāo)為x、y,半徑為r s畫圓* /
     }
     getch( ) ; / *等待按鍵繼續(xù)* /
     closegraph( ) ; / *關(guān)閉圖形工作方式* /
    }
     若程序名為L(zhǎng) 6 - 29.c,經(jīng)編譯、連結(jié)生成可執(zhí)行文件L6 - 29.exe。在操作系統(tǒng)的環(huán)境下運(yùn)行程序,命令行方式為:
    l6-29 40 20 3
    則命令行與main( )函數(shù)的參數(shù)有如圖6 - 16所示的關(guān)系。
     圖6 - 16中, argv[0]是程序名, argv[1]是r1的值,argv[2]是rs的值,argv[3]是屏幕的背景色。由于指針數(shù)組均存放字符串,所需的圓半徑及背景色彩通過atoi( )函數(shù)轉(zhuǎn)換為整型。
     通過帶參數(shù)的main( )函數(shù),我們可以為自己的程序設(shè)置口令,在運(yùn)行程序的命令行中給出所需的口令,正確則繼續(xù),否則退出