对【数组指针】【指针数组】【函数指针】【函数指针数组】以及【指向函数指针数组的指针】的理解

版权声明: https://blog.csdn.net/spaceman_c/article/details/80150284

变量类型判断:变量和那个关键字结合,该变量就是什么类型;

1. 数组指针
定义 int ( * p)[n]; ; ( )优先级高,p先和 * 结合,所以是一个数组指针,该指针指向一个数组,这个数组长度是 n 。
将二维数组附给一指针:
int a[3][4];
int (*p)[4]; //定义一个数组指针,指向含4个元素的一维数组;
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0];
p++; //p=p+1;p跨过行a[0][]指向了行a[1][ ];
* 数组指针只是一个指针变量,他在内存中只占一个指针的存储空间;

2. 指针数组
定义 * p[n]; , [ ]的优先级高于 * ,p先和 [ ]结合,所以是一个指针数组,数组里面的元素是指针;
p+1,则p指向下一个数组元素,这样赋值是错误的;
p=a,因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。
*p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
* 指针数组是多个指针变量,占多个指针存储空间。

3. 函数指针
指向函数的指针变量,(函数名和对函数名取地址是一样的)
* int ( * pfun1) () ; ; pfun1先和 * 结合,说明pfun1是一个指针,指针指向一个函数,指向的函数无参数,返回值类型为 void ;
函数指针的用途:调用函数和做函数的参数;
函数指针的声明方法:返回类型 (标识符指针变量名)(形参列表)
代码1: (*(void(*)())0)();
分析这个代码:

  1. void(*)( )是一个函数指针类型,没有参数,没有返回值;
  2. 把常数0强制转化为返回值为void的函数的指针类型;
  3. 对0这个函数指针类型解引用得到函数;
    使用typedef表述为:
    typedef void (*funcptr)();
    (*(funcptr)0)();

    代码2:void(*signal(int, void(*)(int)))(int);
    分析这个代码:

    1. signal是个函数;
    2. signal有两个参数,第一个为int类型,第二个为函数指针;
    3. signal函数的返回类型是一个函数指针类型,该指针指向的函数有一个整形参数,参数返回为void;

    4. 函数指针数组
    函数指针数组是一个其元素是一个函数指针的数组;
    函数指针数组声明:int (*funs[2])(int a,int b) ;funs先和[ ]结合,说明funs是一个数组,该数组有两个元素,每个元素都是函数指针类型;
    * 使用函数指针数组实现 计算器;

#include<stdlib.h>
#include<stdio.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 = 0;
    int y = 0;
    int input = 1;
    int ret = 0;
    int (*p[5])(int x, int y) = { 0,add,sub,mul,dv };
    while (input)
    {
        printf("  1:add    2:sub   \n");
        printf("  3:mul    4:div   \n");
        printf("请选择:");
        scanf_s("%d", &input);
        if((input<5&&input>0))
        {
            printf("输入操作数:");
            scanf_s("%d %d", &x, &y);
            ret = (*p[input])(x, y);

        }
        else
        {
            printf("输入有误\n");

        }
        printf("ret=%d\n", ret);
    }
    system("pause");
    return 0;
}

这里写图片描述

5.指向函数指针数组的指针
指向函数指针数组的指针是一个 指针,指针指向一个数组,数组的元素都是函数指针;
* char ( * ( * a)[4])(char *p) ; 这个指针指向包含了4个元素的数组;这个数组里面存的是指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。

猜你喜欢

转载自blog.csdn.net/spaceman_c/article/details/80150284