C语言 - 函数指针

C语言 - 函数指针 首页 / C语言入门教程 / C语言 - 函数指针

我们知道可以创建任何数据类型的指针,例如int,char,float,也可以创建指向函数的指针。函数的代码始终驻留在内存中,这意味着该函数具有某些地址。我们可以通过使用函数指针来获取内存地址。

让我们看一个简单的例子。

#include <stdio.h>
int main()
{
    printf("Address of main() function is %p",main);
    return 0;
}

上面的代码打印 main()函数的地址。

C Function Pointer

在上面的输出中,我们观察到main()函数具有一些地址。因此,我们得出的结论是,每个函数都有地址。

函数指针声明

到目前为止,我们已经看到函数具有地址,因此我们可以创建可以包含这些地址的指针,从而可以指向它们。

函数指针的语法

return type (*ptr_name)(type1, type2…);

例如:

int (*ip) (int);

在上面的声明中,* ip是指向函数的指针,该函数返回一个int值并接受一个整数值作为参数。

float (*fp) (float);

在上面的声明中, * fp 是指向函数的指针,该函数返回浮点值并接受浮点值作为参数。

我们可以观察到,函数的声明与函数指针的声明相似,不同之处在于指针的前面是'*'。因此,在上面的声明中,fp被声明为函数而不是指针。

到目前为止,我们已经学习了如何声明函数指针。下一步是将函数的地址分配给函数指针。

float (*fp) (int , int);   //函数指针的声明.
float func( int , int );   //功能说明。
fp = func;                 //将 func 的地址分配给 fp 指针。

在上面的声明中,'fp'指针包含'func'函数的地址。

通过函数指针调用函数

我们已经知道如何以通常的方式调用函数。现在,我们将看到如何使用函数指针来调用函数。

假设我们声明一个如下函数:

float func(int , int);     // 函数的声明。

下面给出了使用常规方法调用上述函数的信息:

result = func(a , b);    // 使用通常的方式调用函数。

下面给出了使用函数指针调用函数的信息:

result = (*fp)( a , b);   // 使用函数指针调用函数。

要么

result = fp(a , b);        //使用函数指针调用函数,可以去掉间接操作符。

通过名称或函数指针调用函数的效果是相同的。如果使用函数指针,则可以像第二种情况一样省略间接操作符。仍然,我们使用间接运算符,因为它使用户清楚我们正在使用函数指针。

通过示例让我们理解函数指针。

#include <stdio.h>
int add(int,int);
int main()
{
   int a,b;
   int (*ip)(int,int);
   int result;
   printf("Enter the values of a and b : ");
   scanf("%d %d",&a,&b);
   ip=add;
   result=(*ip)(a,b);
   printf("Value after addition is : %d",result);
    return 0;
}
int add(int a,int b)
{
    int c=a+b;
    return c;
}

输出

C Function Pointer

将函数的地址作为参数传递给其他函数

我们可以像将其他参数发送给函数一样,将函数的地址作为参数传递给其他函数。

include <stdio.h>
void func1(void (*ptr)());
void func2();
int main()
{
    func1(func2);
     return 0;
}
void func1(void (*ptr)())
{
    printf("Function1 is called");
    (*ptr)();
}
void func2()
{
    printf("\nFunction2 is called");
}

在上面的代码中,我们创建了两个函数,即func1()和func2()。 func1()函数包含函数指针作为参数。在main()方法中,调用func1()方法时,我们传递了func2的地址。调用func1()函数时," ptr"包含" func2"的地址。在func1()函数内部,我们通过取消引用指针'ptr'来调用func2()函数,因为它包含func2的地址。

C Function Pointer

函数指针数组

函数指针用在那些我们事先不知道将调用哪个函数的应用程序中。在函数指针数组中,数组采用不同函数的地址,并且将根据索引号调用适当的函数。

让我们通过一个例子来理解。

无涯教程网

#include <stdio.h>
float add(float,int);
float sub(float,int);
float mul(float,int);
float div(float,int);
int main()
{
    float x;             // 变量声明。
    int y;
    float (*fp[4]) (float,int);       // 函数指针声明。
    fp[0]=add;             // 为函数指针数组的元素分配地址。
    fp[1]=sub;
    fp[2]=mul;
    fp[3]=div;
    printf("Enter the values of x and y :");
    scanf("%f %d",&x,&y);
  float r=(*fp[0]) (x,y);       // 调用 add() 函数。
    printf("\nSum of two values is : %f",r);
     r=(*fp[1]) (x,y);            // 调用 sub() 函数。
    printf("\nDifference of two values is : %f",r);
      r=(*fp[2]) (x,y);           // 调用 sub() 函数。
    printf("\nMultiplication of two values is : %f",r);
     r=(*fp[3]) (x,y);          // 调用 div() 函数。
    printf("\nDivision of two values is : %f",r);
    return 0;
}

float add(float x,int y)
{
    float a=x+y;
    return a;
}
float sub(float x,int y)
{
    float a=x-y;
    return a;
}
float mul(float x,int y)
{
    float a=x*y;
    return a;
}
float div(float x,int y)
{
    float a=x/y;
    return a;
}

在上面的代码中,我们创建了一个函数指针数组,其中包含四个函数的地址。在将函数的地址存储在函数指针数组中之后,使用函数指针来调用函数。

C Function Pointer

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Linux性能优化实战 -〔倪朋飞〕

设计模式之美 -〔王争〕

深入浅出云计算 -〔何恺铎〕

恋爱必修课 -〔李一帆〕

编程高手必学的内存知识 -〔海纳〕

大厂设计进阶实战课 -〔小乔〕

AI绘画核心技术与实战 -〔南柯〕

AI 应用实战课 -〔黄佳〕

互联网人的数字化企业生存指南 -〔沈欣〕

好记忆不如烂笔头。留下您的足迹吧 :)