typedef解析

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语言时,凭一己之思考是远远不够的,更多的动手实践,正所谓实践出真知!

你可能感兴趣的:(C语言)