自己总结c语言结构体和共用体的不同写法

看到过结构体写法常用定义的是这种方式

struct st{
    int value;
};

自己从平时整理一下,还有如下,(如果不全后续补充一下)

 

struct {
    int value;
    }b,c;

这个结构体没有名称,定义了没有名称的结构体变量b和c(读起来有些拗口);

struct st1{
   int value;
}d,e;

这个结构体名称st1, 变量d和e也已经定义完成了

struct str2{
   int value;
   int value1;
}f[2] = {
    {14,15},
    {16,17},
        } ;

这个结构体str2声明之后,也定义了f[2]变量,全名(结构体数组变量f),变量直接进行了赋值;最外面的大括号必须要,内部的大括号可以没有,可以省略掉,加上了整体一些,最后赋值结尾的逗号,也是可以省略掉

扩展一下:

union共用体和struct结构体,也是完全可以通用的声明定义方式。

 

### C语言 `union` 共用体写法使用 #### 定义共用体 定义共用体的方式类似于结构体,只是关键字由 `struct` 改为 `union`。其基本格式如下: ```c union 共用体名 { 成员列表; }; ``` 例如,定义一个名为 `test` 的共用体并声明变量 `t1` 如下所示[^1]。 ```c union test { char c; short s; int i; } t1; ``` #### 创建共用体变量 通过已定义的共用体型来创建具体的变量实例也很简单。下面的例子展示了如何基于之前定义的 `data` 类型创建多个共用体变量 `a`, `b`, `c`[^2]。 ```c union data{ int n; char ch; double f; }; union data a, b, c; // 创建三个共用体变量 ``` #### 访问共用体成员 由于所有成员共享同一段存储区域,因此每次给某个成员赋值都会覆盖之前的任何数据项。这意味着在同一时刻只有一个成员的数据是有效的。考虑以下例子中的行为变化[^4]: ```c #include <stdio.h> union Test_Union { char ch; int num; }; int main() { union Test_Union Un; Un.num = 0x111223344; printf("Char value after setting integer: %#x\n", Un.ch); return 0; } ``` 在这个程序里,当整数被赋予到 `Un.num` 后再读取字符形式 (`ch`) 将仅返回该整数值最低字节的内容。 #### 测量共用体大小 值得注意的是,尽管共用体内可能有不同类型的不同尺寸字段,整个共用体对象占用的空间等于其中最大成员所需的空间加上必要的填充位以满足对齐要求。这可以从下面这段测试代码得到证实[^5]: ```c #include <stdio.h> union data { int n; char ch; short m; }; int main(){ union data a; printf("Size of union data is %zu bytes.\n", sizeof(a)); a.n = 0x40; printf("After assigning to .n :%X, %c, %hX\n", a.n, a.ch, a.m); a.ch = '9'; printf("After assigning to .ch:%X, %c, %hX\n", a.n, a.ch, a.m); a.m = 0x2059; printf("After assigning to .m :%X, %c, %hX\n", a.n, a.ch, a.m); a.n = 0x3E25AD54; printf("After reassigning to .n:%X, %c, %hX\n", a.n, a.ch, a.m); return 0; } ``` 此代码片段不仅显示了共用体的实际大小,同时也证明了修改任何一个成员会影响到其他未显式访问过的成员。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值