C语法总结 结构联合枚举

 

结构

//结构变量的声明
struct {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
} part1, part2;

//初始化
struct {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
} part1 = { 528, "Disk driver", 10 };
   part2 = { 914, "Printer cable", 5};

//C99的指定初始化,对于上面的结构变量声明初始化可以改为
{.number = 528, .name = "Disk Driver", .on_hand = 10 };
//将 点号 和 成员名的组合称为指示符,指定初始化式有几个优点
//1.易读且易验证
//2.初始化式中的值的顺序不需要与结构中成员的顺序一致

//对结构的操作
part1.number = 258;
part1.on_hand = 10;
part2 = part1;
//指针操作
struct node *ptr;
(*ptr).name = "Disk driver";
ptr->name = "Disk driver";

//结构标记的声明,注意最后必须以分号结尾
struct part {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
};
struct part part1;
struct part part2;
//结构声明和 结构变量声明可以写在一起
struct part {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
} part1, part2;

//结构类型定义,使用typedef来定义真实的类型名
typedef struct {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
} Part;
Part part1, part2;
//因为Part是typedef的名字,所以不允许写成struct Part;
//C99中的复合字面量

//嵌套结构
struct person_name {
    char first[FIRST_NAME_LEN+1];
    char middle_initial;
    char last[LAST_NAME_LEN+1];
};
//可以用person_name作为更大结构的一部分
struct student {
    struct person_name name;
    int id;
    int age;
    char sex;
}; student1, student2;

//结构数组
struct part inventory[100];
inventory[i].number = 883;

//结构数组初始化,存储国家和长途电话的地区码
struct dialing_code {
    char *country;
    int code;
};
const struct dialing_code country_codes[] = {
    {"Argentina", 54},
    {"Korea",    82},
    {"China",    86}     
};

 

 

 

联合

union {
    int i;
    double e;
};
//联合的声明方式非常类似于结构的声明,但是联合中int和double是存储在同一内存
//地址中的,联合可以节省空间
union un{
    int i;
    double e;
} u1, u2;

typedef union {
    int i;
    double e;
} un;

//sizeof(u1) 或者 sizeof(un)的结构都是8字节,因为按照最大的存储单元来算
//double 是8个字节,所以这个联合体是8个字节
//用联合来构造混合的数据结构
typedef union {
    int i;
    double d;
} Number;
Number number_array[100];
number_array[0].i = 5;
number_array[2].d = 3.14;

 

 

 

枚举

//枚举类型(enumeration type)是一种由程序员列出"枚举"的类型,而且必须为
//每个值命名枚举常量,这里用来定义扑克牌的四种花色
enum {
    CLUBS, DIAMONDS, HEARTS, SPADES
} s1, s2;
//枚举的声明方式跟结构联合类似
enum suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
};
enum suit s1, s2;

typedef enum {
    CLUBS, DIAMONDS, HEARTS, SPADES
} Suit;
Suit s1, s2;
//还可以创建bool类型,不过C99中自带了这种类型可以不用创建了
typedef eunm {FALSE, TRUE} Bool;

//枚举中默认给每个变量分配0,1,2。。。。 这样的整数,还可以指定这些数
enum suit {
    CLUBS =1 , DIAMONDS = 2, HEARTS = 3, SPADES = 4 
};
//也可以是任意整数,不用按照特定的顺序
enum dept { RESEARCH = 20, PRODUCTION = 10, SALES = 25 };
//没有为枚举指定值时,它的值通常比前一个值大1,这里的BLACK为0,
//DK_GRAY为8
enum EGA_colors{BLACK, LT_GRAY=7, DK_GRAY, WHITE=15};

//枚举变量s ,可以对其进行s++操作
//虽然把枚举的值作为整数使用非常方便,但是把整数用作枚举的值却是非常危险
//的,我们可能不小心把4存储到s中,而4不能跟任何花色相对应

//用枚举生命"标记字段"
typedef struct {
    enum { INT_KIND, DOULBE_KIND} kind;
    union {
        int i;
        double d;
    } u;
} Number;

 

 

对于结构进行sizeof操作

struct {
    char a;
    int b;
}s;

如果char占1个字节,int占4个字节结构应该是5个字节,但是有些计算机要求特定数据项的地址是某个字节

数(一般是2字节,4字节,8字节)的倍数。为了满足这一要求,编译器会在邻近的成员之间留“空洞”,从而使结构的成员对其,如果假设数据项必须从4个字节的倍数开始,那么对上面的结构进行sizeof操作结构应该是

8个字节。

struct {
    int a;
    char c;
} s;

对于上面的结构来说,可能会出现尾部的“空洞”

 

C语言早期没有typedef,所以标记是结构类型命名的唯一有效方式,就像下面这种声明,但假如typedef时已经晚了,标记已存在了无法删除了

struct par{
    int number;
    char name[NAME_LEN+1];
};

而当结构成员是指向同类型结构的指针时,标记仍然是非常有必要的,如

struct node{
    int value;
    struct node *next;
};

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值