zoukankan      html  css  js  c++  java
  • 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 是为了 文件结尾
                    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 0;
    
    
    
    
    }
    
    const char *myStrcat(const char * str1, const char * str2){
        if (str1 != NULL&&str2 != NULL){
            char *p = malloc(strlen(str1) + strlen(str2) + 1);//+1 是为了 文件结尾
            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);
    }
  • 相关阅读:
    word上怎么打钩
    POI操作excel常用方法总结
    web.xml中Filter过滤器标签说明
    IDEA使用操作说明(自己总结)
    windows 64位上oracle 11g安装
    List<T>与List<?>的区别
    java分页之假分页
    CDN之Web Cache
    HTTP之缓存技术
    HTTP之Cookie和Session
  • 原文地址:https://www.cnblogs.com/letben/p/5243392.html
Copyright © 2011-2022 走看看