導(dǎo)語:所謂函數(shù)類型是指函數(shù)返回值的類型。 在C語言中允許一個(gè)函數(shù)的返回值是一個(gè)指針(即地址), 這種返回指針值的函數(shù)稱為指針型函數(shù)。讓我們一起了解一下這種函數(shù)吧!

  定義指針型函數(shù)的一般形式為:

  類型說明符 *函數(shù)名(形參表)

  {

  …… /*函數(shù)體*/

  }

  其中函數(shù)名之前加了“*”號(hào)表明這是一個(gè)指針型函數(shù),即返回值是一個(gè)指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。

  如:

  int *ap(int x,int y)

  {

  ...... /*函數(shù)體*/

  }

  表示ap是一個(gè)返回指針值的指針型函數(shù), 它返回的指針指向一個(gè)整型變量。下例中定義了一個(gè)指針型函數(shù) day_name,它的返回值指向一個(gè)字符串。該函數(shù)中定義了一個(gè)靜態(tài)指針數(shù)組name。name 數(shù)組初始化賦值為八個(gè)字符串,分別表示各個(gè)星期名及出錯(cuò)提示。形參n表示與星期名所對(duì)應(yīng)的整數(shù)。在主函數(shù)中, 把輸入的整數(shù)i作為實(shí)參, 在printf語句中調(diào)用day_name函數(shù)并把i值傳送給形參 n。day_name函數(shù)中的return語句包含一個(gè)條件表達(dá)式, n 值若大于7或小于1則把name[0] 指針返回主函數(shù)輸出出錯(cuò)提示字符串“Illegal day”。否則返回主函數(shù)輸出對(duì)應(yīng)的星期名。主函數(shù)中的第7行是個(gè)條件語句,其語義是,如輸入為負(fù)數(shù)(i<0)則中止程序運(yùn)行退出程序。exit是一個(gè)庫函數(shù),exit(1)表示發(fā)生錯(cuò)誤后退出程序, exit(0)表示正常退出。

  應(yīng)該特別注意的是函數(shù)指針變量和指針型函數(shù)這兩者在寫法和意義上的區(qū)別。如int(*p)()和int *p()是兩個(gè)完全不同的量。int(*p)()是一個(gè)變量說明,說明p 是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型量,(*p)的兩邊的括號(hào)不能少。int *p() 則不是變量說明而是函數(shù)說明,說明p是一個(gè)指針型函數(shù),其返回值是一個(gè)指向整型量的指針,*p兩邊沒有括號(hào)。作為函數(shù)說明, 在括號(hào)內(nèi)最好寫入形式參數(shù),這樣便于與變量說明區(qū)別。 對(duì)于指針型函數(shù)定義,int *p()只是函數(shù)頭部分,一般還應(yīng)該有函數(shù)體部分。

  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]);

  }

  本程序是通過指針函數(shù),輸入一個(gè)1~7之間的整數(shù), 輸出對(duì)應(yīng)的星期名。指針數(shù)組的說明與使用一個(gè)數(shù)組的元素值為指針則是指針數(shù)組。 指針數(shù)組是一組有序的指針的集合。 指針數(shù)組的所有元素都必須是具有相同存儲(chǔ)類型和指向相同數(shù)據(jù)類型的指針變量。

  指針數(shù)組說明的一般形式為: 類型說明符*數(shù)組名[數(shù)組長(zhǎng)度]

  其中類型說明符為指針值所指向的變量的類型。例如: int *pa[3] 表示pa是一個(gè)指針數(shù)組,它有三個(gè)數(shù)組元素, 每個(gè)元素值都是一個(gè)指針,指向整型變量。通??捎靡粋€(gè)指針數(shù)組來指向一個(gè)二維數(shù)組。 指針數(shù)組中的每個(gè)元素被賦予二維數(shù)組每一行的首地址, 因此也可理解為指向一個(gè)一維數(shù)組。圖6—6表示了這種關(guān)系。

  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是一個(gè)指針數(shù)組,三個(gè)元素分別指向二維數(shù)組a的各行。然后用循環(huán)語句輸出指定的數(shù)組元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p與a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。讀者可仔細(xì)領(lǐng)會(huì)元素值的各種不同的表示方法。 應(yīng)該注意指針數(shù)組和二維數(shù)組指針變量的區(qū)別。 這兩者雖然都可用來表示二維數(shù)組,但是其表示方法和意義是不同的。

  二維數(shù)組指針變量是單個(gè)的變量,其一般形式中"(*指針變量名)"兩邊的括號(hào)不可少。而指針數(shù)組類型表示的是多個(gè)指針( 一組有序指針)在一般形式中"*指針數(shù)組名"兩邊不能有括號(hào)。例如: int (*p)[3];表示一個(gè)指向二維數(shù)組的指針變量。該二維數(shù)組的列數(shù)為3或分解為一維數(shù)組的長(zhǎng)度為3。 int *p[3] 表示p是一個(gè)指針數(shù)組,有三個(gè)下標(biāo)變量p[0],p[1],p[2]均為指針變量。

  指針數(shù)組也常用來表示一組字符串, 這時(shí)指針數(shù)組的每個(gè)元素被賦予一個(gè)字符串的首地址。 指向字符串的指針數(shù)組的初始化更為簡(jiǎn)單。例如在例6.20中即采用指針數(shù)組來表示一組字符串。 其初始化賦值為:

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

  "Monday",

  "Tuesday",

  "Wednesday",

  "Thursday",

  "Friday",

  "Saturday",

  "Sunday"};

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

  指針數(shù)組也可以用作函數(shù)參數(shù)。在本例主函數(shù)中,定義了一個(gè)指針數(shù)組name,并對(duì)name 作了初始化賦值。其每個(gè)元素都指向一個(gè)字符串。然后又以name 作為實(shí)參調(diào)用指針型函數(shù)day name,在調(diào)用時(shí)把數(shù)組名 name 賦予形參變量name,輸入的整數(shù)i作為第二個(gè)實(shí)參賦予形參n。在day name函數(shù)中定義了兩個(gè)指針變量pp1和pp2,pp1被賦予name[0]的值(即*name),pp2被賦予name[n]的值即*(name+ n)。由條件表達(dá)式?jīng)Q定返回pp1或pp2指針給主函數(shù)中的指針變量ps。最后輸出i和ps的值。

1.《指針函數(shù) C語言的指針型函數(shù)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。

2.《指針函數(shù) C語言的指針型函數(shù)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/jiaoyu/76768.html