高级指针相关内容

1.函数指针
函数指针就是函数的指针;它是一个指针,指向一个函数。
看代码如下:
A) char * (*fun1)(char * p1,char * p2);
B) char * *fun2(char * p1,char * p2);
C) char * fun3(char * p1,char * p2);

解释如下:
C) fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型。
B) 与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
A) fun1是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。

接下来就给大家一个应用函数指针有关积分计算的例子:
#include <stdio.h>  
   
//Calculate用于计算积分。一共三个参数。第一个为函数指针func,指向待积分函数。二三参数为积分上下限  
double Calculate(double(*func)(double x), double a, double b)  
{  
    double dx = 0.0001;//细分的区间长度  
    double sum = 0;  
    for (double xi = a+dx; xi <= b; xi+=dx)  
    {  
       double area = func(xi)*dx;  
       sum +=area;  
    }  
    return sum;  
}  
   
double func_1(double x)  
{  
    return x*x;  
}  
   
double func_2(double x)  
{  
    return x*x*x;  
}  
   
void main()  
{  
    printf("%lf\n", Calculate(func_1, 0, 1));  
    printf("%lf\n", Calculate(func_2, 0, 1));  
}  

2.函数指针数组
函数指针数组是一个其元素是函数指针的数组。也就是说,此数据结构是一个数组,且其元素是一个指向函数入口地址的指针。
首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组名[])().请注意,因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是元素返回值类型为指针的函数数组。
例如:
void (*funcPointerArray[3])(double x);//函数指针数组 
void (*funcPointer)(double x);//函数指针
如何使用:
void f1(double x){}  
void f2(double x){}  
void f3(double x){}  

来三个具体的函数,f1,f2,f3

void (*funcPointerArray[3])(double x);  
funcPointerArray[0]=f1;  
funcPointerArray[1]=f2;  
funcPointerArray[2]=f3;  
   
funcPointerArray[0](“2.333333”);  
funcPointerArray[1](“6.666666”);  
具体应用:
#include <stdio.h>  
  
void addItem(char *name)  
{  
    printf("Add %s successfully!\n",name);  
}  
  
void deleteItem(char *name)  
{  
    printf("Delete %s successfully!\n", name);  
}  
  
void findItem(char *name)  
{  
    printf("Find %s successfully!\n", name);  
}  
  
void updateItem(char *name)  
{  
    printf("Update %s successfully!\n", name);  
}  
  
void main()  
{  
    void(*funcPointerArray[4])(char *name);  
    funcPointerArray[0] = addItem;  
    funcPointerArray[1] = deleteItem;  
    funcPointerArray[2] = findItem;  
    funcPointerArray[3] = updateItem;  
    printf("Please enter a number(0-3) to continue:");  
    int num;  
    scanf_s("%d", &num,1);  
    printf("Please enter the name of the goods:");  
    char buf[128];  
    scanf_s("%s", &buf,128);  
    funcPointerArray[num](buf);  
}  

3.线性表
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移
表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input < 4 && input > 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值