前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言进阶部分详解(指针进阶2)

c语言进阶部分详解(指针进阶2)

作者头像
是Nero哦
发布2024-01-18 18:29:50
900
发布2024-01-18 18:29:50
举报
文章被收录于专栏:c/c++学习与分享

大家好!我快马加鞭接着写出指针部分part2部分。第一部分见:c语言进阶部分详解(指针进阶1)_总之就是非常唔姆的博客-CSDN博客

指针初阶部分见:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客

一.函数指针

1.讲解与实例

函数指针: 在C语言中,函数指针是指向函数的指针变量。它可以像其他变量一样存储在内存中,并且可以通过函数指针来调用相应的函数。 声明函数指针:returnType (*pointerName)(parameterTypes); 其中:

  • returnType 是函数的返回类型。
  • pointerName 是函数指针的名称。
  • parameterTypes 是函数的参数类型
代码语言:javascript
复制
// 定义一个函数
int add(int a, int b) {
    return a + b;
}

int main()
{
    // 声明一个函数指针
    int (*funcPtr)(int, int);

    // 将函数指针指向add函数
    funcPtr = add;

    // 通过函数指针调用函数
    int result = funcPtr(2, 3);  // 结果为5   平时调用函数时都是函数名(地址),也可以想通
    int result = (*funcPtr)(2, 3);  // 这两种均可以,funcPtr是地址,通过*解引用来找到
    return 0;
}

2.《C陷阱和缺陷》中两段经典代码

2.1 ( * ( void ( * )( ) ) 0 ) ( );

//代码1 ( * ( void ( * )( ) ) 0 ) ( );

  1. void ( * )( )这是一个函数指针的类型声明。它表示一个没有参数并且返回类型为void的函数指针
  2. ( void ( * )( ) )0 这是对0进行强制类型转化,转换为函数指针类型
  3. * ( void ( * )( ) ) 0 对地址为0的函数地址解引用
  4. ( * ( void ( * )( ) ) 0 ) ( ) 调用这个函数
2.2void ( * signal( int , void( * ) ( int ) ) ) (int);

//代码2 void ( * signal( int , void( * ) ( int ) ) ) (int); void (*signal(int, void (*)(int)))(int):这是一个函数声明的语法。它表示signal是一个函数,接受两个参数:一个int类型的参数和一个指向接受int类型参数并返回void的函数指针的参数。该函数返回一个指向接受int类型参数并返回void的函数指针的结果

二.函数指针数组

1.讲解与实例

函数指针数组: 函数指针数组是一个数组,其中的每个元素都是一个函数指针。可以将不同的函数指针存储在数组中,并根据需要使用它们 声明函数指针数组:return_type (*array_namesize)(parameter_list);

  1. return_type:函数指针指向的函数的返回类型。
  2. (*array_name):函数指针数组的名称。它是一个指针,指向一个数组。
  3. [size]:函数指针数组的大小。它表示数组中函数指针的数量。
  4. (parameter_list):函数指针指向的函数的参数列表

相比于函数指针只是多了一个 在函数名后面而已

代码语言:javascript
复制
// 定义函数1
void func1(int num) {
    printf("This is function 1. Number: %d\n", num);
}

// 定义函数2
void func2(int num) {
    printf("This is function 2. Number: %d\n", num);
}

// 定义函数3
void func3(int num) {
    printf("This is function 3. Number: %d\n", num);
}

int main() {
    // 将函数指针赋值给函数指针数组的元素
    void(*pf[3])(int) = { &func1,&func2, &func3 };

    // 调用函数指针数组中的函数
    for (int i = 0; i < 3; i++) {
        pf[i](i);
    }
    return 0;
}

2.使用来实现计算器

代码语言:javascript
复制
void menu()
{
    printf("******************************\n");
    printf("***   1.add        2.sub   ***\n");
    printf("***   3.mul        4.div   ***\n");
    printf("***   0.exit       ***********\n");
    printf("******************************\n");
}

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;
}


int main()
{
    int input = 1;
    int result = 0;
    int a = 0;
    int b = 0;
    while (input)
    {
        menu();
        printf("请输入:\n");
        scanf("%d", &input);//根据menu来输入数字啦
        int(*pf[5])(int, int) = { NULL,add,sub,mul,div };//第一个是NUll是为了使数字与菜单对应
        if (input >= 1 && input <= 4)
        {
            printf("请输入两个数\n");
            scanf("%d %d", &a, &b);
            result = pf[input](a, b);
            printf("%d\n", result);
        }
        else if(input==0)
        {
            printf("退出计算器");
        }
        else
        {
            printf("输入有误,请重新输入");
        }
    }
    return 0;
}

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

指向函数指针数组的指针是一个 指针,指针指向一个数组 ,数组的元素都是函数指针 指向函数指针数组的指针的语法如下: return_type (*(*pointer_name)size)(parameter_list);

  1. return_type:函数指针指向的函数的返回类型。
  2. (*pointer_name):指向函数指针数组的指针的名称。它是一个指针,指向一个函数指针数组。
  3. [size]:函数指针数组的大小。它表示数组中函数指针的数量。
  4. (parameter_list):函数指针指向的函数的参数列表

相比与函数指针数组只是在名字前多一个*来说明是指针而已


四.回调函数

1.讲解

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

2.事例

代码语言:javascript
复制
int add(int x, int y)
{
    return x + y;
}

// 定义一个回调函数
void callback(int result) 
{
    printf("回调函数被调用,结果为:%d\n", result);
}

// 定义一个函数,接受一个函数指针作为参数
void performOperation(int (*operation)(int, int), int a, int b, void (*callback)(int)) 
{
    int result = operation(a, b);
    callback(result);
}

int main()
{
    // 调用函数,并传递回调函数作为参数
    performOperation(add, 2, 3, callback);
	return 0;
}

今天的内容先到这里了,下一次不出意外是针对回调函数进行更加详细事例演示及模拟。

感谢大家的支持!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.函数指针
    • 1.讲解与实例
      • 2.《C陷阱和缺陷》中两段经典代码
        • 2.1 ( * ( void ( * )( ) ) 0 ) ( );
        • 2.2void ( * signal( int , void( * ) ( int ) ) ) (int);
    • 二.函数指针数组
      • 1.讲解与实例
        • 2.使用来实现计算器
        • 三.指向函数指针数组的指针
        • 四.回调函数
          • 1.讲解
            • 2.事例
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档