C語言中的函式指標學習講解

2021-06-22 19:28:57 字數 2932 閱讀 5414

函式在記憶體中有乙個物理位置,而這個位置是可以賦給乙個指標的。一零點函式的位址就是該函式的入口點。因此,函式指標可被用來呼叫乙個函式。函式的位址是用不帶任何括號或引數的函式名來得到的。(這很類似於陣列位址的得到方法,即,在只有陣列名而無下標是就得到陣列位址。)

1.怎樣說明乙個函式指標變數呢

?為了說明乙個變數

fn_pointer

的型別是

"返回值為

int的函式指標

",你可以使用下面的說明語句:

int(

*fn_pointer

)();

為了讓編譯器能正確地解釋這句語句,

*fn_pointer

必須用括號圍起來。若漏了這對括號,則:

int*fn_pointer

();的意思完全不同了。

fn_pointer

將是乙個函式名,其返回值為

int型別的指標。

2:函式指標變數

在c語言中規定,乙個函式總是占用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的首位址。我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使該指標變數指向該函式。然後通過指標變數就可以找到並呼叫這個函式。我們把這種指向函式的指標變數稱為

"函式指標變數"。

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

型別說明符(

*指標變數名)();其中"

型別說明符

"表示被指函式的返回值的型別。"(

*指標變數名)"表示

"*"後面的變數是定義的指標變數。最後的空括號表示指標變數所指的是乙個函式。

例如:int

(*pf

)();

表示pf

是乙個指向函式入口的指標變數,該函式的返回值(函式值)是整型。

下面通過例子來說明用指標形式實現對函式呼叫的方法。

intmax

(inta,intb

)main()

從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下:

1>.先定義函式指標變數,如後一程式中第9行int(*pmax)();定義pmax為函式指標變數。

2>.把被調函式的入口位址(函式名)賦予該函式指標變數,如程式中第11行pmax=max;

3>.用函式指標變數形式呼叫函式,如程式第14行z=(*pmax)(x,y);呼叫函式的一般形式為:(*指標變數名)(實參表)使用函式指標變數還應注意以下兩點:

a.函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減乙個整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。

b.函式呼叫中"(*指標變數名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。

3:指標型函式

前面我們介紹過,所謂函式型別是指函式返回值的型別。在c語言中允許乙個函式的返回值是乙個指標(即位址),這種返回指標值的函式稱為指標型函式。

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

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

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

int*ap(intx,inty)

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

應該特別注意的是函式指標變數和指標型函式這兩者在寫法和意義上的區別。如int(*p)()和int*p()是兩個完全不同的量。int(*p)()是乙個變數說明,說明p是乙個指向函式入口的指標變數,該函式的返回值是整型量,(*p)的兩邊的括號不能少。

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

main()

char*day_n

ame(intn) ;

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

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

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

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

inta[3][3]=;

int*pa[3]=;

int*p=a[0];

main()

本例程式中,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列的值。讀者可仔細領會元素值的各種不同的表示方法。應該注意指標陣列和二維陣列指標變數的區別。這兩者雖然都可用來表示二維陣列,但是其表示方法和意義是不同的

C語言中的函式指標學習筆記

一 定義函式指標 return type func pointer parameter list 普通指標變數的定義 int p char pointer 型別的限定都在變數前面 函式指標型別的限定是前後都有,前面是bomacddp返回型別,後面是輸入引數。利用typedef 可以簡化上面的表達方式...

C語言中的函式指標

開啟去年6月的乙個test.cpp檔案,發現對裡面測試的函式指標幾乎沒有印象了。溫故而知新,於是重新找到ansi c 裡面的說明 除了宣告指向整型數字 雙精度型數字和c語言其他資料型別的指標外,指標也能夠被宣告指向乙個函式 包含乙個函式的位址 指向函式的指標是可能的,因為函式名像陣列名一樣,它們本身...

C語言中的函式指標

1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。2.函式指標的使用 我們定義了乙個函式指標,但如何來使用它呢?先看如下例 include include char fun char p1,char p2 int i 0 i strcmp p1,p2 if 0 i r...