一指標函式
乙個函式不僅可以返回乙個整形資料的值、字元型別值和實型型別的值,還可以返回指標型別的資料,使其指向某個位址單元。指標函式即返回指標的函式。
指標函式一般定義格式為:
型別識別符號*
函式名(
參數列);
其中,字尾運算子括號()
表示這是乙個函式,其字首運算子星號
*表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個指向返回值為…的指標(位址)。
比如:int*f(intx,inty);
由於*的優先順序低於
()的優先順序,因而
f首先和後面的
()結合,也就意味著,
f是乙個函式。即:
int*(f(intx,inty);
接著再和前面的*
結合,說明這個函式的返回值是乙個指標。由於前面還有乙個
int,也就是說,
f是乙個返回值為整型指標的函式。
其中x,y
是形式引數,
f是函式名,呼叫後返回乙個指向整型資料的位址指標,
f(intx,inty)
是函式,其返回值是指標。
#include using namespace std;
char *display(char *str)
int main()
程式執行截圖:
二函式指標
(1)函式指標的定義
在程式執行中,函式**是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址,可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式的首位址,指向函式**首位址的指標變數稱為函式指標。
函式指標一般定義格式:
型別識別符號(*
指標變數名
)(形參列表);
由於()
的優先順序高於
*,所以指標變數名外的括號是必不可少的。
比如:int(*f)(intx);
通過括號強行將f
首先與「
*」結合,也就意味著,
f是乙個指標,接著與後面的「
()」結合,說明該指標指向的是乙個函式,然後再與前面的
int結合,也就是說,該函式的返回值是
int。由此可見,
f是乙個指向返回值為
int的函式的指標。
定義函式指標時應該注意:
1函式指標和它指向的函式的引數個數和型別都應該是一致的
2函式指標的型別和函式的返回值型別也必須是一致的
(2)函式指標的賦值
函式名和陣列名一樣代表了函式**的首位址,因此在賦值時,可以直接將函式指標指向函式名
比如:intfunc(intx);
//宣告乙個函式
int(*f)(intx);
//宣告乙個函式指標
f=func;//將
func
函式的首位址賦值給函式指標f
賦值時函式func
不帶括號,也不帶引數,由於
func
代表函式的首位址,因此經過賦值以後,函式指標
f就指向函式
func(x)
的**的首位址
(3)通過函式指標呼叫函式
函式指標是通過函式名及有關引數來進行呼叫的,與其他指標變數類似,如果指標變數pi
是指向某整型變數
i的指標,則
*pi等於它所指向的變數
i。同樣的,
f是指向函式
func(x)
的指標,則
*f就代表它所指向的函式
func
。所以在執行了
f=func
之後,*f
和func
代表同一函式。
由於函式指標指向儲存區中得某個函式,因此可以通過函式指標呼叫相應的函式,該過程分為以下三步:
1宣告乙個函式指標變數
比如:int(*f)(intx);
2對函式指標變數賦值
比如:f=func
;(func
必須先要有定義)
3要用(
*指標變數)(參數列)的格式來呼叫函式
比如:(*f)(x
)(x必須先賦值)
#include using namespace std;
int max(int x, int y)
//函式指標
int (*pmax)(int x, int y);
int main()
程式執行截圖: C C 指標函式和函式指標
一 指標函式 當乙個函式宣告其返回值為乙個指標時,實際上就是返回乙個位址給呼叫函式,以用於需要指標或位址的表示式中。格式 型別說明符 函式名 引數 當然了,由於返回的是乙個位址,所以型別說明符一般都是int。例如 int getdate int aaa int,int 函式返回的是乙個位址值,經常使...
C C 函式指標與指標函式
面試的時候,經常有面試官問這個問題,在linux核心裡面也是經常被使用的,在看很多大神的 裡面,我們也經常遇到函式指標與指標函式,一樣,如果你自己沒問題了,就不用往下看了。我們看個 int func int a,int b 我們之前說過運算子的優先順序,的優先順序低於 由於 的優先順序低於 的優先順...
c C 指標函式
我們知道,指標式記憶體首位址,那是針對變數來說的,我也知道,程式是由變數,函式組成的。那麼函式的指標是怎麼定義的呢?我們也知道函式也是存放在記憶體的 區域,它同樣有首位址,關鍵是我們怎樣才能獲取它的位址呢?如果我們定義乙個 int test int a 的函式,那麼它的位址就是函式名字test,這一...