typedef与define的区别
###如下分析:
define PINT1 int *
tyedef int *PINT2;
PINT1 p1,p2;
PINT2 p3,p4;
请问p1与p2是同一类型吗,p3与p4呢?
答案是p1与p2不是同一类型;p3与p4是同一类型即指针类型; 按照下文分解其实际定义结果:
int *p1;
int p2;
int *p3;
int *p4;
也就是说,只有typedef才真正拥有自定义变量的能力,当然也包括上面的重命名内建类型(ADT)的能力,尤其是在定义某个比较复杂的自定义类型时,typedef就很方便了:
typedef int *(*pFunc)(int *, int *);
pFunc p1;
int *(*p2)(int *, int *);
p1和p2的类型是一模一样的,你说哪个简单些呢,尤其是需要需要大量定义时
2.typedef改变自建类型增强可移植性
在C语言中,很多自建类型譬如int ,在不同的平台下其自身大小是不一样的,不如16位机器上是16位的,32位机器上是32位的,所以为了解决这个问题就做了很多自定义作为缓冲,譬如:typedef int size_t
,尤其是在linux系统中用特别多
3. typedef与结构体的自定义
很多时候当你定义结构体时:
struct student
{
int age;
char name;
}
//其实是这样定义的:
typedef struct student
{
int age;
char name;
}Stu,*pStu;
那么后面的定义是什么意思呢?
//在使用结构体时:
struct student s1;
//也可以:
Stu s1;
//定义结构体指针
pStu p1;
也就是说在此处typedef的用法就是简化结构体的命名使用,其后面的名字可以和原结构体名字相同:
typedef struct student
{
int age;
char name;
}student;
这样也是可以的
4.typedef与const变量
如下代码:
typedef int *PINT;
const PINT p1;
请问此处const常量是指针p1本身还是p1指向的那个变量呢?
很多人会觉得是p1所指向的那个变量,认为是这样的:
const int * p1;
其实不然:
typedef int * PINT;
int main(void)
{
int a = 5;
const PINT p1;
p1 = &a;
return 0;
}
编译时,编译器报错:error: assignment of read-only variable ‘p1’
p1 = &a;
即p1是const常量不可改变。那么这样呢:
typedef int * PINT;
int main(void)
{
int a = 5;
PINT cosnt p1;
p1 = &a;
return 0;
}
结果一样,编译器报错。
所以在学习C语言时,凭一己之思考是远远不够的,更多的动手实践,正所谓实践出真知!