第一是:函数指针的使用 ,可以不用*号,也能正确使用
创新互联公司制作网站网页找三站合一网站制作公司,专注于网页设计,成都网站建设、做网站,网站设计,企业网站搭建,网站开发,建网站业务,680元做网站,已为1000多家服务,创新互联公司网站建设将一如既往的为我们的客户提供最优质的网站建设、网络营销推广服务!
第二是:取出指针P对应的内容,加一后 使用
1.直接调用函数,编译的时候,被调函数的地址(或偏移)直接写入指令;
2.使用函数指针时,运行期从内存中取地址,在使用call指令
理论上,这存在效率差异。
根据你的系统环境:服务器、PC还是嵌入式处理器、单片机等,及你的代码的时间敏感程度:如时序严格的驱动还是MS,等等因素,自己可以判断使用。还有一点需要强调:使用函数指针是为了获得某种灵活或模型(C++编译器内部大量使用函数指针),所以,这是一种平衡。
请联系__指针数组__思考!
只是换成__函数指针数组__而已。
第二个for循环错误的原因:编译器在编译时并没有记录每个函数的长度,故
for (pptr2=*fun;pptr2;pptr2++)
{
pptr2();
(*pptr2)();
}
pptr2=*fun这样赋值没有错!
但pptr2++指向了那里?
(注意了,你没有完全整明白指针++操作!它每次移动多少字节?
答案:以指针指向的__对象的长度__作为步长!切记切记!)
移动一个指针长度吗?32位(对于32位机器)?
我看未必?
》》》如果是移动了32位,那岂不是把函数体的内容,
本题中是printf("Hello……\n\n");
作为下一个函数指针,再调用,那岂不是必死无疑?!
》》》如果是移动整个函数的长度,但编译器没有记录它的长度啊,
函数并不是常规类型,比如int,float,结构,数组......等类型,故
编译器还是无法找到第二个函数的地址!
总而言之,对函数指针进行pptr2++操作是非法的!
有2中可能,一是编译错误!二是非法操作内存!
在turboc2,vc6,vs2010中测试,结果均未能通过,编译错误!
对于
pptr2(); 和
(*pptr2)();
两种写法,c都认可,只是观点略有不同而已!
对于第一个for循环,正确!
就是pptr1++每次移动一个数组元素长度,一个函数指针的长度!
希望对你有些帮助!
不行, 原因是found函数已经声明成返回一个int指针的函数了,如果不声明p为指针则在p=founc(a,n)时会因为类型不匹配而报错。
两种方法可以解决:
1,直接省略掉变量p,在printf语句中直接用printf("%d", *found(a,n));来输出结果;
2,修改found函数为:
int found(int b[10], int n)
{
return b[n-1];
}
则p可以直接声明为int, 且赋值时用p=found(a,n); 输出时用printf("%d", p);
可以看到这样改动的比较多。