struct与 union的基本用法
结构体与联合体是C语言的常见数据类型,可对C的基本数据类型进行组合使之能表示复杂的数据结构,意义深远,是优异代码的必备工具。
一. struct与 union的基本用法,在语法上union与struct相同,因此只以struct为例
1.1 基本用法:
- struct AA{ int a; int b;}; //结构体的声明和定义
- struct AA s1; //变量的声明和定义
- s1.a=3; //变量的使用:
复制代码
1.2 在声明结构体的同时定义变量:
- struct AA{int a; int b}s2={1, 2}; //此处AA为可选项,初始化部分为可选
- s2.a=5; //变量的使用
复制代码
1.3 使用 typedef 来简化struct的类型说明:
- typedef struct AA{int a; int b;}SAA;
- SAA s3, s4; //变量的声明和定义
- s3.a=8; //变量的使用
复制代码
1.4 使用时尤其注意后面的分号,必不可少;
二. struct 与 union的区别
2.1 struct中的成员是按顺序依次排列,互相独立,在排列时引入了对齐问题(2.2);而union中的成员共用一块内存,起始地址都是相同的,即union中的成员是对同一地址的多个引用、对同一地址的多种表达方法。
2.2 struct的对齐问题
对齐问题即struct中每个成员起始地址的分配。为了可以快速访问到每个成员,(以EW430为例)编译器根据成员的类型放到合适的地址上,默认为2字节对齐。如:
Struct AA{char c; int d;}aa;
假设aa被分配在地址N上,并且N为偶数,则aa.c的地址为N,aa.d的地址为N+2,而N+1地址未使用被浪费了。
对齐字节大小的指定:通过#pragma pack(n)来指定对齐字节的大小,n为某些常量(EW430中可取1,2,4,8,16),指定以n字节对齐。通常使用编译器默认的对齐大小最为适宜。如果指定对齐大小为1字节对齐,以上面的结构体变量aa为例,aa.c地址为N,aa.d地址为N+1,是个奇数地址,因为430在奇数地址只能读取一个字节,因此要访问d成员需要读取两次才能完成,后果是代码变长、速度变慢。
三. 匿名结构体与联合体
匿名结构体和联合体,即没有名字的结构体或者联合体,这种结构体(或联合体)无法通过.与->操作符引用(因为它所属的结构体或联合体没有名字,无法应用),而像暴露在外面一样,与外层作用域相同,可直接使用。
3.1 C标准中提及的匿名结构体和联合体(草稿原文引用)(C标准中提及的匿名结构(联合)体应该只适用于有名结构体(联合)中的匿名结构(联合)体成员)
- struct v{
- union{ //匿名联合体
- struct {int i, j;}; //匿名结构体
- struct {long k, l;}w;
- };
- int m;
- }v1;
- v1.i=2; //合法,匿名结构体的成员被直接使用
- v1.k=3;//非法,有名字的结构体需要引用他的名字,如下
- v1.w.k=5; //合法
struct与 union的基本用法的更多相关文章
- C语言进阶——struct和union分析10
struct的小秘密: C语言中的struct可以看作变量的集合 struct的问题:空结构体占用多大内存呢? 程序实例1: #include <stdio.h> struct TS { ...
- 关于C中struct和union长度的详解
这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今 ...
- 【转】C/C++ struct/class/union内存对齐
原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...
- 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题
SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...
- Union all的用法实例sql
---Union all的用法实例sqlSELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowTy ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- struct 和union的区别
union ( 共用体):构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 ):是一种构造类型 用途: 把不同的数据组合成一个整体——自定义数据 ...
- <转> Struct 和 Union区别 以及 对内存对齐方式的说明
转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...
- struct和union
struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...
随机推荐
- POJ-3352 Road Construction,tarjan缩点求边双连通!
Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...
- POJ 1056 IMMEDIATE DECODABILITY
IMMEDIATE DECODABILITY Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9630 Accepted: ...
- 【Luogu】P1119灾后重建(Floyd)
题目链接 见题解: feilongz. 这里只放代码. #include<cstdio> #include<cstring> #include<cstdlib> # ...
- mysql5.7.23版本安装教程
亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间.希望这篇文章能够帮助大家少走弯路~~ 1.下载我下载的是64位. 2.解压下载之后,我选 ...
- 转载:CreateMutex WaitForSingleObject ReleaseMutex使用
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,// BOOL bInitialOwner, // flag for init ...
- Spoj-BOKAM143SOU Checking cubes.
Given a integer N. Find number of possible ways to represent N as a sum of at most five cubes. Input ...
- 二分图最小覆盖的Konig定理及其证明,最小的覆盖证明
[转http://www.cppblog.com/abilitytao/archive/2009/09/02/95147.html -> http://yejingx.ycool.com/p ...
- 洛谷P2676 超级书架
题目描述 Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了.现在,只有书架的顶上还留有一点空间. 所有N(1 <= N & ...
- yii 之数据库关联查询
<?php namespace app\controllers; use yii\web\Controller; use app\models\Customer; class CustomerC ...
- ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...