3. typedef & #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
typedef char *pStr;
#define pStr char *;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
#define用法例子: 
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \n",c);
}
以下程序的输出结果是: 36。
因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:
#define f(x) (x*x)
当然,如果你使用typedef就没有这样的问题。
4. typedef & #define的另一例
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案与分析:
是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。
(注:关于const的限定内容问题,在本系列第二篇有详细讲解)。
#define与typedef引申谈
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
5. typedef & 复杂的变量声明
在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。 
(注:如果你对有些变量的声明语法感到难以理解,请参阅本系列第十篇的相关内容)。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*); 
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5]; 
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9]; 
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;

转载于:https://www.cnblogs.com/zhihaowang/archive/2010/12/29/10128602.html

c语言 typedef(转)相关推荐

  1. C语言 | typedef

    C语言typedef用新的类型名代替原有的类型名 //指定用Integer为类型名,作用与int相同. typedef int Integer://指定用Real为类型名,作用与float相同. ty ...

  2. C语言 typedef 和 define 区别 - C语言零基础入门教程

    目录 一.typedef 简介 1.typedef 简化复杂的类型声明 A.定义普通变量 B.定义函数指针 C.定义结构体 2.定义与平台无关的类型 二.define 简介 三.typedef 和 d ...

  3. C语言 typedef - C语言零基础入门教程

    目录 一.typedef 简介 二.typedef 实战 1.typedef 定义基本数据变量 2.typedef 定义结构体 A.常规定义结构体 B.typedef 定义结构体 C.结构体使用 ty ...

  4. C语言typedef:给类型起一个别名

    C语言typedef:给类型起一个别名 C语言允许为一个数据类型起一个新的别名,起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样 ...

  5. C语言——typedef的用法

    引言 typedef在C语言中给结构体取别名的用法很常见,这种用法很很容易理解,但当用typedef来给函数.数组取别名时,或许这种写法理解起来比较晦涩.以下用一些例子来展现typedef的部分用法. ...

  6. c语言typedef(c语言typedef和define)

    什么是C语言 C語言是1972年左右由DennisRitchie一??人在?????室(?稱AT&T)設?開發出?淼碾?腦程式語言.他??r與KenThompson?扇斯餐??UNIX作?I ...

  7. C语言 typedef 简介

    C语言 typedef 简介 typedef工具是一种高级数据特性,它能为某一类型创建自己的名字.在使用typedef时,要记住它并不创造新的类型:它只是创建便于使用的标签. 1.typedef与#d ...

  8. c语言typedef怎么自定义函数,C语言 typedef:给类型起一个别名

    C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就 ...

  9. c语言typedef结构体_typedef在C中具有结构的示例

    c语言typedef结构体 The structure is a user-defined data type, where we declare multiple types of variable ...

  10. C语言typedef小结1(转载自百度百科)

    声明:此信息是转载自百度百科中  http://baike.baidu.com/view/1283800.htm 的信息 typedef小结 1.使用typedef为现有类型创建同义字,定义易于记忆的 ...

最新文章

  1. 看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
  2. 【Codeforces】53D Physical Education (有点像冒泡)
  3. Android 应用间的集成
  4. 一块网卡设置多个IP地址
  5. day13-(事务mvc反射补充)
  6. OBJ可视化——UV还原(修正)
  7. 第一次Java 8体验
  8. 数据:以太坊2.0合约质押新增7.47万ETH
  9. crate和mysql结合利用_create和grant配合使用,对Mysql进行创建用户和对用户授权
  10. termux安装gcc
  11. Flash上传文件(结合asp.net)
  12. Qt操作Excel类
  13. 小区数字IP广播系统
  14. 数据仓库和数据挖掘方面比较好的书籍
  15. 长春有学计算机的中专吗,长春比较好的中专学校
  16. 通过ip地址访问其他电脑的共享文件
  17. H5互动游戏平台推荐:盘点那些超火的多人小游戏互动对战平台
  18. 大家好!我是happy_HuHu
  19. 华为4月将开始升级鸿蒙系统,暂定4月,华为鸿蒙系统登场!升级标准已确定,淘汰名单也出炉...
  20. 一个有趣的时钟flash

热门文章

  1. [Ext JS6]Sencha Cmd
  2. [Ext JS 4] 实战之 带week(星期)的日期选择控件
  3. 自己动手写Docker系列 -- 5.2实现查看运行中的容器
  4. 软件人员kpi制定模板_软件科技公司绩效考核办法模板
  5. 计算机网络孙家启,孙家启
  6. java课程设计qq,模块java课程设计报告qq聊天
  7. Python中的join函数
  8. MySQL截取SUBSTRING
  9. Linux下的whoami命令
  10. java 集群会话管理_架构设计之Spring-Session分布式集群会话管理