简单理解—指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kevin980123 https://blog.csdn.net/kevin980123/article/details/80245421

简单理解—指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针


指针数组

指针数组,顾名思义是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。

举个例子:


char *str[4] = {"hello", "world", "work", "hard"};
//str就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址

为什么这样定义呢?

这里就需要对优先级有一定的了解,因为 [] 的优先级高于 * ,所以 str 先与 [] 结合,表示这是一个数组变量,有四个元素。之后我们可以将 str[4] 去掉,就剩下了 char * ,表示这个数组中存放的是char * 类型的指针

数组指针

数组指针,顾名思义是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

举个例子:

char *str[4] = {"hello", "world", "work", "hard"};
char *(*pstr)[4] = str;
//pstr就是我定义的一个数组指针,它存放着数组str的地址
//str数组有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址

为什么这样定义呢?

因为 [] 的优先级高于 * ,所以需要加上()来保证 pstr 先与 * 结合,表示这是一个指针变量,它存放着数组str的地址。之后我们可以将 * pstr 去掉,就剩下了 char * [4] ,表示这个指针指向的是一个数组,这个数组里面存放了四个char * 类型的指针

函数指针

函数指针,顾名思义是”函数的指针”,也就是指向函数地址的一个指针变量

举个例子:


int Add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1;
    int b = 2;
    int (*pfun)(intint) = Add(a, b);
    //Add是一个简单的加法函数
    //pfun就是我定义的一个函数指针,它存放着函数Add的地址
    printf("%d\n", pfun);
    return 0;

}

为什么这样定义呢?

同样的,因为 () 的优先级高于 * ,所以需要加上()来保证 pfun 先与 * 结合,表示这是一个指针变量,它存放着函数Add的地址。之后我们可以将 * pfun 去掉,就剩下了 int () ,表示这个指针指向的是一个函数,这个函数有两个int型参数,它的返回值为int类型。

函数指针数组

函数指针,顾名思义是”函数指针的数组”,也就是一个用来存放函数指针的数组
函数指针的用途:转移表

举个例子:(计算器)


#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)
{
    if (y == 0)
    {
        return 'F';
    }
    else
    {
        return x / y;
    }
}

int main()
{
    int a = 0;
    int b = 0;
    int input = 1;
    char ret = 0;
    int(*p[5])(int a, int b) = { 0, Add, Sub, Mul, Div }; 
    //
    //转移表
    //p就是我定义的一个函数指针数组,它有五个元素,每个元素是一个函数指针,这些指针存放着其对应函数的地址
    while (input)
    {
        printf("**********************************\n");
        printf("***** 1.Add            2.Sub *****\n");
        printf("***** 3.Mul            4.Div *****\n");
        printf("*****         0.Quit         *****\n");
        printf("**********************************\n");
        printf("\n请选择:");
        scanf("%d", &input);
        if (input >= 1 && input <= 4)
        {
            begin:
            printf("\n请输入操作数:");
            scanf("%d %d", &a, &b);
            ret = p[input](a, b);
            if (ret == 'F')
            {
                printf("\n输入有误,请重新输入\n");
                goto begin;
            }
            else
            {
                printf("\nret = %d\n\n", ret);
            }
        }
        else if (input == 0)
        {
            printf("\n退出\n\n");
        }
        else
        {
            printf("\n选择错误\n\n");
        }
    }
    return 0;
}

指向函数指针数组的指针

如何定义?


void test(int x)
{
    printf("hehe\n");
}

int main()
{
    //函数指针pfun
    void(*pfun)(int) = test;
    //函数指针数组pfunarr
    void(*pfunarr[5])(int);
    pfunarr[0] = test;
    //指向函数指针数组pfunarr的指针ppfunarr
    void(*(*ppfunarr)[10])(int) = &pfunarr;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kevin980123/article/details/80245421
今日推荐