大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#includestdio.h
创新互联建站专注于企业网络营销推广、网站重做改版、和龙网站定制设计、自适应品牌网站建设、HTML5、商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为和龙等各大城市提供网站开发制作服务。
int *d_bubblesort(int a[],int n)//数组长度为n的冒泡降序排序
{
int i,j;
int temp;
for(i=0;in;i++)
{
for(j=n-1;ji;j--)
{
if(a[j]a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a;
}
void main()
{
int i;
int *p=NULL;
int a[10]={6,5,4,1,2,3,9,8,7,10};
int *(*fun)(int*,int);
fun=d_bubblesort;
p=fun(a,10);
for(i=0;i10;i++)
{
printf("%d\t",p[i]);
}
}
第一条红线是定义一个函数指针;
第二条红线起强转作用,把0xd010f0强转为对应的函数指针类型
我写的这个程序可以帮你理解...常量地址被printab取代~
有函数: int fun(int a,int b);\x0d\x0a要定义指向该函数的指针\x0d\x0a对比指向 int a; 的指针\x0d\x0aint *p; p = a;\x0d\x0ap的定义是怎么来的?\x0d\x0a首先要保证p是一个指针类型\x0d\x0a写下(*p),\x0d\x0a然后,考虑下p的基类型,\x0d\x0ap的基类型就是变量a的类型int\x0d\x0a将int 放在(*p)前面就行了\x0d\x0aint (*p); \x0d\x0a括号可以省略,就成了 int *p;\x0d\x0a\x0d\x0a同理\x0d\x0a想要实现 pf = fun;\x0d\x0a(*pf) 将pf定义为一个指针,\x0d\x0a将fun的类型作为pf的基类型\x0d\x0afun相当于一个 int (int a,int b)类型的量\x0d\x0aint (int a,int b) (*pf);\x0d\x0a基类型中有圆括号和中括号要后移\x0d\x0aint (*pf)(int a,int b) ;//括号不能省略\x0d\x0apf = fun;\x0d\x0a调用时\x0d\x0a(*pf)(3,4); pf(3,4)都可以
整个程序的目的是对一组数据进行求最大值、最小值或平均值的操作,通过输入的指令进行相应的操作。按照不用函数指针的思路,程序大概会写成这样:(以下为伪代码)
最大值函数{...}
最小值函数{...}
平均值函数{...}
main{
输入d,则调用 最大值函数
输入x,则调用 最小值函数
输入p,则调用平均值函数
}
不过可以发现如下几点:
· 三个函数的参数形式与返回值都是完全一样的
· 按上述方法写代码,每次调用都要写清楚参数,略显啰嗦
所以就使用函数指针来重新改写代码
GetOperation这个函数本身,就是根据输入指令找到对应的 操作函数并作为函数指针返回它,然后main里直接通过函数指针调用,调用代码只需要写一次,而且甚至不用关心这个函数指针代表的到底是哪个函数
这个程序里只有三个对数据的操作所以函数指针的优点不是很明显。假设有多大100种对数据的操作,如果不使用函数指针,就要不停地写if else if else if...,使用函数指针,甚至可以事先建立一个指令字符与操作函数指针的对应列表,运行时直接在列表里搜索抽取,代码就显得干净利索
GetOperation(c)(dbData,iSize)这句话的具体执行操作是:
(下面假设输入了c='d')
首先执行GetOperation('d'),该函数返回得到GetMax(的指针),再执行GetMax(bData,iSize),即对数据求最大值的操作,函数返回得到最大值
1楼感觉对函数指针不是很了解,就不评论了. 2楼的基本还可以,但是int (*p)(),然后让它指向max函数,一个包含两个未知量的函数,这在后来的标准c里面是不支持的好像. 3楼吧,那么多*,感觉有点不大对. *是取内容,连着那么* ,我没试过,没有多少意义至少.他11级了,应该也不会怎么有错,你可以试试(我不打算加那么多*, 就不调试了).
程序里面对函数的调用,就是通过函数的入口地址,然转入函数. 这样的话,函数指针的意义就明显了.函数指针指向了函数的入口,即函数指针里是函数的入口地址. 指针不能指向函数这种说法肯定是不对的.话说回来,1楼的老兄可能看错书了,或者记错了.
类型匹配很重要,二楼的声明和使用不一致,这在老版的编译器里也是支持的.那时候ANSI标准还没有制定出来.现在而言,这种定义应该不被支持了才是.
那个声明应该如下:
int (*p)(int , int);
这样才能指向
int name(int,int)型的函数.么有实验过,但按这种写法是不错的肯定.
三楼那个********p,怎么都觉得不对.