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

相关文章

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枚举的常用

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、