2013-07-01 132 views
4
int f1(){} 
int* f2(){} 

int main() 
{ 
    int *a;//1 
    int b; 
    int *c; 
    a=c; 
    a=&b; 

    int (*p)(); //2 
    p=f2; //showing error 
    p=&f1; 
} 

我預計在我的程序'2'中必須表現得類似於'1'。爲什麼函數指針的行爲不同。或者我錯過了什麼?瞭解函數指針

+5

'f2'是返回指針到'int'的函數(和將被轉換成一個'INT *(*)()'在行'p = f2;'如果編譯的話)。 'p'是一個指向返回'int'的函數的指針。不兼容的類型。 –

+0

這裏有一個技巧來幫助輕鬆聲明函數指針類型:'typedef int type_of_f1();'。現在只需添加一個星號,然後用'type_of_f1 * p;'來聲明一個適用於f1的函數指針。 –

+0

好[圖書](www.cs.rit.edu/~ats/books/ooc.pdf)的 –

回答

3

p=f2;錯誤,因爲不兼容的類型的類型。 f2是一個函數,可以返回int*,而p是指向函數的指針,可以指向函數返回int例如, f1()

int* f2(),你可以定義一個指針方式如下所示:

int* (*p2)(); // pointers to function f2 
p2 = f2; 

此外,你不需要之前函數名使用&只是函數名就足夠了。 這裏是一個很好的鏈接閱讀:Why do all these crazy function pointer definitions all work? What is really going on?

編輯
一段時間&functionnamefunctionname不相同例如sizeof(functionname) is not validsizeof(&functionname)是完全有效的。

+0

謝謝。但爲什麼p2 = f2;?爲什麼不是p2 = &f2; – Alex

+1

@Alex,這兩種形式在功能上是可以互換的。 – StoryTeller

+1

@Alex你可以嘗試'p = ***************************************** ** f2;' – johnchen902

3
int* f2(){} 

接受任何操作,並返回一個指針爲int的函數。

int (*p)(); 

一個指向:接受什麼,並返回一個INT

你有一個類型不匹配的功能。 p不是一個指向f2

如果你無法理解這樣的定義,像所有凡人做,使用spiral rule of thumb

+1

謝謝鏈接 – Alex

2

這是返回int*

int* f2(){} 

的功能所以,你需要:

(int*) (*q)(); 
q = f2; 
1

p是函數指針服用無效參數並返回整數。

f1是一個以void參數和返回整數爲函數的函數。

f2是一個採用void參數並返回指向整數的函數的函數。

現在按定義,你可以看到f1可以分配給pf2 can't.To在p分配f2p申報應int *(*p)();

1

你犯了錯的任務我。È不兼容的類型

對於功能

int f1(){} 
int* f2(){} 

正確指派將是

int (*p)(); 
p = f1; 

int* (*p)(); 
p = f2;