一、
在學習過程中發現這「指標函式」與「函式指標」容易搞錯,所以今天,我自己想一次把它搞清楚,找了一些資料,首先它們之間的定義:
1、指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標
型別識別符號 *函式名(參數列)
int*f(x,y);
首先它是乙個函式,只不過這個函式的返回值是乙個位址值。函式返回值必須用同型別的指標變數來接收,也就是說,指標函式一定有函式返回值,而且,在呼叫函式中,函式返回值必須賦給同型別的指標變數。
示例:
int
*fun();
int*p; p = fun(a);
注意指標函式與函式指標表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函式名前面的指標*號有沒有被括號()包含,如果被包含就是函式指標,反之則是指標函式。
詳細講解請看下面
指標函式:
當乙個函式宣告其返回值為乙個指標時,實際上就是返回乙個位址給呼叫函式,以用於需要指標或位址的表示式中。
格式:
型別說明符 *函式名(引數)
當然了,由於返回的是乙個位址,所以型別說明符一般都是int。
例如:
int*getdate();
int*func(int,int);
函式返回的是乙個位址值,經常使用在返回陣列的某一元素位址上。
int * getdate(int wk,int dy);
int main()
while(wk<1||wk>5||dy<1||dy>7);
printf(%d\n,*getdate(wk,dy));
return
0; }
int * getdate(int wk,int dy),,
,,
};return &calendar[wk-1][dy-1];
}
程式應該是很好理解的,子函式返回的是陣列某元素的位址。輸出的是這個位址裡的值。
2、函式指標是指向函式的指標變數,即本質是乙個指標變數。
int (*f) (int x); /* 宣告乙個函式指標 */
f = func; /* 將func函式的首位址賦給指標f */
型別說明符 (*函式名)(引數)
其實這裡不能稱為函式名,應該叫做指標的變數名。這個特殊的指標指向乙個返回整型值的函式。指標的宣告必須和它指向函式的宣告保持一致。
指標名和指標運算子外面的括號改變了預設的運算子優先順序。如果沒有圓括號,就變成了乙個返回整型指標的函式的原型宣告。
例如:
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)。採用空指標作為終止符,在樹種增刪元素時,就不必改動遍歷陣列的**,因為此時陣列仍然以空指標作為結束。
指標函式與函式指標的區別
一 在學習arm過程中發現這 指標函式 與 函式指標 容易搞錯,所以今天,我自己想一次把它搞清楚,找了一些資料,首先它們之間的定義 1 指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標 型別識別符號 函式名 參數列 int f x,y 首先它是乙個函式,只不過這個函式的返回值...
指標函式與函式指標的區別
一 在學習arm過程中發現這 指標函式 與 函式指標 容易搞錯,所以今天,我自己想一次把它搞清楚,找了一些資料,首先它們之間的定義 1 指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標 型別識別符號 函式名 參數列 int f x y 首先它是乙個函式,只不過這個函式的返回值...
指標函式與函式指標的區別
1 指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標 型別識別符號 函式名 參數列 int f x y 首先它是乙個函式,只不過這個函式的返回值是乙個位址值。函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函式返回值必須賦給同型...