C语言之typedef

本文详细介绍了C语言中的内建类型(如int、double)与用户自定义类型(如数组、结构体),着重讲解了typedef的作用,包括类型重命名、typedef与#define的区别,以及typedef在结构体、const和创建平台无关类型中的应用,展示了typedef在简化代码和跨平台开发中的重要性。
摘要由CSDN通过智能技术生成

1.1 C语言的两种类型:内建类型与用户自定义类型

        (1)内建类型ADT、自定义类型UDT

                        ADT:编译器定义的原生类型(譬如int 、 double之类的)。

                        UDT: 不是语言自带而是程序员自己定义的(比如数组类型、结构体类型、函数类型......)。

1.2 typedef定义(或者叫重命名)类型而不是变量

        (1)类型是一个数据模板,变量是一个是实在的数据。类型是不占内存的,而变量是占内存的。

        (2)面向对象语言中:类型就是class,变量就是对象。

1.3 typedef与#define的区别

                   typedef char *pchar;        (名在后)

                   #define pchar char *           (名在前)

1.4 tepedef与结构体

          (1) 结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。

       

#include <stdio.h>

//结构体类型的定义
struct student         //只是定义了类型没有变量所以现在不耗内存
{

    char name[20];    
    int age;

};

int main(void)
{
    //结构体成员的使用
    struct student s1;            //struct student 是类型; s1是变量
    s1.age = 12;                  //可以这样使用它        


    return 0;

}

             (2) C语言语法规定,结构体类型使用时必须时struct 结构体类型名 结构体变量名 ;这样的方式来定义变量。

#include <stdio.h>




//定义了一个结构体类型,这个类型有两个名字:第一个名字是struct student,第二个类型名叫student_t
typedef struct student
{

    char neme[20];
    int age;

} student_t;



int main(void)
{
    
    
    struct student s1;            //可用上面已经验证过了
    s1.age = 12;

    student_t s2;                 //编译不报错不警告

    return 0;

}

                (3) 使用teppedef 一次定义两个类型,分别是结构体变量类型,和结构体变量指针类型。

#include <stdio.h>


//一次定义了两个类型
//第一个是结构体类型,有两个名字:struct teacher ,teachar
//第二个是结构体指针类型,有两个名字 struct teachar *, pTeacher
typedef struct teachar
{

    char name[20];
    int age;
    int mager;


}teacher, *pTeacher;

int main(void)
{


    teacher t1;
    t1.age = 12;
    pTeachar p1 = &t1;

    printf("teacher age = %d\n",p1->age);





        return 0;


}

       

1.5 typedef与const

        (1)  typedef int *PINT;      const PINT p2; 相当于是 int * const p2;

#include <stdio.h>


typedef int *PINT;

// comst int *p 和 int *const p 是不同的。前者是p指向的变量是const,后者是p本身const

int main(void)
{

    int a = 12;
    int b = 45;
    PINT p1 = &a;
    
    const PINT p2 = &a;        //按逻辑来说展开的应该是 const int *P2 那么理论上来说p2指向的变                                    
                               //量是const的
    *p2 = 24;                  //但是通过指针解引用来改变a的值这行代码在编译器那变是没警告没错
    printf("a = %d\n",a);     //打印输出结果是24,证明p2指向的变量的值其实是可以改变的
                               //那就是其实展开应该是 int * const p2

    //为了验证猜想
    p2 = &b;    //将p2指向变量b   //编译器运行程序会报错“assignment of read-only variable                     
                                //‘p2’” 提示p2是只读表示不可改变
                                  

    return 0;

}

          (2)  typedef int *PINT;                PINT const p2; 相当于是 int * const p2;

        

#include <stdio.h>


typedef int *PINT;



int main(void)
{


        int a = 12;
        int b = 45;
        PINT p1 = &a;
        printf("a = %d\n",a);
        PINT  const p2= &a;
        *p2 = 24;
        printf("a = %d\n",a);

        //p2 = &b;   //还是p2只读



        return 0;

}

                (3)     如果要想得到const int *p;这种效果,只能typedef const int *CPINT;CPINT P1;

1.6 使用typedef的重要意义(两个:简化类型、创造平台无关类型)

                (1)简化类型的描述

                        char *(*) (char *, char *);                   typedef char *(*pfunc) (char *,char *);

                (2)很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术

        内核中先定义:typedef int size_t;

        然后再特定的编码需要下用size_t来替代int (譬如可能还有typedef int len_t)

        要将程序移值平台的话(譬如16移值32)只需要更改自定义类型 而不需要去代码中大量查找以及修改节省时间

                (3)stm32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值