文档章节

C函数指针

 学习吧
发布于 2015/10/12 20:20
字数 567
阅读 9
收藏 0

#函数指针 运行时确定调用哪个函数。 #include <stdio.h> void hello(void){ printf("Hello\n"); } void world(void){ printf("World\n"); } typedef int I; typedef void (*Func)(void); int main(void){ I i; scanf("%d",&i); void (*func0)(void); Func func1; if(i==0){ func0=hello; func1=hello; }else{ func0=world; func1=world; } func0(); func1(); return 0; } #形参函数指针 #include <stdio.h> void ArrForEach(int *arr,int len,void(func)(int)){ int i; for(i=0;i<len;++i){ func(&arr[i]); } } void PrintInt(int *i){ printf("%d,",*i); } void IncInt(int *i){ ++*i; } void DecInt(int *i){ --*i; } int main(void){ int arr[]={1,2,3,4,5,6,7,8,9,0}; ArrForEach(arr,10,PrintInt); printf("\n"); ArrForEach(arr,10,IncInt); ArrForEach(arr,10,PrintInt); printf("\n"); ArrForEach(arr,10,DecInt); ArrForEach(arr,10,PrintInt); printf("\n"); return 0; } 函数指针实现排序 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct AB{ int a; char b[16]; }AB; int ABCmp(const void *ab0Arg,const void *ab1Arg){ AB ab0=(AB)ab0Arg; AB ab1=(AB)ab1Arg; int result=ab0->a-ab1->a; if(result!=0) return result; return strcmp(ab0->b,ab1->b); } int main(void){ AB ab[]={ {1,"ab"}, {9,"df"}, {8,"ab"}, {1,"ab"}, {2,"ab"}, {2,"cd"}, }; int len=sizeof(ab)/sizeof(ab[0]); qsort(ab,len,sizeof(ab[0]),ABCmp); int i; for(i=0;i<len;++i){ printf("{%d,%s},",ab[i].a,ab[i].b); } printf("\n"); return 0; } #回调函数 #include <stdio.h> void Func(const char *str){ printf("数据:%s",str); } void DataMain(void (*func)(const char *str)){ for(;;){ char str[BUFSIZ]; fgets(str,sizeof(str),stdin); func(str); } } int main(void){ DataMain(Func); return 0; } #面向对象 #include <stdio.h> typedef struct Dog{ int age; void (*Sound)(struct Dog *dog); }Dog; void DogSound(Dog *dog){ printf("年龄:%d,汪汪。\n",dog->age); } void DogInit(Dog *dog,int age){ dog->age=age; dog->Sound=DogSound; } int main(void){ Dog dog; DogInit(&dog,10); dog.Sound(&dog); return 0; } #面向接口 Animal.h #ifndef ANIMAL_H #define ANIMAL_H typedef struct Animal{ void (*Run)(struct Animal *animal); void (*Sound)(struct Animal *animal); void (*Destroy)(struct Animal *animal); }Animal; Animal *NewDog(); Animal *NewCat(); #endif Animal.c #include "Animal.h" #include <stdio.h> #include <stdlib.h> typedef struct Dog{ Animal animal; }Dog; void DogRun(Animal *animal){ printf("跑的快\n"); }
void DogSound(Animal *animal){ printf("汪汪\n"); }
void DogDestroy(Animal *animal){ free(animal); }
Animal *NewDog(){ Dog *dog=malloc(sizeof(Dog)); dog->animal.Run=DogRun; dog->animal.Sound=DogSound; dog->animal.Destroy=DogDestroy; return &dog->animal; }
typedef struct Cat{ Animal animal; }Cat; void CatRun(Animal *animal){ printf("跑的慢,会爬树\n"); } void CatSound(Animal *animal){ printf("喵喵\n"); } void CatDestroy(Animal *animal){ free(animal); } Animal *NewCat(){ Cat *dog=malloc(sizeof(Cat)); dog->animal.Run=CatRun; dog->animal.Sound=CatSound; dog->animal.Destroy=CatDestroy; return &dog->animal; } Main.c #include "Animal.h" #include <stdio.h> #include <string.h> int main(void){ Animal *animal; char str[BUFSIZ]; fgets(str,sizeof(str),stdin); int len=strlen(str); if(len>0)str[len-1]=0; if(strcasecmp(str,"dog")==0){ animal=NewDog(); }else if(strcasecmp(str,"cat")==0){ animal=NewCat(); }else{ return -1; }
animal->Run(animal); animal->Sound(animal); animal->Destroy(animal); return 0; }

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 20
码字总数 6841
作品 0
海淀
程序员
私信 提问
12月13号指针数组笔记

指针进行运算时,要确保指针说指向的内存区域一致 比如 指向不同数组的两个指针,进行运算得到的结果没有意义. 数组指针: 将数组名作为参数传递给函数时,实际上是传递的数组的首地址. 函数的形...

getchar_
2017/12/13
0
0
计算机专业C语言编程学习重点:指针化难为易

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/31
0
0
技术原理:C语言中函数指针数组浅析

发现问题 今天,在阅读Linux内核中关于socket的源代码时,遇到了下面一段代码: 在这段代码中,我们注意到proto_ops结构体的成员包括下面这样的成员变量: 这边是函数指针作为结构体成员变量...

adoryn
2015/04/01
0
0
回调函数的前前后后

要详细的了解回调函数,需要预先了解typedef常见用法,对函数指针的了解。然后才是回调函数。 下面我们先介绍预备知识 typedef的用法和函数指针的学习。 预先准备一: typedef常见用法 1.常规...

wbf961127
2017/11/14
0
0
C中的继承和多态

2010-09-23 00:27 by 吴秦,19167 阅读,23 评论,收藏,编辑 1、引言 继承和多态是面向对象语言最强大的功能。有了继承和多态,我们可以完成代码重用。在C中有许多技巧可以实现多态。本文的目的...

老朱教授
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Temp-Memo

Recommended Ref : SQL High CPU troubleshooting checklist -- Top 50 SQL highly consuming cpuSELECT TOP 50[Avg. MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000 / qs......

Goopand
15分钟前
1
0
dotConnect for Oracle入门指南(七):存储过程

【下载dotConnect for Oracle最新版本】 dotConnect for Oracle(原名OraDirect.NET)建立在ADO.NET技术上,为基于Oracle数据库的应用程序提供完整的解决方案。它为设计应用程序结构带来了新的...

电池盒
17分钟前
1
0
如何使用阿里云ARMS轻松重现用户浏览器问题

客户投诉不断,本地却无法重现? 页面加载较慢是用户经常会反馈的问题,也是前端非常关注的问题之一。但定位、排查解决这类问题就通常会花费非常多的时间,主要原因如下: 页面是在用户端的浏...

阿里云官方博客
20分钟前
1
0
因资源用尽导致服务宕机

1. 事故的发生 服务调用场景和发生的事件如下图所示,红色表示服务不可用. 服务A和服务B都是内部服务,服务C_*为不同运营商提供的服务,遵循一样的协议。 某一天,突然发现所有服务A调用服务...

北风刮的不认真了
25分钟前
2
0
锤子科技"临死前"被"接盘" ,内部人士爆料已改签今日头条母公司

就在昨天,据据锤子科技内部人士透露,部分锤子科技员工在昨天已经接到了相关的临时通知,要求改签劳动合同至今日头条的母公司——字节跳动。至于这是锤子科技真正再度复活还是借尸还魂都不重...

终端研发部
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部