文章题目看起来有点晕,在C语言中指针用起来比较灵活,项目大了更是指针满天飞,不过指针本身并不复杂,只要把握了问题的本质就可以不变应万变了。两个函数 int *p( int a,int b) 和int(*p)( int a,int b )中的p有何区别?正如文章题目所言,一个是函数的指针返回值,一个是指向函数的指针,在这里 int *p( int a,int b)函数的返回值指向一个整型变量。
要弄明白两者的区别,首先得知道运算符()和*的优先级,由于运算符()的优先级要高于*,p先与后面的()结合,所以int *p( int a,int b)是声明了一个p函数;而int(*p)( int a,int b )中p与*结合成一个指针变量,表示该指针指向函数,而且函数的返回值是整型的。因为每一个函数占用一段内存单元,而且函数名代表函数的入口地址。因此,在进行函数调用时既可以通过函数名调用,也可以通过指向函数的指针变量调用。也就是说可以用一个指针变量指向一个函数,通过指针变量来访问该函数。例如在程序中声明了int(*p)( int a,int b )这个函数后,如果还声明了函数int function1(int a,int b ),那么p=function1赋值以后,int(*p)( int a,int b )和int function1(int a,int b )就是等价的了。
另外,int(*p)( int a,int b )函数中的指向函数的指针变量p并不是固定指向某一个函数,而是可以指向一类函数。也就是说p只是专门用来存放函数的入口地址的,如果将一个函数(该函数必须是同类型的)的入口地址赋给它,它就指向该函数。上面所说的同类型是指函数的返回值类型以及函数形参的个数和类型都是一致的。因此,在一个程序中,一个指针变量可以先后指向不同的函数。例如在程序中声明了int(*p)( int a,int b )这个函数后,如果还声明了函数int function1(int a,int b )和int function2(int a,int b ),那么p=function1赋值以后,int(*p)( int a,int b )和int function1(int a,int b )等价,之后如果又赋值p=function2,那么int(*p)( int a,int b )和int function2(int a,int b )等价。