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

1.指针数组

指针数组本质上是数组,例如int *arr[4] ,arr是先跟[ ]结合再跟结合,所以其是一个指针数组,数组里存放的元素是4个 int

2.数组指针

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,这个指针不可移动); 例如int(*arr)[4] , 因为 * 先跟 arr 结合,再跟 [ ] 结合,所以其是一个数组指针。

这里写图片描述
二维数组的传参可以运用数组指针,

void test()
{
   int arr[3][4]={0};
   print(arr);//传参时数组降级为指针
}
void print(int (*arr)[4])//列不能省略,确定指针移动的长度
{...}//打印代码就不再赘写

其实指针数组和数组指针的区别方法就是看变量先跟 [ ] 结合还是跟 * 结合,先跟[ ]结合就是指针数组,先跟 * 结合就是数组指针。

3.函数指针

函数指针就是存放函数地址的指针。C在编译时,每一个函数都有一个入口地址,有了指向函数的指针变量就可以通过指针调用该函数。函数指针有两个用途:调用函数和做函数的参数。

函数指针调用函数:
这里写图片描述

函数指针做函数的参数:如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

#include<stdio.h>

typedef int(*callback)(char *str); // 回调函数的名称为 callback,参数是char *str
int functionA(char *str)
{
    printf("回调 functionA(char *str) 函数:%s!\n", str);
    return 0;
}

// 调用回调函数:直接通过函数指针
int test1(int(*ptr)(), char *str)
{
    printf("test1:\n不调用回调函数打印:%s!\n", str);
    (*ptr)(str);
}

int main()
{
    char *str = "hello world!";

    test1(functionA, str);

    printf("test2:\n");
    callback test2 = functionA;
    test2(str);

    return 0;
}

这里写图片描述

4.函数指针数组

把函数的地址放到一个数组中,那么这个数组就叫做函数指针数组。例子: int (*p[5])(fun) 。

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

指向函数指针数组的指针实质上是一个指针。指针指向一个数组,数组里放的都是函数指针。
定义:

void fun(const char* str)
{
    printf("%s\n",str);
}
int main()
{
    char str = "How are you";
    void (*pfun)(const char*) = fun;//函数指针pfun
    void (*pfunArr[5])(const char* str);//函数指针的数组pfunArr
    pfunArr[0] = fun;
    void (*(*ppfunArr)[5])(const char*) = &pfunArr;
    //指向函数指针数组pfunArr[5]的函数指针数组的指针
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值