理解指针数组 、数组指针、函数指针、函数指针数组、指向函数指针数组的指针

对于指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针的简单理解

指针是c语言的精华,相当重要。

1. 指针数组

    首先他是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。

举个栗子
int *p1[10] ;   //指针所指向的类型是int 
char * p;   //指针所指向的类型是char
int ** p3;     //指针所指向的类型是int*(也就是一个int*型指针)

    “[ ]”的优先级比 ” * “要高。p1先与 “[]”结合,构成一个数组的定义,数组名为p1,int * 修饰的是数组的内容,即数组的每个元素。我们可以借助下面的图加深理解:
这里写图片描述

2.数组指针

    首先它是一个指针,它指向一个数组。在32位系统下永远是占4个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

int (*p2)[3];   //指针所指向的类型是int()[3],二维指针的声明

    在这里”()”的优先级比“[]”高,”*” 号和p2构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素,
这里写图片描述

3.函数指针

    函数指针是指向函数的指针变量。因此“函数指针”本身首先应该是指针变量,只不过指针变量指向函数。函数指针有两个用途:调用函数和做函数的参数。

例如
int func(int x);  //声明一个函数
int (*f)(int x); //声明一个函数指针
f = &func;      //将func函数的首地址赋给指针f

首先看一段代码:

#include<stdio.h>
#include<stdlib.h>
void test()
{
    printf("hehe\n");
}
int main()
{
    printf("%p\n",test);
    printf("%p\n",&test);
    system("pause");
    return 0;
}

输出的结果
这里写图片描述
输出的是两个地址,这两个地址是test函数的地址。
下面我们可以将函数的地址保存起来,首先,能给存储地址就要是一个指针
请看代码

void test()
{
    printf("hehe\n");
}
void (*pfun)();   //pfun先和*结合,说明pfun是指针,指针指向的是一个函数,
指向的函数无参数,返回值类型为void

4.函数指针数组

     有一个数组,用来盛放函数指针,就是函数指针数组。

直接上代码

int (*parr[10])(); 

    parr先和[]结合,说明parr是数组,数组的内容是int(*)()类型的函数指针。

请继续看

void (*func[3])(int x);   //函数指针数组
void (*func)(int x);     //函数指针

两个放在一起对比,函数指针数组无非就像数组声明一样,在后面加了[]而已。
简直就和普通的数组一模一样,没错,无非它存储的是函数指针而已。

举个栗子(计算器)
#include<stdio.h>
#include<stdlib.h>
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 dv(int a,int b)
{
    return a/b;
}
int main()
{
    int x,y;
    int input=1;
    int ret = 0;
    int (*p[5])(int x,int y)={0,add,sub,mul,dv};
    while(input)
    {
        printf("**************************************\n");
        printf("***    1.add        2.sub          ***\n");
        printf("***    3.mul        4.div          ***\n");
        printf("**************************************\n");
        printf("请选择:");
        scanf("%d",&input);
        if(input<5 && input>0)
        {
            printf("请输入操作数 :");
            scanf("%d %d",&x,&y);
            ret = (*p[input])(x,y);
        }
        else
            printf("输入有误\n");
        printf("ret = %d\n",ret);

    }
    system("pause");
    return 0;
}

5.指向函数指针数组的指针

    指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针

定义 void ( * (*fun)[3])(int,int);
这个指针指向一个包含了3 个元素的数组;这个数组里面存的是指向函数的指针;这些指针指向一些返回值类型为void的指针、参数为整形的函数。
其实也好理解,这里的函数指针数组指针不就是一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针,仅此而已

猜你喜欢

转载自blog.csdn.net/sister_wang0712/article/details/80293190