日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构体与共用体(联合体)

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体与共用体(联合体) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:結構體與共用體
作者:一只青木呀
發布時間: 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走的。

總結

以上是生活随笔為你收集整理的结构体与共用体(联合体)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。