欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-29 19:32:28
...

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


指针数组

指针数组,顾名思义是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在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;
}