typedef的使用3——使用经过typedef定义的函数构成的函数数组
#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定义的函数构成的函数数组的更多相关文章
- typedef 类型重命名 和 #define 宏定义(1)
http://www.blogjava.net/jasmine214--love/archive/2010/11/29/339307.html 在现实生活中,信息的概念可能是长度,数量和面积等.在C语 ...
- typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结
https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...
- typedef 返回类型(*Function)(参数表) ——typedef函数指针
//首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数
在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...
- c++中的函数重载、函数重写、函数重定义
目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...
- [js]变量声明、函数声明、函数定义式、形参之间的执行顺序
一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...
- Swift超详细的基础语法-结构体,结构体构造器,定义成员方法, 值类型, 扩充函数
知识点 基本概念 结构体的基本使用 结构体构造器(构造函数/构造方法) 结构体扩充函数(方法), 又称成员方法 结构体是值类型 1. 基本概念 1.1 概念介绍 结构体(struct)是由一系列具有相 ...
- C++中,如何定义和使用指向成员函数的指针
/*** 定义指向成员函数的指针变量的形式 : 成员函数返回类型 (类名∷*指针变量名)(参数列表)* 成员函数指针变量值的形式 : &类名∷成员函数名;* 成员函数指针变量使用形式 : (对 ...
随机推荐
- 在FOR中使用close window,循环次数大于1就会报异常
在FOR循环中执行以下动作: 场景:1.打开页面A, 2.点击A中的链接打开新的window, 3.将driver切换到新window, 4.close window 5.再切换到页面A 时出异 ...
- gem install走代理,速度刚刚的
有个树莓pi,安装了shadowsocks 和 cow ,做代理,走ipv6,学校不收ipv6流量钱.速度也不错,快的下载可达10M/s. gem install xx遇到墙了. nano ~/.ge ...
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- uvalive 4973 Ardenia
题意:给出空间两条线段,求距离. 注意输出格式! #include<cstdio> #include<cmath> #include<algorithm> usin ...
- CentOS安装nvidia显卡驱动
1.下载 nvidia 相应的驱动: 2.修改/etc/modprobe.d/blacklist.conf文件,在里面加入blacklist nouveau. 3.重建image $ mv /boot ...
- HDU-4662 MU Puzzle 水题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662 倒推考虑长度就可以了. //STATUS:C++_AC_31MS_240KB #include ...
- java 通过网络 ntp 获取网络时间
需要 commons-net-3.4.jar 库. import org.apache.commons.net.ntp.NTPUDPClient; import org.apache.commons. ...
- Spark生态之SparkR
- 教程-最全ASCII 码对照表
第一部分由 00H 到 1FH 共 32 个,一般用来通讯或作为控制之用,有些字符可显示于屏幕,有些则无法显示在屏幕上,但能看到其效果(例如换行字符.归位字符). 第二部分是由 20H 到 7FH 共 ...