typedef的使用2——定义函数
#include <stdio.h>
#include <string.h> #pragma warning(disable:4996) //闲言碎语都先不要讲了,直接上函数吧。字符串拼接函数 const char *myStrcat(const char *, const char *);
//myStrcat的回调函数:
const char *myback(const char *(const char*, const char *), const char, const char);
//const char *myback(const char *这里最好放一个函数名,要不不好理解(const char*, const char *), const char, const char); //正文:typedef typedef const char *(MYSTRCAT1)(const char *, const char *);
//这句话等价于,定义一个函数叫做:MYSTRCAT,要求这个函数的返回值是const char *,并且传入两个参数 都是 const char *.
typedef const char *(* MYSTRCAT2)(const char *, const char *);
//这句话等价于定义一个函数地址。一个指向【 返回值是const char *,拥有两个参数都是const char *的[函数]】的地址
//所以回调函数myback可以写成:
const char *myback1(MYSTRCAT1, const char *, const char *);
//以及
const char *myback2(MYSTRCAT2, const char *, const char *); int main(){
//用法一:
//char *myString = myStrcat("hello ", "world");
//printf(myString);
//free(myString); //用法二: //用法二 打开这是第一行:MYSTRCAT1 *myStrcat1 = &myStrcat;
//这个函数真的是写的我一脸懵逼。。。
//解释一下为什么:MYSTRCAT1是一个函数。myStrcat是一个返回了函数的const char * 的函数。
//所以定义一个MYSTRCAT1类型的函数myStrcat1的指针,要他取myStrcat函数的地址。 // 注解第一层:相当于:
//int i = 0;
//int *p = &i; /* 注解第二层:
//再复杂一点相当于:
{
int i;//等价于:const char *myStrcat(const char *, const char *);声明有这样一个变量
int main(){
int *p = &i;
//等价于:MYSTRCAT1 *myStrcat1 = &myStrcat;
}
i = 0;//定义
等价于:
const char *myStrcat(const char * str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + 1);//+1 是为了\0 文件结尾
strcpy(p, str1);
strcat(p, str2);
return p;
}
}
}
*/
//用法二 打开这是第二行:char *p = myback1(myStrcat1, "hello", "world");
//用法二 打开这是第三行:printf(p);
//用法二 打开这是第四行:free(p); MYSTRCAT2 mystrcat2 = myStrcat;//因为在定义的时候 MYSTRCAT2 本身就是一个指向 myStrcat函数的地址
char *p = myback2(mystrcat2, "hello", "world");
printf(p);
free(p); getchar();
return ; } const char *myStrcat(const char * str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + );//+1 是为了\0 文件结尾
strcpy(p, str1);
strcat(p, str2);
return p;
}
}
//存在正文时,不允许未知名的原型参数,原型参数包括:myStrcat,str1,str2
const char *myback(const char *myStrcat(const char *, const char *), const char *str1, const char *str2){
return myStrcat(str1, str2);
} //对应的函数实现:
const char *myback1(MYSTRCAT1 functionName, const char *str1, const char *str2){
//这里写的都一样我就蒙蔽了
return functionName(str1, str2);
}
const char *myback2(MYSTRCAT2 functionName, const char *str1, const char *str2){
//这里写的都一样我就蒙蔽了
return functionName(str1, str2);
}
typedef的使用2——定义函数的更多相关文章
- c语言定义函数指针和typedef简写
二种方法来定义函数指针 #include<stdio.h> #include<stdlib.h> #include<Windows.h> int add(int a ...
- typedef struct与struct定义结构体
今天在定义结构体的时候发现typedef struct与struct定义结构体有一些不同之处: 结构也是一种数据类型, 能够使用结构变量, 因此, 象其他 类型的变量一样, 在使用结构变量时要先对其 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集
11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数
11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型
11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...
- Javascript学习笔记:3种定义函数的方式
①使用函数声明语法定义函数 function sum(num1,num2){ return num1+num2; } ②使用函数表达式定义函数 var sum=function(num1,num2){ ...
随机推荐
- Proguard使用教程
一.概念 ProGuard是一款免费的Java类文件压缩器.优化器和混淆器.它能发现并删除无用类.字段(field).方法和属性值(attribute).它也能优化字节码并删除无用的指令.最后,它使用 ...
- 29、activity横竖屏切换细节问题
1 import android.app.Activity; import android.content.Intent; import android.os.Bundle; import andro ...
- 使用linq 对 DataTable 中的数据进行 查询 与 分类求合
A:linq 的查询方式写得可以非常简洁如下所示: DataTable dt = null; private void XtraForm1_Load(object sender, Eve ...
- PPTP VPN不能打开百度
问题: 在阿里云上设置PPTP VPN,电脑能正常连接,能打开京东 淘宝 QQ等没有问题,但是不能打开百度 糯米等网站.开始怀疑是代理设置问题,后面确认未设置独立规则. 1.从应用层看排除特殊规则设 ...
- 【译】 AWK教程指南 附录C-AWK的内建函数
C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...
- bzoj 1432 [ZJOI2009]Function(找规律)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1432 [思路] 找(cha)规(ti)律(jie) 分析戳这儿 click here ...
- 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划
题目链接 : http://acm.xidian.edu.cn/land/problem/detail?problem_id=1006 Description wm最近喜欢上一种无聊的转盘解锁游戏,他 ...
- Error starting static Resources java.lang.IllegalArgumentException: Document base D:\Program Files\apache-tomcat-xxx\webapps\xxx does not exist or is not a readable directory
网上的答案大多数如下: 但并没有解决我的问题 经过我的观察: 在tomcat的server.xml有Lottery项目描述,但实际上,该项目已被我删除,不存在于webapps中了 该行Cont ...
- 【Spark学习】Apache Spark安全机制
Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4135808.html 目录 W ...
- HDU-4611 Balls Rearrangement 循环节,模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4611 先求出循环节,然后比较A和B的大小模拟过去... //STATUS:C++_AC_15MS_43 ...