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

2024-01-18 18:29:50 浏览数 (1)

大家好!我快马加鞭接着写出指针部分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: %dn", num);
}

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

// 定义函数3
void func3(int num) {
    printf("This is function 3. Number: %dn", 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("%dn", 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("回调函数被调用,结果为:%dn", 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;
}

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

感谢大家的支持!!

0 人点赞