c函数指针

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

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

上面的代码打印main()函数的地址。
输出量
c函数指针

文章图片
在上面的输出中,我们观察到main()函数具有一些地址。因此,我们得出的结论是,每个功能都有一些地址。
函数指针的声明
到现在为止,我们已经看到函数具有地址,因此我们可以创建可以包含这些地址的指针,从而可以指向它们。
函数指针的语法
return type (*ptr_name)(type1, type2…);

例如:
int (*ip) (int);

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

在上面的声明中,* fp是指向函数的指针,该函数返回一个float值并接受一个float值作为参数。
我们可以观察到,函数的声明与函数指针的声明相似,不同之处在于指针前面带有“ *”。因此,在上面的声明中,fp被声明为函数而不是指针。
到目前为止,我们已经学习了如何声明函数指针。下一步是将函数的地址分配给函数指针。
float (*fp) (int , int); // Declaration of a function pointer. float func( int , int ); // Declaration offunction. fp = func; // Assigning address of func to the fp pointer.

在上面的声明中,“ fp”指针包含“ func”函数的地址。
注意:在将功能地址分配给功能指针之前,必须先声明功能。通过函数指针调用函数
我们已经知道如何以通常的方式调用函数。现在,我们将看到如何使用函数指针来调用函数。
假设我们声明一个如下函数:
float func(int , int); // Declaration of a function.

下面给出了使用常规方法调用上述函数的信息:
result = func(a , b); // Calling a function using usual ways.

下面给出了使用函数指针调用函数的信息:
result = (*fp)( a , b); // Calling a function using function pointer.

要么
result = fp(a , b); // Calling a function using function pointer, and indirectionoperator can be removed.

通过名称或函数指针调用函数的效果是相同的。如果使用函数指针,则可以像第二种情况一样省略间接操作符。仍然,我们使用间接运算符,因为它使用户清楚我们正在使用函数指针。
让我们通过一个例子来理解函数指针。
#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函数指针

文章图片
将函数的地址作为参数传递给其他函数
我们可以像将其他参数发送给函数一样,将函数的地址作为参数传递给其他函数。
让我们通过一个例子来理解。
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函数指针

文章图片
功能指针数组
函数指针用于那些我们事先不知道将调用哪个函数的应用程序中。在函数指针数组中,数组采用不同函数的地址,并且将根据索引号调用适当的函数。
让我们通过一个例子来理解。
#include < stdio.h> float add(float, int); float sub(float, int); float mul(float, int); float div(float, int); int main() { float x; // variable declaration. int y; float (*fp[4]) (float, int); // function pointer declaration. fp[0]=add; // assigning addresses to the elements of an array of a functionpointer. 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); // Calling add() function. printf("\nSum of two values is : %f", r); r=(*fp[1]) (x, y); // Calling sub() function. printf("\nDifference of two values is : %f", r); r=(*fp[2]) (x, y); // Calliung sub() function. printf("\nMultiplication of two values is : %f", r); r=(*fp[3]) (x, y); // Calling div() function. 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函数指针】输出量
c函数指针

文章图片

    推荐阅读