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

数组指针:

数组指针是一个指针,指向一个数组。
指针就是地址
int (*p)[10];
//[]的优先级高于 *,所以必须加上()保证p 与 *先结合
解释:p与*先结合,说明p是一个指针变量,指向一个数组,叫数组指针。

指针数组

指针数组是一个存放指针的数组

创建一个数组相当于在内存中开辟一块连续的空间,
int arr[2]就是开辟了一个大小为2*sizeof(int)字节的空间。
二维数组相当于特殊的一维数组。
(谁先结合就是什么类型,类型写在最后面)

函数指针

void(* pfun1)();pfun1先和 *结合,说明pfun1是一个指针,指向无参数的函数,返回值类型为void。

函数指针数组

int (*parr1[10])();
parr1先和[]结合,说明parr1是数组,数组内容是int(*)()类型的函数指针
函数指针数组的用途:转移表

#include<stdio.h>
#pragma warning (disable:4996)
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;
}
void menu()   //打印菜单
{

    printf("--------------------\n");
    printf("****1add  2sub  ****\n");
    printf("****3mul  4div  ****\n");
    printf("--------------------\n");

}
int main()
{
    int input = 1;
    int i = 0;
    int x, y;
    int ret = 0;
    int(*p[6])(int x, int y) = { 0, add, sub, mul, div }; //转移表(指针数组)
    while (input)    //循环条件
    {
        menu();    //显示菜单
        printf("请输入你的选择->\n");
        printf("----------------\n");
        scanf("%d", &input);
        if ((input<5 && input>0))   /
        {
            printf("请输入操作数->\n");
            scanf("%d%d", &x, &y);
            ret = (p[input])(x, y);
        }
        else
        {
            printf("输入有误\n");
        }
        printf("ret=%d\n", ret);      //打印输出结果
    }
    return 0;
}

函数指针数组的指针

是一个指针,指向一个数组,数组的元素都是函数指针。
如 void (*(*p)[ 5]) )( void) 这样的形式它表示 一个指向有5个元素 每个元素为指向一个返回值为空的函数 的数组的这样一个指针 。

猜你喜欢

转载自blog.csdn.net/w_j_f_/article/details/79846358