#include <stdio.h>
#include <string.h>//不加还能跑,加上反而跑不了了。。。笑哭
#pragma warning(disable:4996)//要这句跟上面那个包含放在一起。否则会有一个警告阻止编译。 //字符串拷贝函数:
const char * myStrcat(const char *,const char *); typedef const char * MYSTRCAT1(const char *,const char *);
//这里是定义了一个MYSTRCAT1这种类型的对象,本身是一个函数 typedef const char * (*MYSTRCAT2)(const char *, const char *);
//定义了一个指向这种函数的地址 //回调函数: const char * myback(const char * (const char *, const char *), const char *, const char *); const char * myback1(MYSTRCAT1, const char *, const char *); const char * myback2(MYSTRCAT2, const char *, const char *); int main(){
//char *p = myStrcat("hello", " world");
//printf(p);
//free(p); /*
char *pf = myStrcat;
char *p1 = myback(pf, "hello", " world");
printf(p1);
free(p1);
*/
/*
MYSTRCAT1 *function = &myStrcat;
char *p2 = myback1(function, "hello", " world");
printf(p2);
free(p2);
*/ /*
MYSTRCAT2 function2 = myStrcat;
char *p3 = myback2(function2, "hello", " world");
printf(p3);
free(p3);
*/ /*
MYSTRCAT1 * function1[10];
function1[0] = &myStrcat;
char *p4 = myback1(function1[0], "hello", " world");
printf(p4);
free(p4);
*/
MYSTRCAT2 function2[];
function2[] = myStrcat;
char *p5 = myback2(function2[], "hello", " world");
printf(p5);
free(p5); getchar();
return ; } const char * myStrcat(const char *str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + );
strcpy(p, str1);
strcat(p, str2);
return p;
}
} const char * myback(const char * func(const char *, const char *), const char * str1, const char * str2){
return func(str1, str2);
}
const char * myback1(MYSTRCAT1 func, const char *str1, const char *str2){
return func(str1, str2);
}
const char * myback2(MYSTRCAT2 func, const char *str1, const char *str2){
return func(str1, str2);
}

什么时候 用typedef 什么时候 使用 #define?

typedef是一种高级数据特性,它能使某一类型创建自己的名字

1、与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的值

2、typedef是编译器处理的,而不是预编译指令

3、typedef比#define更灵活

  直接看typedef好像没什么用处,使用BYTE定义一个unsigned char。使用typedef可以增加程序的可移植性。

应用场合:

1、在程序当中如果是定义一个可读的常量,适合用#define

2、如果定义的是一个具体的数据类型,那么typedef更加适合。

3、如果是定义一个函数指针,那么基本就用typedef.

typedef的使用3——使用经过typedef定义的函数构成的函数数组的更多相关文章

  1. typedef 类型重命名 和 #define 宏定义(1)

    http://www.blogjava.net/jasmine214--love/archive/2010/11/29/339307.html 在现实生活中,信息的概念可能是长度,数量和面积等.在C语 ...

  2. typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结

    https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...

  3. typedef 返回类型(*Function)(参数表) ——typedef函数指针

    //首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...

  4. C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数

    在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...

  5. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

  6. 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法

    获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...

  7. [js]变量声明、函数声明、函数定义式、形参之间的执行顺序

    一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...

  8. Swift超详细的基础语法-结构体,结构体构造器,定义成员方法, 值类型, 扩充函数

    知识点 基本概念 结构体的基本使用 结构体构造器(构造函数/构造方法) 结构体扩充函数(方法), 又称成员方法 结构体是值类型 1. 基本概念 1.1 概念介绍 结构体(struct)是由一系列具有相 ...

  9. C++中,如何定义和使用指向成员函数的指针

    /*** 定义指向成员函数的指针变量的形式 : 成员函数返回类型 (类名∷*指针变量名)(参数列表)* 成员函数指针变量值的形式 : &类名∷成员函数名;* 成员函数指针变量使用形式 : (对 ...

随机推荐

  1. ChineseCounter.cs 统计中文文本中常用字占比

    http://www.tuicool.com/articles/qmMba2 1 using System; using System.IO; using System.Collections.Gen ...

  2. MFC定时器使用

    MFC定时器实现方法 方法一:CWnd类提供的成员函数SetTimer实现定时器功能,只能在CWnd类或其派生类中调用. 方法二:Windows API函数SetTimer来实现. MFC定时器 启动 ...

  3. 使用weka进行Cross-validation实验

    Generating cross-validation folds (Java approach) 文献: http://weka.wikispaces.com/Generating+cross-va ...

  4. Code First 更新数据库结构(简单实现方法:会删除原来的数据)

    之前在 http://www.cnblogs.com/mmcmmc/p/3833265.html 写到关于“Code First 更新数据库结构”的东西. 可是由于某种原因,新手们会出现各种问题,好了 ...

  5. leetcode@ [322] Coin Change (Dynamic Programming)

    https://leetcode.com/problems/coin-change/ You are given coins of different denominations and a tota ...

  6. unigui下载文件

    lblProduct.Caption := '<a href="files\1.t" target=new>要下载的文件名</a>';

  7. 如果将synthesize省略,语义特性声明为assign retain copy时,自己实现setter和getter方法

    如果将synthesize省略,并且我们自己实现setter和getter方法时,系统就不会生成对应的setter和getter方法,还有实例变量 1,当把语义特性声明为assign时,setter和 ...

  8. PTA 5-15 PAT Judge (25分)

    /* * 1.主要就用了个sort对结构体的三级排序 */ #include "iostream" #include "algorithm" using nam ...

  9. ECSHOP在线手册之 数据库结构说明 (适用版本v2.7.3)

    1.account_log 用户账目日志表 字段 类型 Null/默认 注释 log_id mediumint(8) 否 / 自增 ID 号 user_id mediumint(8) 否 / 用户登录 ...

  10. mysql之字符集与校对集

    一.字符集 1.mysql的字符集设置非常灵活 可以设置服务器默认字符集: 数据库默认字符集: 表默认字符集: 列字符集: 如果某一级别没有指定字符集,则继承上一级. 查看所有字符集语句:show c ...