文档章节

C函数指针

 学习吧
发布于 2015/10/12 20:20
字数 567
阅读 6
收藏 0
点赞 0
评论 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
海淀
程序员
C中的继承和多态

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

老朱教授 ⋅ 2017/11/26 ⋅ 0

12月13号指针数组笔记

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

getchar_ ⋅ 2017/12/13 ⋅ 0

计算机专业C语言编程学习重点:指针化难为易

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

小辰带你看世界 ⋅ 05/31 ⋅ 0

回调函数的前前后后

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

wbf961127 ⋅ 2017/11/14 ⋅ 0

C和C++函数时的JNI使用区别

Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于*.c & .cpp采用不同的定义 在C的定义中,env是一个两级指针,而在C++的定义中,env是个一级指针 C形式需要对env指针进行双重defer...

zhangyujsj ⋅ 2015/08/23 ⋅ 0

从 0 开始学习 C 语言:详细分析常见「类型」在内存中的存储

版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! 这个系列的文章我会挑出我认为比较重要的 C 语言知识来分享给大家,尽量写的富有实践性,让你看完之后不会...

cdeveloper ⋅ 05/23 ⋅ 0

static关键字_void和void指针_函数指针

static关键字 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到...

AlphaJay ⋅ 2011/11/15 ⋅ 0

C语言程序设计编程学习—内存操作函数库mem.h相关知识详解

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

小辰带你看世界 ⋅ 03/24 ⋅ 0

Head First C学习日志 第七章 高级函数 创建函数指针

在c语言中,函数名也是指针变量 函数名是指向函数的指针,当你创建一个叫test的函数的同时,也会创建一个test指针变量,变量中保存了函数的地址。该变量位于常量段。 如何创建函数指针? 假设...

AlexTuan ⋅ 2016/02/29 ⋅ 0

C++类相关总结-1

虚函数的实现原理 在C++的类内会维护一个虚表,同时还有一个虚指针。可以通过VC 6.0来观看类的虚函数表。 #include <iostream> include <stdio.h> class A{public :virtual void f(){ std::c...

张_cpp ⋅ 2014/03/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 56分钟前 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部