typedef解析

来源:互联网 发布:java set集合获取元素 编辑:程序博客网 时间:2024/06/05 17:03

最近在学习C语言,有很多新知识,我总是对不熟悉的知识有一种敬畏感,也就容易导致望而生畏的感觉,总是不会用,所以在学习之余我将其记录下来,也算是一次次征服吧!

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

1 0