数组指针及回调函数的介绍

文章详细介绍了C语言中的指针类型,包括整型指针、字符指针和数组指针的用法。特别强调了数组指针的特殊性,指出数组名是数组首元素的地址,并展示了如何正确存储数组地址的方法。此外,还阐述了回调函数的概念,通过一个计算器的例子展示了回调函数如何简化代码,提高效率。
摘要由CSDN通过智能技术生成

数组指针是一种指针 - 是指向数组的指针。

整形指针 - 指向整型的指针

字符指针 - 指向字符的指针

但是数组指针的使用需要注意,数组名是数组首元素的地址

1.整型指针 字符指针:

int main()
{
    int a = 10;
    int*pa = &a;
    char ch = 'w';
    char* pc = &ch;

    return 0;

}

2.数组指针:

int main()
{
    int arr[10] = {1,2,3,4,5};
    &arr;//取出数组的地址
    //arr;//arr - 数组名是数组首元素的地址 - arr[0]的地址

    return 0;

}

那该怎样将数组的的地址放到指针中呢?

注:这里不能用 int* parr = &arr

原因:这里的parr是一个指针 ,指向的是 int,但 &arr又是一个数组的地址

数组的地址放到整型里不匹配

使用方法:
int (*parr)[10] = &arr

解释:1.(*parr)- parr首先和*结合说明parr是一个指针

2.(*parr)[10] - 说明指向的是一个数组,这个数组里有10个元素

3. int (*parr)[10] - 说明数组里的每一个元素都是整型

这里的parr就是一个数组指针 - 其中存放的就是数组的地址。

1.整型数组的指针

int main()
{
int* arr[5];
int* (*p2)[5] = &arr;

return 0;
}
注:这里的p2是指向【整型数组指针】的数组

2.函数指针数组

int main()
{
int (*p) (int, int); //函数指针
int(*p2[4]) (int, int); //函数指针的数组
int(*(*p3)[4]) (int, int) = &p2; //p3就是一个指向函数指针数组的指针
return 0;
}
解释:
1. p[2]4 是一个数组指针,指向的类型为函数指针
2. p[3]4也是一个数组指针,指向的类型为函数指针的数组

需知:(数组元素类型 - int 数组的类型是 - int [10])

int main()
{
    int arr[10];
    //数组元素类型 - int
    //数组的类型是 - int [10]

    return 0;

}

回调函数

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

解释:假设写了一个A函数,我们不是直接去调用这个A函数,而是把A函数的地址传给了B函数,所以B函数的形参部分一定有一个函数指针,在B函数中通过函数指针来访问A函数,我们就说这是回调函数。

回调函数的运用:(利用回调函数完成计算器)

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)
{
    return x / y;
}

void menu()
{
    printf("*******************************\n");
    printf("**   1. Add       2.  Sub    **\n");
    printf("**   3. Mul       4.  Div    **\n");
    printf("**      0.  exit             **\n");
    printf("*******************************\n");

}

int Calc(int(*pf)(int, int))
{
    int x = 0;
    int y = 0;
    printf("请输入2个操作数>:");
    scanf("%d %d", &x, &y);

    return pf(x, y);

}


int main()
{
    int inupt = 0;

    do {
        menu();


        int ret = 0;
        printf("请选择:>");
        scanf("%d", &inupt);
        switch (inupt)
        {
        case 1:
            ret = Calc(Add);
            printf("ret = %d\n", ret);
            break;
        case 2:
            ret = Calc(Sub);
            printf("ret = %d\n", ret);
            break;
        case 3:
            ret = Calc(Mul);
            printf("ret = %d\n", ret);
            break;
        case 4:
            ret = Calc(Div);
            printf("ret = %d\n", ret);
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("选择错误,请重新选择!\n");
            break;

        }


    } while (inupt);


    return 0;


}

在这段代码中,写出了一个Calc函数,就是回调函数。*pf就是一个函数指针,分别指向四种算法。如果不用回调函数的话,switch语句中的每一项会非常冗杂且重复,回调函数更简便,更快捷地完成了这个计算器。

calc函数中的return pf(x , y),通过pf调用x y 来进行一个结果的计算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值