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){ ...
随机推荐
- 【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...
- Algorithm: quick sort implemented in python 算法导论 快速排序
import random def partition(A, lo, hi): pivot_index = random.randint(lo, hi) pivot = A[pivot_index] ...
- uva 11020 Efficient Solutions
题意:给你n个人,有两个属性x.y,如果不存在另外一个人x2,y2满足 x2<=x,y2<y 或者 x2<x,y2<=y,那么就称这个人是有优势的,每次给你一个人得信息,问你当 ...
- CentOS 6.5 安装配置
关于CentOS的安装,网上有很多详细的教程.其实重点就在于硬盘的分区和软件的定制这两块.下面我在VirtualBox虚拟机上安装 CentOS-6.5-i386-minimal. 1.在起始菜单处选 ...
- HDU-4681 String 枚举+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的su ...
- linux shell-syntax error near unexpected token错误
在windows下用记事本编写linux shell脚本后,执行遇到syntax error near unexpected token错误 问题原理:网上找了好久,找到原因,原来是回行的问题,每个系 ...
- leptonica 学习笔记2——pixBackgroundNormSimple
1 pixBackgroundNormSimple 函数功能:自适应背影标准化 位置:adampmap.c /*-------------------------------------------- ...
- IE比Chrome强的一个地方
今天在开发时,调试一个功能.死活显示和同事不一样,他是测试过正常的,我的Chrome显示死活不对. 最后要重新部署了,才想起会不会是缓存的问题.清除Chrome缓存,再一试,一切正常. IE有一个功能 ...
- elecworks中“插入点”的意思
elecworks中自建符号时,”插入点“的用法: 插入点的作用是:建好的符号加入符号库后,从库里调用符号到原理图中时“插入点”就是符号的中心点---鼠标光标拖动的点. (插入点即为符号调出 时插入图 ...
- sql STUFF用法
sql STUFF用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,char ...