#include <stdio.h> int main(void) { int x,y,z; int (*p)(int,int); int max(int x,int y); p = max; x = 100; y = 78; z = p(x,y); //使用函数指针调用函数 printf("&p=%x p=%x *p=%x max=%x &max=%x *max=%x\n",&p,p,*p,max,&max,*max); system("pause"); return 0; } int max(int x,int y) { if(x>y) { return x; } else { return y; } }
执行上面的代码发现:
除了&p外, p==*p==max==&max==*max 感觉有点奇怪。 大家可以帮忙解释下吗?
解决方案
20
指针是一种特殊的数据类型,你可以理解它有很多“子类型”,也就是int*和double*是不一样的,指向函数的指针也是不一样的,这里说的不一样不是值不一样,而是类型不一样,类型不一样就体现在运算符作用在它身上时效果不一样,你对一个int型指针解引用,也就是*p得到的就是指向的那个int变量,但你对一个指向函数的指针解引用得到的还是那个入口地址
就本例来说,你定义了一个函数,这个函数的入口地址假设是0x0001,那p作为一种指针,指向这个函数,也就是说p里面放的是0x0001,但p的地址(&p)不是,p是一个指针变量,它的地址是编译器分配的,例如是0x0011,也就是说0x0011的地址内存里放着一个0x0001,而*p该是什么呢?对应int型指针,那是里面放的int变量,但函数指针不是,函数入口放的是代码,怎么能把代码给你呢,所以编译器仍然把*p当做p来使用,那个max也是一样,不过max不是一个变量,只有变量才可以取地址&,但编译器也没有报错,仍然把它当做max来处理
总之,&p,p,*p的关系是由p的类型决定的,至于为什么不让&max这种东西报错,那就是编译器实现的人考虑的问题了,还有,理解指针必须和内存联系起来,没有内存的概念,很难理解透彻的
就本例来说,你定义了一个函数,这个函数的入口地址假设是0x0001,那p作为一种指针,指向这个函数,也就是说p里面放的是0x0001,但p的地址(&p)不是,p是一个指针变量,它的地址是编译器分配的,例如是0x0011,也就是说0x0011的地址内存里放着一个0x0001,而*p该是什么呢?对应int型指针,那是里面放的int变量,但函数指针不是,函数入口放的是代码,怎么能把代码给你呢,所以编译器仍然把*p当做p来使用,那个max也是一样,不过max不是一个变量,只有变量才可以取地址&,但编译器也没有报错,仍然把它当做max来处理
总之,&p,p,*p的关系是由p的类型决定的,至于为什么不让&max这种东西报错,那就是编译器实现的人考虑的问题了,还有,理解指针必须和内存联系起来,没有内存的概念,很难理解透彻的
40
40
p(); 调用函数,函数指针调用函数是不需要解引用, 但不是:不可以解引用
所以有了(*p)()的出现。 解引用还是函数指针,有点特殊
(**p)() 怎么样解释?、
解引用两次, *p是函数指针,* *p 还是函数指针
***p依然是函数指针
所以有了(*p)()的出现。 解引用还是函数指针,有点特殊
(**p)() 怎么样解释?、
解引用两次, *p是函数指针,* *p 还是函数指针
***p依然是函数指针