函数指针,函数指针数组,函数返回值为函数指针

 

函数的名字就是函数的首地址:定义函数指针;
int (*p)(int )    
p为函数指针变量名字,int 为函数的返回值类型为int型;(int)为函数的形参类型为int型,
注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 
注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了,
#include<stdio.h>
#include<stdlib.h>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int multiplition(int a, int b)
{
    return a*b;
}
int dive(int a, int b)
{
    return a / b;
}

void main1()
{
    int(*p(int, int))(int, int);//p(int,int)函数的返回值类型为int(*)(int ,int)(函数指针类型)

    system("pause");
}
void main2()
{
    int a = 10; int b = 20;
    //定义一个二维函数指针数组
    int(*p[])(int, int) = { add, sub, multiplition, dive };//【】内可以写数组 的长度,也可以不写,和普通数组一样的
    //用函数指针掉用函数
    printf("%d", p[1](a, b));
    //通过遍历函数指针调用函数和遍历数组一样的
    for (int i = 0; i < 4; i++)
    {
        printf("%3d", p[i](a, b));
    }

    //因为*(p+i)和p[i]是等价的所以:
    for (int(**ps)(int, int) = p; ps < p + 6; ps++)
    {
        printf("%3d", (*ps)(a, b));
    }
    //int(*p)(int ,int )
    //int (*p[])(int ,int)
    //int(**p)(int ,int )
    

    system("pause");
}
void main33()
{
    //int a[3]={1,2,3}
    //int (*p[])(int,int)={add, sub, multiplition, dive }
    //a和p都是常量,所以不能a=a,p=p

    //int *pa=(int[]){1,2,3};这是在栈上开辟内存
    //int(**pt)(int ,int)二级函数指针,存储函数指针数组名
    //函数指针数组类型为int(*[])(int,int)
    int(**pp)(int, int) = (int(*[])(int, int)){ add, sub, multiplition, dive };

    for (int i = 0; i < 4; i++)
    {
        //这两种方法是
        printf("%3d", pp[i](100, 10));
        //printf("%d\n", (*(pp + i))(100, 10));
    }


    system("pause");

}

void main44()
{
    //在堆上开辟内存
    int(**pp)(int, int) = malloc(4 * sizeof(int(*)(int, int)));
    //对每个数组元素分别赋值;
    *pp = add;
    *(pp + 1) = sub;
    *(pp + 2) = multiplition;
    *(pp + 3) = dive;
    //分别调用
    for (int i = 0; i < 4; i++)
    {
        printf("%3d", (*(pp + i))(100,20));
    }
    system("pause");
}
//普通指针,数组 和 函数指针,函数指针数组


//int *p         int (*p)(int ,int )
//int*p[4]        int (*p[])(int ,int )
//int **p          int (**p)(int ,int)



//typedef 简化书写
//先定义变量, 类型+变量名
//typedef 类型+变量名
//变量名就是类型的别名

 //  int X;
typedef int X;
   

  // int Y[10];
typedef int Y[10];

//int(*Z)(int, int);
typedef int(*Z)(int, int);

//int(*W[])(int, int);
typedef  int(*W[])(int, int);
//int (**PP)(int ,int )
typedef int(**PP)(int, int);
   
void main55()
{
    X x1;
    Y y1;
    Z z1;
    W w1 = { add, sub, };
    PP pp1 = (W){ add, sub };
    printf("%3d", sizeof(w1));

    


    system("pause");
}
//int (** x(    int (*z)(int ,int),int,double    )       )(int);

// x(    int (*z)(int ,int),int,double    )

//x()函数的形参为int (*z)(int ,int),int,double 

// int (*z)(int ,int)为函数指针 

//int (**                  )(int)   是函数返回值类型

//x的返回值二级函数指针,参数,有一个函数指针,int,double, 
//x是一个函数
//z函数指针

//int  (*p)[5];//指向数组的指针
//int *p[5];//数组,每一个元素是一个指针

//int( *p[5])(int, int);//函数指针数组
//int( (*(p))[5])(int, int);//指针指向函数指针数组

void  main()
{


    int(*p[5])(int, int);
    int(*(*p)[5])(int, int);//指向 函数指针数组的指针,
    //*p为一个指针,int(*[5])(int, int)为函数指针数组就好理解了,


    system("pause");
}

 

posted @ 2015-04-24 01:59  半路出家的和尚不嫖娼  阅读(294)  评论(0编辑  收藏  举报