Menu
0 Comments

深入理解C语言函数指针 – windlaughing

人们率先从函数或算学SE懂得MyFun的效能。,意识到MyFalm函数名是每一函数(或长度信号)。函数的据以取名终于是什么?

函数指针变量

档案变量的内存地址可以往事在有重大意义的的POI中。,函数的首地址也以往事在某个函数指针变量中。这样的,我就可以经过这样函数指针变量来转乘所指示方向的函数了。

在C系列节目专门用语中,无论哪一个变量,永远要申报,以后就可以应用了。。函数指针变量也应当要先状况。

     函数指针变量的状况:

     void )(int) ;   将每一点状况为同每一限制因素、统计表值的函数指针变量。

    (囫囵函数指针变量的状况体式好像函数myFun的状况处似的,公正的-人们曾经变化了我的生趣,因而有每一指针指示方向MyFun函数。。自然,这样FUNP指针变量也可以指示方向SA的承认倚靠函数。。)

示例2:

#include 
#include 

void FUNP)int);   //也可以写每一判决voidFUNP)int x),但通常过错这样的。。void 富纳)int);
void myFun(int x);    //也可以写每一判决:void myFun( int );int main()
{
    //流传函数转乘
    myFun(100);

    //MyFun和FUNP当射中靶子典型相干与INT似。 和int *的相干。
    绒毛=&myFun;  //将MyFun函数的地址分理性的FUNP变量
    FUNP)200);  //经过函数指针变量来转乘函数

    //MyFun和Funa当射中靶子典型相干与INT似。 和int 的相干。
    funA=myFun;
    funA(300);

    //三个好像使混乱的说某种语言的
    绒毛400);
    (富纳)600);
    (*myFun)(1000);

    return0;
}

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

出口:

总结:

1、 实际上,MyFun的函数名和函数、funA函数指针都是似的的,就是说,它是函数指针。MyFalm函数名是函数指针坚定,和浮点十进制、富纳列岛函数数指针变量,这是他们的相干。

2、纵然,假定函数名被转乘,它只好是(*MyFun)(10),调解和标明既不实用的两个都不打扮。。因而C专门用语的造物主们才会设计成又可容许myFun(10)这种同次多项式地转乘(这样的实用的多了,它与算学射中靶子函数同次多项式似的。。

3、 一致转乘,绒毛函数指针变量也可以绒毛10)的同次多项式来转乘。

4、指定时,可以用Funp=和MyFun的同次多项式来写,它也可以写为Funp=MyFun。。

5、但在宣言的时辰,void myFun(int 不克不及写为虚空 (*myFun)(int )。void FUNP)int 不克不及写为虚空 绒毛int )。

6、函数指针变量也可以存入每一障碍物内。障碍物状况办法:int (*fArray[10]) ( int );

示例3

#include 
#include 

void FUNP)int);
void 富纳)int);
void myFun(int x);
int main()
{
    绒毛=&myFun;
    //深化懂得
    printf("sizeof(myFun)=%d\n",sizeof(myFun));
    printf("sizeof(绒毛)=%d\n",sizeof(绒毛));
    printf("myFun\t 0x%p=0x%p\n",&myFun,myFun);
    printf("绒毛\t 0x%p=0x%p\n",&绒毛,绒毛);
    printf("funA\t 0x%p=0x%p\n",&funA,富纳)
    return0;
}

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

出口:

总结:

1、函数指针变量跟普通的指针似的在32位体系下上涂料都为4。纵然函数指针坚定的上涂料为1.

2、函数指针变量和函数指针坚定往事在内存的差别职位。

3、为底片的函数指针变量(大局)的值为0。

函数指针作为某个函数的限制因素

既然函数指针变量是每一变量,自然,它也可以用作函数的限制因素。。

示例:

#include 
#include 

typedef void(*FunType)(int);
//添加每一TyPulf关键词,这样的就限界每一名为FunType函数指针典型,而过错FunType变量。
//同次多项式同样的人 typedef int* PINT;void myFun(int x);
void hisFun(int x);
void herFun(int x);
void callFun(FunType fp,int x);
int main()
{
    callFun(myFun,100);//传入函数指针坚定,作为回权利转移证书数
    callFun(hisFun,200);
    callFun(herFun,300);

    return0;
}

void callFun(FunType fp,int x)
{
    FP(x)//经过FP指针器械转移函数,在意,由FP援用的函数具有限制因素。}

void myFun(int x)
{
    printf("myFun: %d\n",x);
}
void hisFun(int x)
{
    printf("hisFun: %d\n",x);
}
void herFun(int x)
{
    printf("herFun: %d\n",x);
}

出口:

充当顾问

转载请选出出处 ^.^)

发表评论

电子邮件地址不会被公开。 必填项已用*标注