本文主要是介绍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; };
这篇关于C语法总结 结构联合枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!