4.4.C语言的陷阱之typedef
2016-07-02 17:55
309 查看
typedef是一个关键字,可以重命名一些数据类型也可以重定义一些新的数据类型。我们从以下几个角度去理解typedef。
1.typedef和普通数据类型类型
我们给int重命名成MYINT,这时候 int 和MYINT 是一样的,都可以定义变量,并且在32位平台都是32位的。
2.typedef和结构体(重点)
上面创建了一个新的数据类型 strcut people,注意,这个是数据类型,数据类型不占内存。
这时候我们定义了两个变量,p1和p2,他们的数据类型是struct people,以后我们每次定义变量都要写struct people,是不是感觉很麻烦,使用typedef给它重命名一下就简单多了。
这样struct people和STRPEO和struct people就有了一样的作用。以后我们在定义变量直接STRPEO p1,p2;是不是简单很多。
我们再来定义一个该结构体的指针
typedef struct people
{
int age;
char sex;
}*PSTRPEO;
虽然* 和PSTRPEO很近,但是* 是和struct people 结合的,也就是说,PSTRPEO 的类型是struct people *
3.typedef和#define(重点)
typedef是给类型重命名,相当于一个数据类型,而#define是宏定义,在程序预处理时期直接替换
相当于 int* a,int* b,两个变量的数据类型都是int *
* 宏定义是直接替换,在这就是用 int替换掉PMYINT 相当于int a,b;a是int类型,b是int类型。**
4.typedef和const(重点)
回顾:const int * p; //指针p指向的变量是不可变得
int * const p; //指针p本身是不可改变的
按照我们平常的理解应该是const int* p1;和int *const p2;p1指向的变量是不可变的,p2指针本身是不可变的。经过代码验证我们发现,无论是const PINT p1;还是PINT const p2; 效果都等价于 int *const ,p1和p2本身是不可变的。 那我们想让指针指向的变量不可变怎么办?
5.typedef和函数指针
函数:int * test(const char *,int );
函数指针 int* ( * ptest)(const char * ,int )
我们每次定义这类函数的指针都要写这么长,很麻烦于是
typedef int * ( * PTEST)(const char * ,int);
以后我们在使用该函数指针时直接PTEST P1,P2;就可以了。
6.使用typedef的意义
使用typedef的好处就是简化类型的书写,创建与平台无关的数据类型,有利于代码移植,int在32位机器上就是32位的,在我们在32位机器上写的程序很可能无法在64位平台运行,我们可以把int用typedef重定义一下,即可增强代码的可移植性。
1.typedef和普通数据类型类型
typedef int MYINT; int a = 10; MYINT B = 20;
我们给int重命名成MYINT,这时候 int 和MYINT 是一样的,都可以定义变量,并且在32位平台都是32位的。
2.typedef和结构体(重点)
struct people { int age; char sex; };
上面创建了一个新的数据类型 strcut people,注意,这个是数据类型,数据类型不占内存。
struct people p1,p2;
这时候我们定义了两个变量,p1和p2,他们的数据类型是struct people,以后我们每次定义变量都要写struct people,是不是感觉很麻烦,使用typedef给它重命名一下就简单多了。
typedef struct people { int age; char sex; }STRPEO;
这样struct people和STRPEO和struct people就有了一样的作用。以后我们在定义变量直接STRPEO p1,p2;是不是简单很多。
我们再来定义一个该结构体的指针
typedef struct people
{
int age;
char sex;
}*PSTRPEO;
虽然* 和PSTRPEO很近,但是* 是和struct people 结合的,也就是说,PSTRPEO 的类型是struct people *
STRPEO P1; //定义结构体变量 P1.age = 20; //给结构体age成员赋值 PSTRPEO P = &p1; //使用结构体指针访问age成员 printf("%d\n",p->age); //结果是 20
3.typedef和#define(重点)
typedef是给类型重命名,相当于一个数据类型,而#define是宏定义,在程序预处理时期直接替换
typedef int * PMYINT; MYINT a,b;
相当于 int* a,int* b,两个变量的数据类型都是int *
#define PMYINT int * PMYINT a,b;
* 宏定义是直接替换,在这就是用 int替换掉PMYINT 相当于int a,b;a是int类型,b是int类型。**
4.typedef和const(重点)
回顾:const int * p; //指针p指向的变量是不可变得
int * const p; //指针p本身是不可改变的
typedef int* PINT; const PINT p1; PINT const p2;
按照我们平常的理解应该是const int* p1;和int *const p2;p1指向的变量是不可变的,p2指针本身是不可变的。经过代码验证我们发现,无论是const PINT p1;还是PINT const p2; 效果都等价于 int *const ,p1和p2本身是不可变的。 那我们想让指针指向的变量不可变怎么办?
typedef const int* CPINT; CPINT P1,CPINT P2; //这样p1和p2本身可变,指向的变量不可变。
5.typedef和函数指针
函数:int * test(const char *,int );
函数指针 int* ( * ptest)(const char * ,int )
我们每次定义这类函数的指针都要写这么长,很麻烦于是
typedef int * ( * PTEST)(const char * ,int);
以后我们在使用该函数指针时直接PTEST P1,P2;就可以了。
6.使用typedef的意义
使用typedef的好处就是简化类型的书写,创建与平台无关的数据类型,有利于代码移植,int在32位机器上就是32位的,在我们在32位机器上写的程序很可能无法在64位平台运行,我们可以把int用typedef重定义一下,即可增强代码的可移植性。
相关文章推荐
- C#中结构体和字节数组转换实现
- C++中const的用法详细总结
- C++中const用法小结
- 解析结构体的定义及使用详解
- C++中的const和constexpr详解
- 详解C++中的const关键字及与C语言中const的区别
- C++ 中const和复合类型
- C语言中结构体struct编写的一些要点解析
- 详解C语言的结构体中成员变量偏移问题
- c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)
- c++中const的使用详解
- 基于typedef的用法详解
- C语言基础知识点解析(extern,static,typedef,const)
- c++ 尽量不要使用#define 而是用const、enum、inline替换。
- 关于C/C++中typedef的定义与用法总结
- php面向对象全攻略 (十) final static const关键字的使用
- c#.net中const和readonly的区别
- C++中const的实现机制深入分析
- 深入C++ typedef的用法总结(必看)
- Static、const、extern区别