既然指標變數的值是乙個位址,那麼這個位址不僅可以是變數的位址,也可以是其它資料結構的位址。在乙個指標變數中存放乙個陣列或乙個函式的首位址有何意義呢?
因為陣列或函式都是連續存放的。通過訪問指標變數取得了陣列或函式的首位址,也就找到了該陣列或函式。這樣一來,凡是出現陣列,函式的地方都可以用乙個指標變數來表示,只要該指標變數中賦予陣列或函式的首位址即可。這樣做,將會使程式的概念十分清楚,程式本身也精練,高效。
前面介紹的main函式都是不帶引數的。因此main 後的括號都是空括號。
實際上,main函式可以帶引數,這個引數可以認為是main函式的形式引數。
c語言規定main函式的引數只能有兩個,習慣上這兩個引數寫為argc和argv。因此,main函式的函式頭可寫為:
main (argc,argv)
c語言還規定argc(第乙個形參)必須是整型變數,argv(第二個形參)必須是指向字串的指標陣列。加上形參說明後,main函式的函式頭應寫為:
main (int argc,char *argv)
由於main函式不能被其它函式呼叫,因此不可能在程式內部取得實際值。
那麼,在何處把實參值賦予main函式的形參呢?實際上,main函式的引數值是從作業系統命令列上獲得的。當我們要執行乙個可執行檔案時,在dos提示符下鍵入檔名,再輸入實際引數即可把這些實參傳送到main的形參中去。
dos提示符下命令列的一般形式為:
c:\>可執行檔名 引數 引數 ……;
但是應該特別注意的是,main 的兩個形參和命令列中的引數在位置上不是一一對應的。
因為,main的形參只有二個,而命令列中的引數個數原則上未加限制。argc引數表示了命令列中引數的個數(注意:檔名本身也算乙個引數),argc的值是在輸入命令行時由系統按實際引數的個數自動賦予的。
例如有命令行為:
c:\>e24 basic foxpro fortran
由於檔名e24本身也算乙個引數,所以共有4個引數,因此argc取得的值為4。argv引數是字串指標陣列,其各元素值為命令列中各字串(引數均按字串處理)的首位址。 指標陣列的長度即為引數個數。陣列元素初值由系統自動賦予。其表示如圖所示:
【例10-38】
main本例是顯示命令列中輸入的引數。如果上例的可執行檔名為e24.exe,存放在a驅動器的盤內。因此輸入的命令行為:(int argc,
char
*argv)
c:\>a:e24 basic foxpro fortran
則執行結果為:
basic
foxpro
fortran
該行共有4個引數,執行main時,argc的初值即為4。argv的4個元素分為4個字串的首位址。執行while語句,每迴圈一次argv值減1,當argv等於1時停止迴圈,共迴圈三次,因此共可輸出三個引數。在printf函式中,由於列印項*++argv是先加1再列印, 故第一次列印的是argv[1]所指的字串basic。第
二、三次迴圈分別列印後二個字串。而引數e24是檔名,不必輸出。
指標的資料型別:
定義含義
int i;
定義整型變數i
int *p
p為指向整型資料的指標變數
int a[n];
定義整型陣列a,它有n個元素
int *p[n];
定義指標陣列p,它由n個指向整型資料的指標元素組成
int (*p)[n];
p為指向含n個元素的一維陣列的指標變數
int f();
f為帶回整型函式值的函式
int *p();
p為帶回乙個指標的函式,該指標指向整型資料
int (*p)();
p為指向函式的指標,該函式返回乙個整型值
int **p;
p是乙個指標變數,它指向乙個指向整型資料的指標變數
C語言 函式指標及其應用
基礎知識 函式指標 function pointer 就是指向函式的指標變數。定義函式指標的基本格式為 資料型別 指標變數名 形參列表 資料型別表示這個指標變數所指向的函式的返回值的型別,形參列表表示這個指標變數所指向的函式所具有的形參列表。例如,若有函式原型為 int fun int a,int ...
C語言 指標及其運算
任務 include include int main int a 3,b 5,p1,p2,p p1 a p2 b if a 執 況 知識總結 回顧 變數三要素 變數名,變數值,儲存空間 不同的變數名有不同的儲存空間 指標變數表示 資料型別 p 記憶體單元的訪問和訪問 直接訪問和間接訪問 兩個符號的...
指標及其應用(一)
2 指標的長度 指標的長度時固定的,任何型別的指標都是4 位元組。原因 所有的指標都用來儲存位址,而在作業系統中,位址的長度是固定的,因為位址的長度是由作業系統的位數決定的。32 位的作業系統中是 4位元組,64位的作業系統中 是 8位元組。3 指標的運算子 和 運算子 通常稱為間接引用運算子,它返...