C语言功能指针
我们知道我们可以创建任何数据类型的指针,例如int,char,float,我们还可以创建指向函数的指针。函数的代码始终驻留在内存中,这意味着该函数具有某些地址。我们可以使用函数指针获取内存地址。
让我们看一个简单的示例。
#include <stdio.h>
int main()
{
printf("Address of main() function is %p",main);
return 0;
}
上面的代码打印 main()函数的地址。
输出
在上面的输出中,我们观察到main()函数具有一些地址。因此,我们得出的结论是每个函数都有一些地址。
函数指针的声明
到目前为止,我们已经看到函数具有地址,因此我们可以创建可以包含这些地址的指针,因此可以指向它们。
函数指针的语法
return type (*ptr_name)(type1, type2…);
例如:
在上面的声明中,* ip是指向函数的指针,该函数返回一个int值并接受一个整数值作为参数。
在上面的声明中, * fp 是一个指针,该指针指向一个返回浮点值并接受浮点值作为参数的函数。
我们可以观察到函数的声明与函数指针的声明相似,不同之处在于指针的前面是'*'。因此,在上面的声明中,fp被声明为函数而不是指针。
到目前为止,我们已经学习了如何声明函数指针。下一步是将函数的地址分配给函数指针。
float (*fp) (int , int); // Declaration of a function pointer.
float func( int , int ); // Declaration of function.
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 indirection operator 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;
}
输出
将函数的地址作为参数传递给其他函数
我们可以将函数的地址作为参数传递给其他函数,就像我们将其他参数发送给函数一样。
通过示例让我们理解。
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的地址。
输出
函数指针数组
函数指针用于那些我们事先不知道将调用哪个函数的应用程序。在函数指针数组中,数组采用不同函数的地址,然后将根据索引号调用适当的函数。
通过一个例子来理解。
#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 function pointer.
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;
}
在上面的代码中,我们创建了一个函数指针数组,其中包含四个函数的地址。在将函数的地址存储在函数指针数组中之后,我们使用函数指针进行调用。
输出