您的位置:首页 > 其它

从汇编的角度分析函数指针

2013-11-29 21:55 190 查看
可能指针函数与函数指针的概念不是很清楚

1.指针函数的概念其实跟普通函数的概率类似,就是一个函数的返回值是个指针类型!

#include<stdio.h>
#include<iostream>
using namespace std;

int *pointFun(){
int *p=(int *)malloc(sizeof(int));
*p=1;
return p;
}

int main(){
int *ptemp=pointFun();
printf("%d\n",*ptemp);
}


2.函数指针还是比较有来头的

观察以下函数

#include<stdio.h>
#include<iostream>
using namespace std;

void myfun(int x){
printf("%d\n",x);
}

void (*fun)(int);
void (*fun2)(int);

int main(){

(*myfun)(10);
myfun(19);
(&myfun)(190);

fun=&myfun;
(*fun)(123);
fun(1234);
//(&fun)(1234);

fun2=myfun;
fun2(456);
(*fun2)(4567);
}


如果以前没注意的话,会不会有毁三观的赶脚 = =

看一看内存中的情况



发现*myfun,&myfun,myfun都指了同一个地方



其实:(参考http://hi.baidu.com/bellgrade/blog/item/229f792d39e0a5e68a1399f3.html

1. 其实,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。

3.函数指针的用途:

 既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。

 即函数可以作为参数传递。

#include<stdio.h>
#include<string.h>

void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至
void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10);    //⑤. 通过CallMyFun函数分别调用三个不同的函数
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
}
void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。
{
fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
}
void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同
{
printf("函数MyFun1中输出:%d\n",x);
}
void MyFun2(int x)
{
printf("函数MyFun2中输出:%d\n",x);
}
void MyFun3(int x)
{
printf("函数MyFun3中输出:%d\n",x);
}






在第一次

在fp寻找函数的时候,在汇编的指令里跳转到了myFun1的函数地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: