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

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接