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的值。
-
C++跳轉語句之Goto對變量定義的影響詳解
goto語句也稱為無條件轉移語句,以下是為大家分享的C++跳轉語句之Goto對變量定義的影響詳解,供大家參考借鑑,歡迎瀏覽!前言goto語句也稱為無條件轉移語句,其基本形式如下:語句標號由一個有效地標識符和符號";"組成,其中,標識符的命名規則與變量名稱相同,即由字母、數字...
-
測試C語言功力的幾個問題
在實際的VC++教學中,發現很少有真正精通了C語言編程的學員,一般都有或多或少概念不是完全清楚的問題,特別是一些需要豐富的實戰經驗才能體會和明白的問題,如字符串,指針,類型轉換,定義指向函數的指針類型,這也是導致學習VC++困難的一個原因。下面就來和小編一起看看測...
-
C語言指針的長度和類型講解
對於初學者深入理解C語言程序設計有很好的參考價值,下面是小編為大家整理的C語言指針的長度和類型講解,歡迎參考~一般來説,如果考慮應用程序的兼容性和可移植性,指針的長度就是一個問題,在大部分現代平台上,數據指針的長度通常是一樣的,與指針類型無關,儘管C標準沒有規...
-
2017年C語言新增無紙化真題練習
C語言的應用範圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適於編寫系統軟件,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。以下是小編為大家搜索整理的2017年C語言新增無紙化真題練習,希望能給大家帶來幫助!更多...