typedef本身是type define(类型定义)的缩写。
typedef为c语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个
新名字,不能创建新类型。
与define不同,typedef仅限于数据类型,而不是表达式或具体的值。
define发生在预处理,typedef发生在编译阶段。
点击查看代码
struct studentsInfoList
{
char name[20];
char sex;
};
typedef struct studentsInfoList sinfo;
int main()
{
sinfo s1;
return 0;
}
点击查看代码
#include<iostream>
typedef char* PCHAR;
int main()
{
//char* p1, p2;
PCHAR p1, p2;
std::cout << typeid(p1).name() << std::endl;
std::cout << typeid(p2).name() << std::endl;
typedef char ARRAY20[20];
return 0;
}
struct stu stu1;
这种写法更加简练,意义也非常明确,不管在标准头文件中还是以后的编程实践中,都会大量使用这种别名。
使用关键字typedef可以为类型起一个新的别名。typedef的用法一般为:
tpedef oldName newName;
oldName是类型原来的名字,newName是类型新的名字。例如:
点击查看代码
typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
typedef char ARRAY20[20];
它等价于:
char a1[20], a2[20], s1[20], s2[20];
注意,数组也是有类型的。例如 char a1[20];定义了一个数组a1,它的类型就是char[20]中讲解过。又如,为结构体类型定义别名:
点击查看代码
typedef struct stu {
char name[20];
int age;
char sex;
}STU;
STU body1, body2;
它等价于:
struct stu body1, body2;
再如,为指针类型定义别名:
typedef int(*PTR_TO_ARR)[4];
表示PTR_TO_ARR是类型int *[4]的别名,它是一个二维数组指针类型。接着可以使用PTR_TO_ARR定义二维数组指针:
PTR_TO_ARR p1, p2;
按照类似的写法,还可以为函数指针类型定义别名:
点击查看代码
typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC ptfunc;
typedef和 #define的区别
typedef在表现上有时候类似于#define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。
1.可以使用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。如下所示:
点击查看代码
# define INTEGE int
unsigned INTEGE n;//没问题
typedef int INTERGE;
unsigned INTERGE N;//错误,不能在INTERGE前面添加unsigned
2.在连续定义几个变量的时候,typedef能够保证定义的所有变量均为同一类型,而#define则无法保证。例如:
点击查看代码
#define PTR_INT int *;
PTR_INT p1, p2;
经过宏替换以后,第二行变为:
int* p1, p2;
这使得p1、p2成为不同的类型:p1是指向int类型的指针,p2是int类型。相反,在下面的代码中:
点击查看代码
typedef int* PTR_INTEGER;
PTR_INTEGER p1, p2;
p1、p2 类型相同,它们都是指向 int 类型的指针。
标签:typedef,20,int,知识,char,类型,CPP,PTR From: https://www.cnblogs.com/SunshineWeather/p/18260874