**:
問:先定義了個函式:int function(int a, int b)
main函式裡面有個函式指標
問題1:那麼下面兩種對函式指標的賦值哪個是正確的,還是都可以?
int main(void)
問題2:使用fp這個函式指標的時候,下面哪種是正確的,還是都正確?
a: fp(1,2);
b: (*fp)(1,2);
解釋為什麼?
答:
第乙個問題,兩個都是可以的。函式名是乙個位址,可以將他賦值給乙個指向函式的指標。前面加了&符號其意義是一樣的。比如定義乙個陣列arr,arr表示這個陣列的首位址,但&arr同樣表示他的首位址。這些都是設計語言時這樣規定的第二個問題,兩個也都是可以的,比如你定義乙個字串指標char *str, 輸出str 他並不是輸出了位址,而是輸出存在該位址的值,所有這些設計都是為了方便使用,而不是為了符合同乙個規則。
在實踐中,請大家最好按照
@dyntkj
的回答去定義。
我來說個道理,知道這個道理後,我對c語言中定義型別這件小事立馬就一通百通了。
這個道理就是
定義的樣子,和使用的時候的樣子是一樣一樣的。
舉個最簡單的例子。
int
a;
這定義了乙個整型。
int*p
;
這定義了乙個指向整數的指標。那麼這個指標怎麼變成整數呢?很簡單,只需要 *p 就可以了。我們驚奇的發現,定義時和使用時的形式是一模一樣的。這不是個巧合,是語言設計者有意為之的。
int *p 的意思就是讓 *p 為整形。那麼 p 自然是指向整數的指標了。
再來看題主的例子。
int(*
p)(int);
這個p是什麼我們不知道,但我們知道 (*p)(int) 是個整數,所以, *p 是個 返回整數的函式。而p就是指向這種函式的指標啦。
那麼如何定義函式指標的指標呢?簡單點說,就是加個 * 就行了。
假如不幸的是,我們一開始加錯了地方,變成了:
int*(
*p)(int
);
我們來用我們的腦袋檢驗一下(你需要熟悉運算子優先順序(這裡又有乙個口訣:小括號的運算級最高)): *(*p)(int) 是個整數,所以 (*p)(int) 是個整數的指標。 所以 *p 是個函式,返回乙個整數指標,所以p是個函式指標。
那麼我們,將*挪一下地方。
int(**
p)(int);
再來檢驗一下:(**p)(int)是個整數。 **p 是個函式,返回乙個整數。於是 *p 是個函式的指標。 p 是個函式指標的指標。
完美。-------------- 一看就知道我是分割線 --------------------
有的時候,有的人(就是我小時候),會直接這樣定義函式的指標的指標:
int **p(int);
他還振振有詞:這很顯然呀。
我們來看看他錯在**:
小括號的優先順序最高,當你寫下這個語句的時候: **p(int)
漲姿勢的都點讚吧。
更新:原來《c陷阱與缺陷》第一章講的就是這個!
C指標相關
const是乙個修飾符,告訴編譯器這個變數不可以被更改,而指標代表兩個東西,本身和指標所指的位址的內容,那麼指標遇到const將會發生什麼?判斷技巧 如果const出現在指標 的前面,說明不可以通過指標修改內容,所指是const 如果const出現在指標 的後面,說明所指標不可以修改所指物件,指標是...
Delphi指標相關函式
1.addr var i integer nodenumbers array 0 100 of integer begin with treeview1 do begin for i 0 to items.count 1 do begin nodenumbers i calculatevalue i...
C 指標與陣列 函式相關基礎練習
3 母串中查子串出現次數 strstr函式 一般常用兩種方法,以這題為例 法一,行指標,需要提前標明列數 void find double pt,int n,int m,double str printf 2lf d d n pt,x,y intmain system pause return0 溫...