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){ ...
随机推荐
- 【转】ubuntu 编码 UTF-8 GBK GB18030
添加编码支持 sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN.GB2312 sudo locale-gen zh_CN.GB18030 2.更新一下lo ...
- 为枚举类型添加说明 zt
enum Orientation { [DescriptionAttribute("东")] East, [DescriptionAttribute("南")] ...
- js实现收缩菜单效果
废话不多说,直接上代码: 有注释 <head> <title></title> <style type="text/css"> di ...
- Magento 处理方法
1.在模板中添加图片: <div id="header-image" class="skip-image"> <img src="& ...
- 关于Aggregate 的一点用法
比如 我们要 将数组或者对象中的某列或某属性 的值取出,然后 用 逗号隔开. 1.通常我们可能会用for 或foreach 来循环,然后将取出的值并添加至StringBuilder 2.用Aggreg ...
- 请求码(requestCode)与结果码(resultCode)解析
Android apk开发中经常需要在活动(Activity)之间穿梭,并实现活动之间的数据传递.为了启动一个新的活动并得到该活动的返回数据,需调用方法startActivityForResult() ...
- 对String的一点了解
/** * @param args */ public static void main(String[] args) { String str1 = "welcome"; Str ...
- Esper系列(十三)Splitting and Duplicating Streams
功能:将同一个事件流分发到其它的事件流中. 格式: 1 ; i < events.length; i++) { 78 EventBean event = even ...
- Ngrok,一款可以帮助你展示网站和联网开发的工具
使用Ngrok的目的就是为了可以让别人通过网络访问到自己本机上的项目 下面是一个简单的使用教程,详细的查看官网英文文档. 第一步: 登录官网:https://ngrok.com/ 注册或者登录 ...
- MySQL命令使用手记
1.登陆 >mysql -u root -p,root没密码按回车. 2.创建数据库 >create database XXX; 3.创建用户 >inse ...