关于函数指针的理解

C语言 码拜 9年前 (2016-04-01) 1410次浏览
#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这种东西报错,那就是编译器实现的人考虑的问题了,还有,理解指针必须和内存联系起来,没有内存的概念,很难理解透彻的

40

没什么奇怪啊,函数指针解引了还是函数指针
上面式子还等于 ***************p

40

p();  调用函数,函数指针调用函数是不需要解引用, 但不是:不可以解引用
所以有了(*p)()的出现。  解引用还是函数指针,有点特殊
(**p)() 怎么样解释?、
解引用两次, *p是函数指针,* *p 还是函数指针
***p依然是函数指针

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于函数指针的理解
喜欢 (0)
[1034331897@qq.com]
分享 (0)