typedef用法详解
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用法详解相关推荐
- typedef 用法详解
第一部分 基本概念 1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程 ...
- C语言中typedf函数的用法,C语言中typedef用法详解
在C语言中,经常有如下的用法: typedef struct tag{ ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...
- 【C/C++】typedef用法详解
typedef 声明,简称 typedef,人们常常使用 typedef 来编写更美观和可读的代码.所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未 ...
- C/C++ typedef用法详解(有排版)
转自:http://blog.csdn.net/ameyume/article/details/6326278 第一.四个用途 1.1 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时 ...
- C语言高频率--typedef和const用法详解
一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...
- 【C语言】结构体定义 typedef struct 用法详解和用法小结
结构体定义 typedef struct 用法详解和用法小结 文章目录 结构体定义 typedef struct 用法详解和用法小结 0. 前言 1. 首先:在C中定义一个结构体类型要用typedef ...
- Java(enum)枚举用法详解
转载自 Java(enum)枚举用法详解 本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理.有兴趣的可以一起来了解一下. 概念 enum的全称为 enumerat ...
- STL 中map的用法详解
STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...
- STL中map和string, vector 用法详解
1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...
- C++/C--unordered_map常见用法详解
文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...
最新文章
- 本地实现ES6转ES5代码——gulpfile配置文件
- 用Qt 4.4编写drcom的GUI (转)
- http://www.cnblogs.com/zuowj/p/5674615.html
- C#序列化反序列化对象为base64字符串
- 解读Java Class文件格式
- 电气:需求响应:初始化一个调度周期的可转入转出负荷(python实现)
- java后ping不是内部_ping不是内部或外部命令,也不是可运行的程序解决方案
- 平面点集的最小包围圆 hdu 3932
- iOS事件的响应和传递机制
- 7-278 求幂级数展开的部分和 (20 分)
- 西瓜书+实战+吴恩达机器学习(四)监督学习之线性回归 Linear Regression
- 有哪些行业或生意是电商无法取代的?
- es数据无法写入,报错[FORBIDDEN/12/index read-only / allow delete (api)]
- Bellman_Ford算法(负环的单源路径)
- 苏大计算机技术招生人数,苏大省内招生计划比去年增加86名
- 2012中文字库简单统计与分类
- ORBSLAM3 的改进
- WPF实现选项卡效果(1)——使用AvalonDock
- Unity 2D图片添加加外边框Shader
- 什么是Automata(I): Web 3.0的最后一块拼图
热门文章
- java beanshell_jmeter进阶之Beanshell引用Java代码
- 创业经验谈(转自:ouravr.com)
- 计算机网络知识点1——概述
- 稀疏编码的经典解法——ISTA算法的推导
- “工资3000,一年存20万”:掌握理财技能,让我少奋斗10年
- 视频播放插件 Video.js
- 香港城市大学计算机专业选课,香港城市大学传播与新媒体专业课程设置
- 串行加法器 并行加法器 超前进位加法器
- 微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付
- plc 触控屏 c语言开发,工业串口触摸屏在PLC工控板的人机界面应用开发示例