當前位置:才華齋>計算機>C語言>

C語言的指標型函式

C語言 閱讀(1.65W)

導語:所謂函式型別是指函式返回值的型別。 在C語言中允許一個函式的返回值是一個指標(即地址), 這種返回指標值的函式稱為指標型函式。讓我們一起了解一下這種函式吧!

C語言的指標型函式

定義指標型函式的一般形式為:

型別說明符 *函式名(形參表)

{

…… /*函式體*/

}

其中函式名之前加了“*”號表明這是一個指標型函式,即返回值是一個指標。型別說明符表示了返回的指標值所指向的資料型別。

如:

int *ap(int x,int y)

{

...... /*函式體*/

}

表示ap是一個返回指標值的指標型函式, 它返回的指標指向一個整型變數。下例中定義了一個指標型函式 day_name,它的返回值指向一個字串。該函式中定義了一個靜態指標陣列name。name 陣列初始化賦值為八個字串,分別表示各個星期名及出錯提示。形參n表示與星期名所對應的整數。在主函式中, 把輸入的整數i作為實參, 在printf語句中呼叫day_name函式並把i值傳送給形參 n。day_name函式中的return語句包含一個條件表示式, n 值若大於7或小於1則把name[0] 指標返回主函式輸出出錯提示字串“Illegal day”。否則返回主函式輸出對應的星期名。主函式中的第7行是個條件語句,其語義是,如輸入為負數(i<0)則中止程式執行退出程式。exit是一個庫函式,exit(1)表示發生錯誤後退出程式, exit(0)表示正常退出。

應該特別注意的是函式指標變數和指標型函式這兩者在寫法和意義上的區別。如int(*p)()和int *p()是兩個完全不同的量。int(*p)()是一個變數說明,說明p 是一個指向函式入口的指標變數,該函式的返回值是整型量,(*p)的兩邊的括號不能少。int *p() 則不是變數說明而是函式說明,說明p是一個指標型函式,其返回值是一個指向整型量的指標,*p兩邊沒有括號。作為函式說明, 在括號內最好寫入形式引數,這樣便於與變數說明區別。 對於指標型函式定義,int *p()只是函式頭部分,一般還應該有函式體部分。

main(){

int i;

char *day_name(int n);

printf("input Day No:/n");

scanf("%d",&i);

if(i<0) exit(1);

printf("Day No:%2d-->%s/n",i,day_name(i));

}

char *day_name(int n){

static char *name[]={ "Illegal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

return((n<1||n>7) ? name[0] : name[n]);

}

本程式是通過指標函式,輸入一個1~7之間的整數, 輸出對應的星期名。指標陣列的說明與使用一個數組的元素值為指標則是指標陣列。 指標陣列是一組有序的指標的集合。 指標陣列的所有元素都必須是具有相同儲存型別和指向相同資料型別的指標變數。

指標陣列說明的一般形式為: 型別說明符*陣列名[陣列長度]

其中型別說明符為指標值所指向的變數的型別。例如: int *pa[3] 表示pa是一個指標陣列,它有三個陣列元素, 每個元素值都是一個指標,指向整型變數。通常可用一個指標陣列來指向一個二維陣列。 指標陣列中的每個元素被賦予二維陣列每一行的首地址, 因此也可理解為指向一個一維陣列。圖6—6表示了這種關係。

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]={a[0],a[1],a[2]};

int *p=a[0];

main(){

int i;

for(i=0;i<3;i++)

printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));

for(i=0;i<3;i++)

printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));

}

本例程式中,pa是一個指標陣列,三個元素分別指向二維陣列a的各行。然後用迴圈語句輸出指定的陣列元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由於p與a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指標陣列和二維陣列指標變數的區別。 這兩者雖然都可用來表示二維陣列,但是其表示方法和意義是不同的。

二維陣列指標變數是單個的變數,其一般形式中"(*指標變數名)"兩邊的括號不可少。而指標陣列型別表示的`是多個指標( 一組有序指標)在一般形式中"*指標陣列名"兩邊不能有括號。例如: int (*p)[3];表示一個指向二維陣列的指標變數。該二維陣列的列數為3或分解為一維陣列的長度為3。 int *p[3] 表示p是一個指標陣列,有三個下標變數p[0],p[1],p[2]均為指標變數。

指標陣列也常用來表示一組字串, 這時指標陣列的每個元素被賦予一個字串的首地址。 指向字串的指標陣列的初始化更為簡單。例如在例6.20中即採用指標陣列來表示一組字串。 其初始化賦值為:

char *name[]={"Illagal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

完成這個初始化賦值之後,name[0]即指向字串"Illegal day",name[1]指?quot;Monday"......。

指標陣列也可以用作函式引數。在本例主函式中,定義了一個指標陣列name,並對name 作了初始化賦值。其每個元素都指向一個字串。然後又以name 作為實參呼叫指標型函式day name,在呼叫時把陣列名 name 賦予形參變數name,輸入的整數i作為第二個實參賦予形參n。在day name函式中定義了兩個指標變數pp1和pp2,pp1被賦予name[0]的值(即*name),pp2被賦予name[n]的值即*(name+ n)。由條件表示式決定返回pp1或pp2指標給主函式中的指標變數ps。最後輸出i和ps的值。