指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针

1,指针数组

指针数组,其本质还是数组,只不过它里面放的是指针。

//ep
char* p[3] = {"aaa","bbb","ccc"};
//首先,p是一个指针,指向有三个元素的数组,而每个元素又分别是一个指针,指向一个字符串。

2,数组指针

数组指针,其本质是一个指针,只不过它有能力指向一个数组。

//ep
char (*p)[3] = {'a','b','c'};
首先,*和p结合,它是一个指针,有能力指向又三个元素的数组,每个元素是字符类型。

接下来我们分析一段复杂的代码

//ep
int (*p[10])[5]
//p是一个指针,指向有10个元素的数组,每个元素里面有5个整形。

在写代码时,难免要把数组作为参数传给函数,在二维数组传参时,第一个方框的值可以省略,第二个方框的值不可以省略,

3,函数指针数组

首先,我们看一段代码;

void test()
{
    ;
}
int main()
{
    printf("%p\n",test);
    printf("%p\n",&test);
    return 0;
}

这里写图片描述
通过输出结果我们可以发现,函数也是有地址的,可以通过取地址的方式拿出函数的地址。

如果想把函数的地址保存起来,应该怎样保存呢。

//ep
void (*test)();
//首先,*和test结合,说明*test是一个指针,在向外看,有括号,括号里面是空的,说明函数没有参数,然后函数的返回类型时void

要把函数的地址拿出来放在一个数组里面,这个数组就被称为函数指针数组。

//ep
void (*test[10]) ();
//首先test和[]结合,说明test[]是一个数组,那数组的元素是什么呢,数组的元素时void (*)()类型的函数指针。

函数指针数组用途:转移表
举例:计算器
常规写法

#include<stdio.h>
int add(int x,int y)
{
    return x+y;
}
int sub(int x,int y)
{
    return x-y;
}
int mul(int x,int y)
{
    return x*y;
}
int div(int x,int y)
{
    return x/y;
}
int main()
{
    int x = 0;
    int y = 0;
    int ret = 0;
    int input = 1;
    while(input)
    {
    printf("***1,add***********\n");
    printf("***2,sub***********\n");
    printf("***3,mul***********\n");
    printf("***4,div***********\n");
    printf("***0,exit**********\n");
    printf("请输入");
    scanf("%d",&input);
    switch(input)
    {
    case 1:
    printf("请输入俩个操作数:>\n");
    scanf("%d %d",&x,&y);
    ret = add(x,y);
    break;
    case 2:
    printf("请输入俩个操作数:>\n");
    scanf("%d %d",&x,&y);
    ret = sub(x,y);
    break;
    case 3:
    printf("请输入俩个操作数:>\n");
    scanf("%d %d",&x,&y);
    ret = mul(x,y);
    break;
    case 4:
    printf("请输入俩个操作数:>\n");
    scanf("%d %d",&x,&y);
    ret = div(x,y);
    break;

    default:
    printf("输入错误\n");
    break;
    }
    printf("%d\n",ret);
    }
    return 0;
}

使用函数指针

#include<stdio.h>
int add(int x,int y)
{
    return x+y;
}
int sub(int x,int y)
{
    return x-y;
}
int mul(int x,int y)
{
    return x*y;
}
int div(int x,int y)
{
    return x/y;
}
int main()
{
    int x = 0;
    int y = 0;
    int ret = 0;
    int input = 1;
    int(*CAL[5])(int x,int y) = {0,add,sub,mul,div};
    while(input)
    {
    printf("****1.add******\n");
    printf("****2,sub******\n");
    printf("****3,mul******\n");
    printf("****4,div******\n");
    printf("****0,exit*****\n");
    printf("请选择");
    scanf("%d",input);
    if(input>=1 && input<=4)
    {
    printf("请输入两个数;\n");
    scanf("%d %d",&x,&y);
    ret = (*CAL[input])(x,y);
    }
    else
    printf("输入有错误");
    printf("%d",ret);
    }
    return 0;
}

4,函数指针数组的指针

int *test ();  //函数指针
int (*trst[3]) ();  //函数指针数组
int (*(*test[3])) (); //函数指针数组的指针
//test是一个指针指向一个有三个元素的数组,数组的每个元素都是一个函数指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值