C语言中函数指针的例子

None.gif// zhizhen.cpp : 定义控制台应用程序的入口点。
ExpandedBlockStart.gifContractedBlock.gif
/**//*
InBlock.gif    函数指针的例子
InBlock.gif    061105
ExpandedBlockEnd.gif
*/

None.gif
None.gif
None.gif#include 
<stdio.h>
None.gif#include 
<stdlib.h>
None.gif
None.gif
None.giftypedef 
int (*FUN)(int a ,int b);        //函数指针类型,功能和下面main方法中的函数指针一样
None.gif
int compare(const void* a, const void* b);        //声明compare
ExpandedBlockStart.gifContractedBlock.gif
char* list[5]=dot.gif{"cattle","car","cabet","cap","canon"};        //全局字符串数组
None.gif
static int i = 0;
ExpandedBlockStart.gifContractedBlock.gif
/**//*
InBlock.gif    函数指针的例子
ExpandedBlockEnd.gif
*/

None.gif
int add(int a,int b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
return a+b;
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*
InBlock.gif    测试函数指针的例子
ExpandedBlockEnd.gif
*/

None.gif
void test()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
//int (*fPtr)(int a,int b);    //定义一个函数指针
InBlock.gif
    FUN fPtr;
InBlock.gif    fPtr 
= add;
InBlock.gif    printf(
"8 add 4 is:%d",fPtr(8,4));
InBlock.gif    scanf(
" ");
ExpandedBlockEnd.gif}
//test
None.gif

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*
InBlock.gif    函数指针作函数参数
ExpandedBlockEnd.gif
*/

None.gif
void SortWithCompare()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif   
int i = 0;
InBlock.gif   
//为了达到一种通用性.这里使用qsort时要把数组转成void*型的,qosrt的函数声明如下(详细qsort见qsort.c)
ExpandedSubBlockStart.gifContractedSubBlock.gif
    /**//*
InBlock.gif        void __cdecl qsort (
InBlock.gif                    void *base,
InBlock.gif                    size_t num,
InBlock.gif                    size_t width,
InBlock.gif                    int (__cdecl *comp)(const void *, const void *)
InBlock.gif                    )
ExpandedSubBlockEnd.gif    
*/

InBlock.gif   
//数组类型有多少个,比较大小的方法就有多少了,这样的话,编译器是写不过来的,这里有没有面向对像的装箱和拆箱
InBlock.gif   
//虽然这里char **与void*的转换有点像装箱和拆箱.
InBlock.gif   
//所以,比较两个元素的方法就要自己写了,试想一下还有结构体数组也要来排序怎么办??
InBlock.gif
  qsort((void*)list,5,sizeof(list[0]),compare);        
InBlock.gif  
for(i=0; i<5; i++)
InBlock.gif    printf(
"%s\n",list[i]);
InBlock.gif
ExpandedBlockEnd.gif}
//SortWithCompare
None.gif

ExpandedBlockStart.gifContractedBlock.gif
/**//*
InBlock.gif    用于向qsort中传入用来比较字符串数组中的任两个元素的大小
ExpandedBlockEnd.gif
*/

None.gif
int compare(const void* a, const void* b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    i
++;
InBlock.gif    printf(
"第%d次使用compare:a=%s,b=%s\n",i,*(char**)a,*(char**)b);
InBlock.gif    
return strcmp(*(char**)a, *(char**)b);
ExpandedBlockEnd.gif}
//compare
None.gif

None.gif
void main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    SortWithCompare();
InBlock.gif    scanf(
" ");
ExpandedBlockEnd.gif}
//main
上面是一个小例子,觉得在C中的指针和C#的代理是一个意思.大家可以对比去看看

转载于:https://www.cnblogs.com/dtdnh520/archive/2006/11/05/550789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值