读书人

函数名与函数指针,该怎么处理

发布时间: 2012-06-03 16:59:40 作者: rapoo

函数名与函数指针
/************************测试程序**********************/
#include<stdio.h>

int f(int);

int main()
{

int (*fp1)(int);
int (*fp2)(int);
int (*fp3)();
int (*fp4)();

int ret1;
int ret2;
int ret3;
int ret4;

/*给函数指针赋值*/
fp1=f;
fp2=&f;
fp3=main;
fp4=&main;


/*使用函数指针调用函数*/
ret1=(*fp1)(1);
ret2=(fp1)(1);
printf("ret1=%d\n",ret1);
printf("ret2=%d\n",ret2);

ret3=(*fp2)(1);
ret4=(fp2)(1);
printf("ret3=%d\n",ret3);
printf("ret4=%d\n",ret4);

/*测试主函数和指向主函数的函数指针*/
printf("main: %#p\n",main);
printf("*main: %#p\n",*main);
printf("fp3: %#p\n",fp3);
printf("*fp3: %#p\n",*fp3);
printf("fp4: %#p\n",fp4);
printf("*fp4: %#p\n",*fp4);

return 0;
}

int f(int n)
{
return 1;
}

/******************输出结果(visual c++ 6.0)****************************/
ret1=1
ret2=1
ret3=1
ret4=1
main: 0X0040100A
*main: 0X0040100A
fp3: 0X0040100A
*fp3: 0X0040100A
fp4: 0X0040100A
*fp4: 0X0040100A

/******************问题有如下几个****************************/

第一: fp1=f 和 fp2=&f在逻辑作用是一样吗?
第二: ret1=(*fp1)(1)和ret2=(fp1)(1)的结果一样,但c标准采用的是前者(*fp1)(1),使用后者行不行(fp1)(1)?
第三: printf("main: %#p\n",main)和printf("*main: %#p\n",*main)的结果一样,如果把函数名视为一块内存区域的
逻辑首址,那为什对地址解引用(*main) 后怎么还是自身的地址?

希望得到大家热情的帮助,再次不胜感激!

[解决办法]
第一:一样
第二:你不是都试过了么……建议还是使用标准调用方式
第三:对函数解引用得到函数,函数本身就是地址。
[解决办法]
调用方式有多样的,
http://wenku.baidu.com/view/9eea9b350b4c2e3f572763fd.html
[解决办法]
这个,你要看看标准了,去把C标准里面关于函数指针的地方看看,就明白了

读书人网 >C语言

热点推荐