`

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;
};

 

 

 

 

 

分享到:
评论

相关推荐

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    数据结构与算法_C语言 01.swap.mp4 02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4 07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速...

    C语言编程兵书(完整扫描版 )pdf格式 电子书

    联合,枚举和位域;预处理;文件操作;综合实例应用。随书所附光盘包含本书配套实例源文件、赠送的C语言学习资料和教学视频。本书适合所有想全面学习C语言的编程人员及C语言爱好者阅读。 章节目录: 第1篇 C语言...

    C语言大纲及课件

     通过本课程的学习,学生应能掌握C语言的语法、语义规则、语言的数据类型及程序结构。能运用结构程序设计的思想,进行正确地阅读、分析程序和设计编制程序,具有程序设计的能力。 二、教学基本要求 1.理论教学  ...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

    c语言初学者入门讲座

    面向对象编程和可视化集成开发工具的发展,使很多曾经非常流行的编程语言影响下降甚至逐步消失,但有一种语言是例外,它就是C语言,时光流逝丝毫没减低C的魅力,它的风采依然如旧。  C语言已经深深的进入各种操作...

    C语言精典版本C程序设计语言

    C程序设计语言C语言精典版本 目 录 译者序 序 第1版序 前言 第1章 基本概念 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 1.5.1 文件复制 1.5.2 字符计数 1.5.3 行计数 1.5.4...

    C语言初学者入门讲座

     C语言已经深深的进入各种操作系统,通过对C语言的学习,能够很快的掌握操作系统的底层结构和操作方式,因此C语言是学习编程的首选语言。为满足广大读者的要求,本期专题特别推出C语言初级教程。  第一讲 慨述 ...

    你必须知道的495个C语言问题.pdf

     “本书清晰地阐明了Kernighan与Ritchie的The C Programming Language一书中许多简略的地方,而且精彩地总结了C语言编程实践,强烈推荐!”  ——Yechiel M.Kimchi,以色列理工学院 目录: 第1章 声明和...

    你必须知道的495个C语言问题

    第2章 结构、联合和枚举 21 结构声明 21 2.1 struct x1{...};和typedef struct{...}x2; 有什么不同? 21 2.2 这样的代码为什么不对?struct x {...}; x thestruct; 22 2.3 结构可以包含指向自己的指针吗? 22 ...

    C语言入门经典(第4版)--源代码及课后练习答案

    IvorHorton还著有关于C、C++和Java的多部入门级好书,如《C语言入门经典(第4版)》和《C++入门经典(第3版)》。 译者  杨浩,知名译者,大学讲师,从事机械和计算机方面的教学和研究多年,发表论文数篇,参编和翻译的...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    C语言FAQ 常见问题列表

    结构、联合和枚举 o 3.1 声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同? o 3.2 为什么 struct x { ...}; x thestruct; 不对? o 3.3 一个结构可以包含指向自己的指针吗? o 3.4 在 C 语言...

    你必须知道的495个C语言问题(PDF)

    2 结构、联合和枚举7 2.1 声明struct x1 f . . . g; 和typedef struct f . . . g x2; 有什么不同? . 7 2.2 为什么struct x f . . . g; x thestruct; 不对? . . . . . . . . . . . . . 7 2.3 一个结构可以包含指向...

    嵌入式Linux C编程入门(第2版) PPT

    第8章 嵌入式linux c语言基础——arm linux内核常见数据结构 225 8.1 链表 226 8.1.1 链表概述 226 8.1.2 单向链表 226 8.1.3 双向链表 233 8.1.4 循环链表 234 8.1.5 arm linux中链表使用实例 ...

Global site tag (gtag.js) - Google Analytics