標籤:
【函數指標】
<1>什麼是函數指標
int a,b,c;
int max(int,int);
int (*p)(int,int); //定義指標函數,指標變數活取函數地址
p=max;
c=(*p)(a,b)
函數指標就是函數的起始地址,我們可以使用一個指向函數的指標變數來儲存這個地址,當前的指標變數就指向這個函數。
在第二行聲明一個函數,第三行聲明一個指向int類型的指標變數,而且這個指標變數後面[有對圓括弧],這個就是指向函數的指標變數,我們想下,如果是int *p(int,int)會是怎樣?由於(的優先順序高,所以就是先聲明了一個p(int,int)函數,這個函數返回的是指向整型變數的指標。
第三句只是定義了一個指向函數的指標變數,並沒有說明是什麼函數,到了第四局把max函數首地址賦給指標變數才算是指定了函數。但此刻函數並沒有運行,直到第5句利用函數指標變數調用函數的時候才執行了相應的內容。
<2>函數指標作函數參數
在Main函數中把函數入口地址傳遞給處理函數的形參(函數指標變數),把函數要處理的資料傳遞給對應的形參,在處理函數是根據要處理的函數地址(函數指標變數)和接收到的資料進行輸出。粗淺的理解為低耦合。
#include <stdio.h> void main(){ int max(int,int); int min(int,int); int add(int,int); void fun(int x,int y,int(*p)(int,int)); int a=2,b=3,c; printf("輸入1/2/3\n"); scanf("%d",&c); if(c==1){ fun(a,b,max); } else if(c==2){ fun(a,b,min); } else if(c==3){ fun(a,b,add); } } void fun(int x,int y,int(*p)(int,int)){ int result; result=(*p)(x,y); printf("%d\n",result); } int max(int x,int y){ int z; if(x>y)z=x; else z=y; printf("Max is"); return z; } int min(int x,int y){ int z; if(x>y)z=y; else z=x; printf("Min is"); return z; } int add(int x,int y){ int z; z=x+y; printf("Sum is"); return z; }View Code
【返回指標的函數】
如:int *a(int x,int y); //定義函數a,返回一個指向整形資料的指標
【指標數組】
如:int *a[5]; //定義指標數組,數組中的每一個元素都是指標變數
由於[]的優先順序比較高,先計算a[5]說明它是數組形式,前面加上×表示它是指標數組。
註:int *a[5]和int (*a)[5]的區別
後面這中形式表示指向一維數組(這個數組最大編號為5)的指標變數。
指標數組的應用:大多用來指向若干個字串,如:
char *name[]={"Fello me","Basic","Frotran","Computer class"};
其中數組中存放的是各個字串的首字元的地址,這麼做的好處是節省空間的,而且指標可以改變。如果用二維數組儲存這些字串,那麼第一點數組的長度必須超過最長字串的長度,這就造成了空間浪費;第二,數組移動字串要比改變指標變數地址麻煩的多。
【指向指標資料的指標】
如:char **p; char c=‘a‘;
*p=&c; //
在定義時,char **P是二級指標,而在使用的時候,**p是指二級指標,存放的是一級指標變數的地址,*p是一級指標,存放的是變數的地址,p是‘a‘即變數的值;
C的日記-指標續