正文 第38章 指針11(1 / 2)

字符指針數組作main函數的形參是指針數組的一個重要應用。在前麵用到的main函數一般寫成:

main()

這是一個無參函數。但是,main函數也可以有形參,其函數原型為:

main(intargc,char*argv[]);

其中,整型變量argc用來記錄命令行參數的個數,字符型指針數組argv用來接收命令行的各個參數的起始地址。

通常把操作係統狀態下為執行某個程序或命令而鍵入的一行字符稱為命令行。命令行含有可執行文件名,有的還帶有若幹參數。命令行的一般形式為:

命令名參數1參數2…參數n

命令名和各參數之間用空格分隔。命令名是main函數所在的文件名,例如有一個含有帶參數main函數的c文件,文件名為file1.c,程序清單為:

main(intargc,char*argv[])

while(argc>0)

printf("%s\n",*argv++);

argc--;

經過編譯、連接後,生成一個可執行文件file1.exe,保存在D盤根目錄下,然後在DOS命令行輸入命令行參數:

file1nanlin

按回車鍵後運行該程序,程序輸出情況。

程序運行情況說明:DOS操作係統首先自動計算出全部命令行參數的個數(包括命令本身,此例中命令為file1)為3,並保存在第一個形參argc中。同時,把第一個字符串“file1”的指針存放在argv[0]中,把第二個字符串“nan”指針存放在argv[1]中,把第三個字符串“lin”指針存放在argv[2]中。

注意:argv[0]總是保存命令本身字符串的指針,所以argc的值總是大於等於1。

[例1023]編寫echo回顯程序。

main(intargc,char*argv[])

inti;

for(i=1;i

printf("%s%s",argv[i],(i

printf("\n");

程序說明:從變量i的初始值可以知道,這個程序不會輸出文件名,僅僅輸出文件名後的命令行參數。

前麵已經介紹了兩種給變量分配內存空間的機製,一種是靜態分配,另一種是自動分配。這兩種方式都是由編譯係統分配內存空間。還有第三種內存分配方式,能在需要新內存的時候得到內存,不需要內存時就顯式釋放這部分內存,這種在程序運行時獲取新內存空間的過程稱為動態分配。使用動態存儲分配有它的優點:一是可以更有效地使用內存;二是同一段內存可有不同用途,使用時申請,用完就釋放;三是允許建立鏈表等動態數據結構。

C語言中,指針是有類型的。例如:

int*p1;

char*p2;

指針變量p1是存放整型變量的指針,指針變量p2是存放字符型變量的指針。在調用動態內存分配函數時,可以為任何類型的值分配新的內存空間。所以必須返回一個未確定類型的“通用”指針。在C語言中,通用指針類型是一個指向空類型void的指針類型。例如:

void*vp;

可以把任何類型的指針值存入該指針變量vp中,但不允許用“*”運算符間接引用vp。編譯器不知道vp的基類型是什麼,所以沒有辦法訪問它指向的值。

ANSIC能在指向void的指針類型和指向基類型的指針類型間自動進行轉換,當然也可以使用強製類型來進行轉換。例如,如果定義一個字符指針變量為:

char*cp;

可以用語句

cp=malloc(10);

將malloc函數的返回的通用指針值直接賦給cp,在賦值時進行了自動類型轉換,也可以用語句:

cp=(char*)malloc(10);

來進行強製類型轉換。

動態內存分配通常要用到四個函數:malloc函數和calloc函數用於動態申請內存空間;realloc函數用於重新改變已分配的動態內存的大小;free函數用於釋放不再使用的動態內存。這四個函數都定義在頭文件stdlib.h中。

1.malloc函數

其函數原型為:

void*malloc(unsignedintsize);

該函數用來按字節數申請內存。參數size為unsignedint型,表示申請的字節數。如果申請成功,函數返回一個void型指針,否則返回NULL指針。