C中的自定义类型

本文介绍了C语言中的共用体(union)和枚举(enum)的概念及区别,以及typedef的用法。共用体允许多个成员变量共享同一块内存,而枚举提供了一种为整数常量命名的方式。typedef则用于创建新的类型别名,简化类型定义。文章还展示了如何使用typedef定义数组、函数指针等类型的别名。
摘要由CSDN通过智能技术生成

        

共用体(联合体 union)

        共用体的基本知识

共用体也是一种C程序员自定义的组合类型.

union 共用体名
{
    类型 成员变量1;
    类型 成员变量2;
    ....   
};

共用体在语法形式和使用上,和结构体是一样的.

引用共用体的对象的成员也是 :

共用体和结构体的区别在哪里呢?

  • (1) 共用体的所有成员变量 共用一块内存

    共用体对象所占的内存大小是其最大的那个成员所占的大小.

    共用体对象的所有成员变量共用一块内存,共用体所有成员变量的地址都是一样的.

  • (2) 结构体对象所占内存大小是各成员变量所占内存大小之和.

        

3 枚举

0 一个问题

假如在你的C程序中,需要弄一个变量,来表示星期几?
    int weekday;//1 2 3 4 5 6 7 
    weekday = 6;
    weekday = 7;
    ...
    weekday = 250;??

1.枚举

把该类型所有可能的值都列举出来,并且每个值,还有一个名字("字面意思")

枚举也是C程序员自定义的一种类型

enum 枚举名
{
 枚举值的名(标识符)
};

如 :

enum weekday //新的类型名
{
    //该类型变量所有可能的值,都在这{}内
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT,
    SUN   
};
​
enum weekday w;//w是一个 类型为 enum weekday  的变量
w = MON;
​
if(w == SUN)
{
    //happy day
}
//构造了一个新的类型表示几种常用的颜色
enum color
{
    RED;
    GREEN;
    BLUE;
    YELLOW;
    BLACK;
    WHITE
};
​
enum color c = YELLOW;

枚举类型在实现时,枚举的值,是用一个整数值表示,如上面的例子 enum weekday

MON 0

TUE 1

WED 2

....

我们在定义枚举类型的时候,也可以指定枚举的值, 如:

enum weekday //新的类型名
{
    //该类型变量所有可能的值,都在这{}内
    MON = 250,
    TUE,//251
    WED,
    THU,
    FRI = 600,
    SAT, //601
    SUN   
};

WED的值虽然没有定义,但是会承接上面的自动加一,而到了FRI这里重新定义了,那么又会从新定义的地方开始加一。

因为枚举的类型是通过整数来实现,所有枚举类型的变量都可以++,--等整数参与的运算

如 : 
    enum weekday b = MON;
    b++;//TUE

 

typedef

0 一个问题

int a[10];//不仅定义了一个数组a,同时也声明了一个新的类型 "像a这样的类型  int[10] "
​
    定义一个与 a 类型一样的变量 b :
        //int[10] b
        int b[10];
        typeof(a) b;
   有没有办法声明一个 int[10] 这种类型呢?

1 typedef

typedef用来声明(定义) 一个新的类型名

这个类型已经有的,只不过我取一个新的名字.

语法 :

typedef 已经有的类型名  新类型名 ;
 
新类型名  就等同于  已经有的类型名

例子

typedef int zhengshu ;//整数就是一个新的类型名,他等同与 int
​
int a;
zhengshu a;
​
typedef unsigned char  uchar
typedef char u8
typedef short s16
 ....
struct student
{
    int num;
    char name[32];
    //...
};
​
typedef struct student stu_t;
stu_t s;
​
==> 
    typedef struct student
    {
        int num;
        char name[32];
        //...
    }stu_t;
​
    struct student
    {
        int num;
        char name[32];
        //...
    }stu;
    //上面定义了一个类型 struct student ,同时定义了一个这个类型的变量 stu
    
typedrf struct
{
    int a;
    int b;
}TEST;
//TEST 也是一个类型名
​
​
typedef struct node
{
    //...
}Node,Node2;
//Node,Node2 都是类型名,代表的是 struct node
​
typedef struct node
{
    //...
}Node,*pNode;
​
==> 
    typedef struct node  Node
    typedef struct node* pNode;
    //Node ,pNode 都是类型名,但是 :
    // Node <==> struct node
    // pNode <==>  stuct node*  pnode 是结构体指针的类型名
                                    

 typedef一些比较高级的用法

int b;//b是一个变量名
typedef int b;//b是一个类型名
​
int NUM[100];//NUM是一个数组名
typedef int NUM[100];//NUM 是一个类型名  typedef int[100] NUM;
​
NUM a;//a就是一个数组名,里面含有 100 int类型的元素
​
void (*p)(int, float);//p是一个函数指针变量
typedef void (*p)(int, float);//p是一个类型名, 函数指针类型
p p1;//p1 就是一个函数指针变量

        (ps:这几天的天气变化真的是深刻让我明白了中部地区只有夏天和冬天!!!) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值