函數指針有兩種使用方法

函數指針有兩種使用方法

第一種
一、聲明
void myFun(int x); //函數聲明;
void (*funP)(int); //函數型指針聲明,写成void(*funP)(int x),但习惯上一般不这样寫。

二、綁定
funP = &myFun; //将myFun函数的地址赋给funP变量,既:指針與函數綁定
//myFun与funP的类型关系,类似于int 与int *的关系。
三、調用
myFun(100); //一般的函数调用
(*funP)(200); //通过函数指针变量来调用函数

 

第二種
一、聲明
void myFun(int x);
void (*funA)(int);

二、綁定
funA = myFun; //将myFun函数的地址赋给funP变量,既:指針與函數綁定
//myFun与funA的类型关系类似于int 与int 的关系。
三、調用
myFun(100); //一般的函数调用
funA(200); //通过函数指针变量来调用函数

 

总结:
1、 其实,myFun的函数名与funP、funA函数指针都是一样的,即都是函数指针。myFun函数名是一个函数指针常量,而funP、funA是函数指针变量,这是它们的关系。
2、 但函数名调用如果都寫成(*myFun)(10)这样,书写和读都不方便和不习惯。故C语言的设计者才会设计成還可寫成myFun(10)这种形式。因形如數學的函數調用故得函數之名。
3、 为了统一调用方式,funP函数指针变量也可以funP(10)的形式来调用。
4、 赋值时,即可写成 funP = &myFun; 形式,也可写成: funP = myFun。
5、 但是在声明时,void myFun(int )不能写成void (*myFun)(int )。void (*funP)(int )不能写成void funP(int )。
6、函数指针变量也可以存入一个数组内。数组的声明方法:int (*fArray[10]) ( int );
7、函数指针变量跟普通的指针一样在32位系统下大小都为4。但是函数指针常量的大小为1.
2、函数指针变量和函数指针常量存储在内存的不同位置。
3、为负值的函数指针变量(全局)的值为0。

理解:

一、聲明
void myFun(int x);
void (*funP)(int);

二、綁定
funP = &myFun;

funA = myFun;

三、調用
(*funP)(200);

funA(200);

聲明不變,必須如此;綁定和調用都有兩種,兩種等價,任選之一即可。
函數名其實就是常量型指針。佔用內存1個字節。它在內存的常量區保存。

事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.如:
1、typedef int (*FUN)(int,int); 定义一个返回值为int,带兩個int型参数的函数指针。
2、typedef int (*funcptr)(); 这个的意思是:定义一个返回值为int,不带参数的函数指针,就是说funcptr 是 int (*)()型的指针。
3、funcptr table[10]; 定义一个数组,这个数组是funcptr类型的。这个数组内的内容是一个指针,这个指针指向一个返回值为int,不带参数的函数。

結構體中的函數指針

struct DEMO //結構體DEMO有兩個變量和一個函數指針。
{
int x,y;
int (*func)(int,int); //函数指针
};

int add1(int x,int y) //實現兩個函數,以便於切換,這個是第一個
{
return x*y; //乘法
}

int add2(int x,int y) //函數二
{
return x+y; //加法
}

void main()
{
struct DEMO demo; //定義結構體變量,如同對象。
demo.func=add2; //结构体中的函数指针與函數實現綁定,如同賦值。
//demo.func=&add2; //等價的第二種方式。
printf("func(3,4)=%d\n",demo.func(3,4));//輸出函數一,既相加結果打印

demo.func=add1; //再綁定第二個函數,實現相乘。
printf("func(3,4)=%d\n",demo.func(3,4));
}

执行后终端显示:
func(3,4)=7
func(3,4)=12

---恢复内容结束---

函數指針有兩種使用方法

第一種
一、聲明
void myFun(int x); //函數聲明;
void (*funP)(int); //函數型指針聲明,写成void(*funP)(int x),但习惯上一般不这样寫。

二、綁定
funP = &myFun; //将myFun函数的地址赋给funP变量,既:指針與函數綁定
//myFun与funP的类型关系,类似于int 与int *的关系。
三、調用
myFun(100); //一般的函数调用
(*funP)(200); //通过函数指针变量来调用函数

 

第二種
一、聲明
void myFun(int x);
void (*funA)(int);

二、綁定
funA = myFun; //将myFun函数的地址赋给funP变量,既:指針與函數綁定
//myFun与funA的类型关系类似于int 与int 的关系。
三、調用
myFun(100); //一般的函数调用
funA(200); //通过函数指针变量来调用函数

 

总结:
1、 其实,myFun的函数名与funP、funA函数指针都是一样的,即都是函数指针。myFun函数名是一个函数指针常量,而funP、funA是函数指针变量,这是它们的关系。
2、 但函数名调用如果都寫成(*myFun)(10)这样,书写和读都不方便和不习惯。故C语言的设计者才会设计成還可寫成myFun(10)这种形式。因形如數學的函數調用故得函數之名。
3、 为了统一调用方式,funP函数指针变量也可以funP(10)的形式来调用。
4、 赋值时,即可写成 funP = &myFun; 形式,也可写成: funP = myFun。
5、 但是在声明时,void myFun(int )不能写成void (*myFun)(int )。void (*funP)(int )不能写成void funP(int )。
6、函数指针变量也可以存入一个数组内。数组的声明方法:int (*fArray[10]) ( int );
7、函数指针变量跟普通的指针一样在32位系统下大小都为4。但是函数指针常量的大小为1.
2、函数指针变量和函数指针常量存储在内存的不同位置。
3、为负值的函数指针变量(全局)的值为0。

理解:

一、聲明
void myFun(int x);
void (*funP)(int);

二、綁定
funP = &myFun;

funA = myFun;

三、調用
(*funP)(200);

funA(200);

聲明不變,必須如此;綁定和調用都有兩種,兩種等價,任選之一即可。
函數名其實就是常量型指針。佔用內存1個字節。它在內存的常量區保存。

事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.如:
1、typedef int (*FUN)(int,int); 定义一个返回值为int,带兩個int型参数的函数指针。
2、typedef int (*funcptr)(); 这个的意思是:定义一个返回值为int,不带参数的函数指针,就是说funcptr 是 int (*)()型的指针。
3、funcptr table[10]; 定义一个数组,这个数组是funcptr类型的。这个数组内的内容是一个指针,这个指针指向一个返回值为int,不带参数的函数。

結構體中的函數指針

struct DEMO //結構體DEMO有兩個變量和一個函數指針。
{
int x,y;
int (*func)(int,int); //函数指针
};

int add1(int x,int y) //實現兩個函數,以便於切換,這個是第一個
{
return x*y; //乘法
}

int add2(int x,int y) //函數二
{
return x+y; //加法
}

void main()
{
struct DEMO demo; //定義結構體變量,如同對象。
demo.func=add2; //结构体中的函数指针與函數實現綁定,如同賦值。
//demo.func=&add2; //等價的第二種方式。
printf("func(3,4)=%d\n",demo.func(3,4));//輸出函數一,既相加結果打印

demo.func=add1; //再綁定第二個函數,實現相乘。
printf("func(3,4)=%d\n",demo.func(3,4));
}

执行后终端显示:
func(3,4)=7
func(3,4)=12

posted on 2018-07-05 15:22  mengmeng90  阅读(347)  评论(0编辑  收藏  举报