结构体与共用体(联合体)
參考:結構體與共用體
 作者:一只青木呀
 發布時間: 2020-08-09 08:29:22
 網址:https://blog.csdn.net/weixin_45309916/article/details/107889394
參考:聯合體(union)的使用方法及其本質
 作者:秦偉H
 發布時間:2014-04-13 14:27:08
 網址:https://blog.csdn.net/huqinweI987/article/details/23597091?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162847148716780366592652%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162847148716780366592652&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-23597091.first_rank_v2_pc_rank_v29&utm_term=%E8%81%94%E5%90%88%E4%BD%93&spm=1018.2226.3001.4187
目錄
- 結構體
- 什么是結構體?
- 定義結構體
- 定義結構體變量:
- 匿名結構體:
- 實現給結構體取別名
- 結構體嵌套
 
- 聯合體
- 概念
- 和struct的異同
- 共用內存地址
- union所占內存空間大小
 
結構體
什么是結構體?
用來存儲不同類型的(數組存儲的是同種類型數據)數據
定義結構體
struct 結構體名字{需要存儲的類型或者數組};例:
struct student{char name[20];int id;};實際中,保存的數據一般不會是同一種類型。而結構體的大小也不是成員類型大小的簡單相加。需要考慮到系統在存儲結構體變量時的地址對齊問題。
由于存儲變量地址對齊的問題,結構體大小計算必須滿足兩條原則:
一、結構體成員的偏移量必須是成員大小的整數倍
二、結構體大小必須是所有成員大小的整數倍
具體計算方法參照這篇博文:結構體對齊計算方式
定義結構體變量:
struct student stu1;這樣就是定義一個結構體類型的變量,這樣就能夠使用這個結構體變量來存東西,其實就是給結構體里面的變量賦值,使用方式:stu1.id=12;直接‘ . ’出成員賦值即可。
定義結構體數組: struct student stu[10];這樣就是定義一個結構體數組,這樣就能狗使用這個結構體數組來存10個信息,使用方式:stu[0].id=12;跟上面一個直接 ’ . ’ 出成員賦值及即可。stu[0]就是表示第一個結構體變量
匿名結構體:
struct { int id;char b; }p;這樣想當然定義了結構體變量,變量名是p,要寫就變量就在后面接幾個變量名
實現給結構體取別名
typedef struct{}Str;Str s; //可以直接定義結構體變量結構體嵌套
struct Node{int a;int b;};struct Str{struct Node n;}//示例struct Str s;s.n.a=10;s.n.b=20;聯合體
概念
聯合體又稱共用體
union 名字{成員};
聯合的所有成員引用的是內存中的相同位置,以最大的成員的內存長度作為union的內存大小。
定義:
union Node{char c;short s;int a;double d;};聯合體雖然可以有多個成員,但同一時間只能存放其中一種
和struct的異同
union,中文名“聯合體、共用體”,在某種程度上類似結構體struct的一種數據結構,共用體(union)和結構體(struct)同樣可以包含很多種數據類型和變量。
不過區別也挺明顯:
-  結構體(struct)中所有變量是“共存”的——優點是“有容乃大”,全面;缺點是struct內存空間的分配是粗放的,不管用不用,全分配。 
-  聯合體(union)中是各變量是“互斥”的——缺點就是不夠“包容”;但優點是內存使用更為精細靈活,也節省了內存空間。 
共用內存地址
#include<stdio.h> union var{long int l;int i; }; int main(){union var v;v.l = 1;printf("v.l is %d\n",v.i);v.i = 2;printf("now v.l is %ld! the address is %p\n",v.l,&v.l);printf("now v.i is %d! the address is %p\n",v.i,&v.i);system("pause"); return 0; }
 所以,union叫共用體還真是貼切——完全就是共用一個內存首地址,并且各種變量名都可以同時使用,操作也是共同生效。如此多的access內存手段,確實好用,不過這些“手段”之間卻沒法互相屏蔽——就好像數組+下標和指針+偏移一樣。
union所占內存空間大小
前面說了,首先,union的首地址是固定的,那么,union到底總共有多大?根據一些小常識,做個不嚴謹不高深的基礎版驗證吧。
根據:分配棧空間的時候內存地址基本上是連續的,至少同類型能保證在一起,連續就說明,我如果弄三個結構體出來,他們三個地址應該連著,看一下三個地址的間隔就知道了,也可以用sizeof直接看,就知道union的大小了。
#include<stdio.h> union sizeTest{int a;double b; }; main(){union sizeTest unionA;union sizeTest unionB;union sizeTest unionC;printf("the initial address of unionA is %p\n",&unionA);printf("the initial address of unionB is %p\n",&unionB);printf("the initial address of unionC is %p\n",&unionC);system("pause"); }很容易看出,8,0,8,這間隔是8字節,按double走的。
總結
以上是生活随笔為你收集整理的结构体与共用体(联合体)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: STM32震动感应控制继电器(使用循环V
- 下一篇: pow(x,n) leecode
