指针数组 数组指针 函数指针

【1】指针数组和数组指针
指针数组:望文生义就是一个数组成员为指针的数组。

int *arr1[10];
char *arr2[10];

运算符*的优先级低于”[ ]”,所以说变量名先和哪个运算符结合就表示哪种类型,比如上面arr1先和”[ ]”结合,则表示它是一个数组,是一个数组成员为指针的数组,而数组指针同样,看结合的对象

int(*p1)[10];
char(*p2)[10];

“( )”优先级最高,p1先和*结合,则表示他是一个指针,指向一个数组,即数组指针
【应用】:

int arr[10] = { 0 }; 
int*p1 = &arr;//ok? 
int (*p2)[10] = &arr;//ok?

显而易见arr的地址用p2存放合适,&arr表示数组的地址,某类型的地址用该类型的指针指向合适,即数组指针。
【2】函数指针
望文生义:指向函数的指针
函数地址
如上图一样,函数也有地址,那么函数的地址应该怎样保存。
和数组一样,函数也有自己的保存方式,即函数指针,(存放函数的地址)指向一个函数的指针。

void test()
{
    printf("小胖墩\n");
}
//怎样保存函数test的地址
void (*p1)();
//说明p1是指针,指向一个函数,指向的函数无参数,返回值类型是void

【应用】:
1.char * *fun1(char p1,char p2);
2.char *(*fun2)(char *p1,char *p2);
fun1先和( )结合,所以fun1是一个函数,是一个由两个参数构成的,返回值类型为char** 型的函数;fun2先和结合,所以fun2是一个指针,指向一个函数,(函数为两个参数,返回值类型为char)。
【3】函数指针数组和函数指针数组的指针
1.函数指针数组:一个数组,里面存放的是函数的地址(函数指针)

int(*arr[10])(int a);

arr是一个数组名,arr数组内有十个函数指针,这些指针指向一个参数为int型,返回值类型为int的函数。
2.函数指针数组的指针:一个指针,指向一个数组,数组里面存放的是函数的地址(即指向函数的指针)

char (*(*arr)[5])(char* a, char* b);

arr是个指针,指向一个数组,数组里面有五个函数指针,这些函数指针指向参数为插入char*,返回值类型为char的函数。
【应用】:计算器

int Add(int a, int b)
{
    return a + b;
}
int Sub(int a, int b)
{
    return a - b;
}
int Mul(int a, int b)
{
    return a * b;
}
int Div(int a, int b)
{
    return a / b;
}
int main()
{
    int x = 0, y = 0;
    int input = 0;
    int ret = 0;
    int(*arr[5])(int x, int y) = { 0,Add,Sub,Mul,Div };//函数指针数组,存放函数地址的数组
    printf("-----------------------\n");
    printf("1.Add             2.Sub\n");
    printf("3.Mul             4.Div\n");
    printf("-----------------------\n");
    do
    {
        printf("请选择>");
        scanf("%d", &input);
        if (input >= 1 && input <= 4)
        {
            printf("请输入数字>");
            scanf("%d %d", &x, &y);
            ret = (*arr[input])(x, y);
            printf("ret=%d\n", ret);
        }
        else
            printf("error\n");
    } while (input);

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值