C 函式指標相關

2021-08-20 07:48:05 字數 1743 閱讀 1469

**:

問:先定義了個函式:

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 溫...