关于函数指针
发布网友
发布时间:2022-05-18 09:11
我来回答
共4个回答
热心网友
时间:2023-10-13 05:10
在ISO C和部分编译环境下,一个函数指针用于函数调用时可以不用显式地反引用(就是*pmax),在这种情形下,你写(*pmax)(x,y)和pmax(x,y)都可以,其实你写pmax(x,y),是被非显式地反引用了的,这种非显式的反引用由编译器为你做了。但是这种有赖编译环境的边缘化特性,个人劝楼主少用。
其实,pmax(x,y);和(* pmax)(x,y);孰优孰劣对编程者来说并没有太大的意义,因为现在的编译器大多都支持这种非显式转换了,我刚才试过了,在TC上两者都可以了,估计应该没有编译器会不支持这中非显式转换了。但是从你的代码的阅读者的角度来看,用(*pmax)(x,y);更好一些,因为这可以提醒你的代码的阅读者,这里用的是一个指针的反引用来间接调用函数的,而不是一个直接的函数调用,你写pmax(x,y);如果离pmax=max很远,很容易让人误认为pmax是一个函数调用。虽然(*pmax)(x,y);比起pmax(x,y);写法上稍微复杂一点,但是能增加代码的可读性,所以从阅读者的角度来讲,(* pmax)(x,y);更好一些,而且如果你的程序篇幅很长,这样也不易产生混淆,有便于你做代码维护。
int(*pmax)();
pmax=max;
没有错,只不过编译器会警告你说你调用了没有原型声明的函数,这种情形在标准里面也不是错,只不过编译器不会检测你后面的调用传进的参数个数是否与max声明的参数个匹配,而且不会将你传进的参数自动转化为max声明中对应的形参相同的类型。所以这种用法有不妥之处,但这并不是问题的关键。并且楼主的程序在编译时,虽然会出现这样的警告,但并不影响程序的运行,程序能照常运行。
另外,C语言里面明文指出不带参数列表()的函数名被翻译为指向函数代码段在内存中的入口地址的指针,并且是右值(这就跟数组名一样)但两种情形除外:函数名作为sizeof的操作数(这是非法的),和函数调用时候的函数名,这两种情形下,函数名都不被翻译为函数指针,而是函数本身。pmax(x,y);仅仅是一种简约的写法,因为现在pmax里面放的是函数max的地址,那么运行的时候只要获取了pmax的值也就获取了max的地址,也就能找到函数max了。所以写pmax(x,y);也是被允许的,但是C标准里面绝对没有规定说这种写法就是标准写法,(*pmax)(x,y);就不是标准写法了。就是C99也同时容纳这两种写法。相反,大师们也都推崇的是(*pmax)(x,y);原因我已经在前面解释了。而(*pmax)(x,y);就相当于你已经到max所在的地址取出了整个函数。你把函数在内存中的代码整个看成一个值,然后仔细想想下面这几条语句是什么意思就会明白了:
int a[3] = { 78, 89, 99 };
int * pa = a;
pa = ? (Now you know where the array is, so you can perform any valid operation on its elements)
*pa = ? (you get the value at that address stored in pa, ie. a[0])
或者
int b = 3, * pb = &b;
pb = ?
*pb = ?
楼主,纠正你一个错误:PMAX是一个指向函数入口地址的指针,和原来的函数int MAX(int,int)中"MAX"定义是一样的。。。
pmax与max绝对不等价,虽然pmax(x,y);与max(x,y);的结果是一样的。在pmax与max都被解释为指向函数入口地址的上下文里面,pmax是一个可变更的左值,max是一个不可变更的左值,是绝对不等价的。当出现了我上面提到的两种特殊情况时,pmax的类型是函数指针,max的类型是函数,两者更不是等价的。pmax(x,y);与max(x,y);绝不等价!
(*pmax)(x,y);与max(x,y);才是等价的!
既然楼主喜欢用pmax(x,y);,那是个人的喜好,我没有什么可再多说的。不过,奉劝楼主一句,谭浩强的书最好别看。我个人对他老前辈没有任何意见,只是他的书不敢恭维!我知道,这里很多人都是看他的书的,我在这里如是说无异成为众矢之的,但是,如果一个人站在真理面前,都直不起腰,挺不起胸,不知其可!顺便说一句,昨天在网上看到有一篇文章把Herbert这位ANSI C和ISO C标准委员会里面的专家的那本备受推崇的书C: The Complete Reference都斥为C: The Complete Nonsense, 并且文章里面指出的书中的错误个个一针见血,矢矢中的,感慨良深。故在此牢*一阵,别无他意,如有任何冒犯之处,还往楼主和各位见谅。
热心网友
时间:2023-10-13 05:10
使用
int(*pmax)();
事实上表述我们定义一个函数指针,它可以指向相同申明的函数,但是,
pmax=max;
则是错误的,因为函数指针的申明和max不一致,也就是说该函数指针应该为:
int (*pmax)(int,int);
pmax = max;
使用时可以象调用类似函数一样调用,即:
z = pmax(a, b);
一般不使用:
z = (*pmax)(a, b);
除非这是早期代码!尽量不要这样用,因为它已经不是标准用法。
有时为了更好地使用函数指针,常常使用typedef,如:
typedef int(*Pmax)(int, int);
上面定义一个函数指针类型Pmax,
这样Pmax就像普遍变量一样使用,如:
Pmax ppmax; /* 象定义普通变量那些定义函数指针 */
ppmax = max;
z = ppmax(x, y);
热心网友
时间:2023-10-13 05:11
main()
{ int max(int a,int b); //定义个函数
int(*pmax)(); //定义个函数指针
int x=1,y=2,z;
pmax=max; //把函数的入口地址赋值给函数指针
z=(*pmax)(x,y); //(*pmax)其实是地址保存就是地址
//z=pmax(x,y); //pmax也也函数入口地址
printf(\"maxmum=%d\",z);
}
热心网友
时间:2023-10-13 05:11
很简单.你既然pmax=max; 就说明了这两者是等价的,都是调用了这个函数.所以结果相同.