指標函式和函式指標

2021-06-01 12:52:58 字數 2451 閱讀 7186

一、指標函式

當乙個函式宣告其返回值為乙個指標時,實際上就是返回乙個位址給呼叫函式,以用於需要指標或位址的表示式中。

格式:型別說明符 * 函式名(引數)

當然了,由於返回的是乙個位址,所以型別說明符一般都是int。

例如:int *getdate();

int * aaa(int,int);

函式返回的是乙個位址值,經常使用在返回陣列的某一元素位址上。

int * getdate(int wk,int dy);

main()

while(wk<1||wk>5||dy<1||dy>7);

printf(%d\n,*getdate(wk,dy));

}int * getdate(int wk,int dy),,

,,};return &calendar[wk-1][dy-1];

}程式應該是很好理解的,子函式返回的是陣列某元素的位址。輸出的是這個位址裡的值。

二、函式指標

指向函式的指標包含了函式的位址,可以通過它來呼叫函式。宣告格式如下:

型別說明符 (*函式名)(引數)

其實這裡不能稱為函式名,應該叫做指標的變數名。這個特殊的指標指向乙個返回整型值的函式。指標的宣告筆削和它指向函式的宣告保持一致。

指標名和指標運算子外面的括號改變了預設的運算子優先順序。如果沒有圓括號,就變成了乙個返回整型指標的函式的原型宣告。

例如:void (*fptr)();

把函式的位址賦值給函式指標,可以採用下面兩種形式:

fptr=&function;

fptr=function;

取位址運算子&不是必需的,因為單單乙個函式識別符號就標號表示了它的位址,如果是函式呼叫,還必須包含乙個圓括號括起來的參數列。

可以採用如下兩種方式來通過指標呼叫函式:

x=(*fptr)();

x=fptr();

第二種格式看上去和函式呼叫無異。但是有些程式設計師傾向於使用第一種格式,因為它明確指出是通過指標而非函式名來呼叫函式的。下面舉乙個例子:

void (*funcp)();

void filefunc(),editfunc();

main()

void filefunc()

void editfunc()

程式輸出為:

filefunc

editfunc

三、指標的指標

指標的指標看上去有些令人費解。它們的宣告有兩個星號。例如:

char ** cp;

如果有三個星號,那就是指標的指標的指標,四個星號就是指標的指標的指標的指標,依次類推。當你熟悉了簡單的例子以後,就可以應付複雜的情況了。當然,實際程式中,一般也只用到二級指標,三個星號不常見,更別說四個星號了。

指標的指標需要用到指標的位址。

char c='a';

char *p=&c;

char **cp=&p;

通過指標的指標,不僅可以訪問它指向的指標,還可以訪問它指向的指標所指向的資料。下面就是幾個這樣的例子:

char *p1=*cp;

char c1=**cp;

你可能想知道這樣的結構有什麼用。利用指標的指標可以允許被呼叫函式修改區域性指標變數和處理指標陣列。

void findcredit(int **);

main()

;int *fp=vals;

findcredit(&fp);

printf(%d\n,*fp);

}void findcredit(int ** fpp)

首先用乙個陣列的位址初始化指標fp,然後把該指標的位址作為實參傳遞給函式findcredit()。findcredit()函式通過表示式**fpp間接地得到陣列中的資料。為遍歷陣列以找到乙個負值,findcredit()函式進行自增運算的物件是呼叫者的指向陣列的指標,而不是它自己的指向呼叫者指標的指標。語句(*fpp)++就是對形參指標指向的指標進行自增運算的。但是因為*運算子高於++運算子,所以圓括號在這裡是必須的,如果沒有圓括號,那麼++運算子將作用於二重指標fpp上。

四、指向指標陣列的指標

指標的指標另一用法舊處理指標陣列。有些程式設計師喜歡用指標陣列來代替多維陣列,乙個常見的用法就是處理字串。

char *names=

;main()

先用字元型指標陣列names的位址來初始化指標nm。每次printf()的呼叫都首先傳遞指標nm指向的字元型指標,然後對nm進行自增運算使其指向陣列的下乙個元素(還是指標)。注意完成上述認為的語法為*nm++,它首先取得指標指向的內容,然後使指標自增。

注意陣列中的最後乙個元素被初始化為0,while迴圈以次來判斷是否到了陣列末尾。具有零值的指標常常被用做迴圈陣列的終止符。程式設計師稱零值指標為空指標(null)。採用空指標作為終止符,在樹種增刪元素時,就不必改動遍歷陣列的**,因為此時陣列仍然以空指標作為結束。

函式指標 函式指標陣列和指標函式

1.函式指標 這個指標返回乙個函式 int f int x 宣告乙個函式指標 f func 將func函式的首位址賦給指標f 2.函式指標陣列 這個指標返回一組函式 include stdio.h void function0 void void function1 void void functi...

指標函式和函式指標

指標函式和函式指標 一 指標函式 當乙個函式宣告其返回值為乙個指標時,實際上就是返回乙個位址給呼叫函式,以用於需要指標或位址的表示式中。格式 型別說明符 函式名 引數 當然了,由於返回的是乙個位址,所以型別說明符一般都是int。例如 int getdate int aaa int,int 函式返回的...

函式指標和指標函式

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...