typedef与#define的区别:

(1)typedef创建的符号名只限于类型,不限于值
(2)typedef由编译器解释,不是预处理器

typedef的四种用法

在实际应用中,typedef主要有下面四种用法:

1)typedef基本数据类型取“别名”

也就是说,C语言中的所有数据类型都可以用typedef关键词来重新定义类型名

typedef unsigned int size;
typedef unsigned int16 u16;
typedef unsigned int8 u8;
.
.
.
2)typedef为自定义数据类型取“别名”

自定义的数据类型包括:结构体struct name{ }; 、共用体unit name { };、枚举enum { };

struct students
{char sex;char name[120];int ages;
};

结构体重新定义数据名常用的方法有:

struct students
{char sex;char name[120];int ages;
}std;
std.name[20]="wujunwu"

另外也可以用typedef定义:

struct students
{char sex;char name[120];int ages;
};
typedef struct students std;
std.name[20]="wujunwu"
3)typedef为数组取“别名”
typedef char arr_name[20];
arr_name ane;
ane[20]="wujunwu"
4)typedef为指针取“别名”
普通指针
int a=2;
int* pointer;
pointer =&a;

等同于:

int a=2;
typedef int* pointer;
pointer p;
p=&a;

如果a的数据类型是char ,即char a =2;那么,

char a=2;
typedef int* pointer;
pointer p;
p=&(pointer)a;
函数指针
typedef unsigned int bool;
typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
typedef void (*pBL2Type)(void);
pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;
pBL2Type p2 = (pBL2Type)0x23E00000;

其实上面程序执行了两步:
第一步:给指针取“别名”

pCopySDMMC2Mem p1;
pBL2Type p2;

第二步:强制类型转换

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写
(pBL2Type)0x23E00000;

第三步:给指针赋值

p1=(pCopySDMMC2Mem)0xD0037F98;
p2 = (pBL2Type)0x23E00000;

小结:使用typedef时,typedef并没有创建任何新类型,它只是为某个已经存在的类型提供一个“别名”,以便在程序中使用。

typedef中的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;
int strcmp(PCHAR, PCHAR);

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

typedef用法详解相关推荐

  1. typedef 用法详解

    第一部分 基本概念 1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程 ...

  2. C语言中typedf函数的用法,C语言中typedef用法详解

    在C语言中,经常有如下的用法: typedef struct  tag{    ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...

  3. 【C/C++】typedef用法详解

    typedef 声明,简称 typedef,人们常常使用 typedef 来编写更美观和可读的代码.所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未 ...

  4. C/C++ typedef用法详解(有排版)

    转自:http://blog.csdn.net/ameyume/article/details/6326278 第一.四个用途 1.1 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时 ...

  5. C语言高频率--typedef和const用法详解

    一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...

  6. 【C语言】结构体定义 typedef struct 用法详解和用法小结

    结构体定义 typedef struct 用法详解和用法小结 文章目录 结构体定义 typedef struct 用法详解和用法小结 0. 前言 1. 首先:在C中定义一个结构体类型要用typedef ...

  7. Java(enum)枚举用法详解

    转载自 Java(enum)枚举用法详解 本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理.有兴趣的可以一起来了解一下. 概念 enum的全称为 enumerat ...

  8. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

  9. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  10. C++/C--unordered_map常见用法详解

    文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...

最新文章

  1. 本地实现ES6转ES5代码——gulpfile配置文件
  2. 用Qt 4.4编写drcom的GUI (转)
  3. http://www.cnblogs.com/zuowj/p/5674615.html
  4. C#序列化反序列化对象为base64字符串
  5. 解读Java Class文件格式
  6. 电气:需求响应:初始化一个调度周期的可转入转出负荷(python实现)
  7. java后ping不是内部_ping不是内部或外部命令,也不是可运行的程序解决方案
  8. 平面点集的最小包围圆 hdu 3932
  9. iOS事件的响应和传递机制
  10. 7-278 求幂级数展开的部分和 (20 分)
  11. 西瓜书+实战+吴恩达机器学习(四)监督学习之线性回归 Linear Regression
  12. 有哪些行业或生意是电商无法取代的?
  13. es数据无法写入,报错[FORBIDDEN/12/index read-only / allow delete (api)]
  14. Bellman_Ford算法(负环的单源路径)
  15. 苏大计算机技术招生人数,苏大省内招生计划比去年增加86名
  16. 2012中文字库简单统计与分类
  17. ORBSLAM3 的改进
  18. WPF实现选项卡效果(1)——使用AvalonDock
  19. Unity 2D图片添加加外边框Shader
  20. 什么是Automata(I): Web 3.0的最后一块拼图

热门文章

  1. java beanshell_jmeter进阶之Beanshell引用Java代码
  2. 创业经验谈(转自:ouravr.com)
  3. 计算机网络知识点1——概述
  4. 稀疏编码的经典解法——ISTA算法的推导
  5. “工资3000,一年存20万”:掌握理财技能,让我少奋斗10年
  6. 视频播放插件 Video.js
  7. 香港城市大学计算机专业选课,香港城市大学传播与新媒体专业课程设置
  8. 串行加法器 并行加法器 超前进位加法器
  9. 微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付
  10. plc 触控屏 c语言开发,工业串口触摸屏在PLC工控板的人机界面应用开发示例