C语法总结 结构联合枚举

2024-09-03 16:38

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



http://www.chinasem.cn/article/1133468

相关文章

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用