2013-07-01 72 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;