1. 程式人生 > >c\c++ 複習基礎要點06---聯合體

c\c++ 複習基礎要點06---聯合體

聯合體union

當多個數據需要共享記憶體或者多個數據每次只取其一的時候,可以利用聯合體。

1.      聯合體是個結構;

2.      它的所有成員對於基地址的偏移量都為0;

3.      聯合體的結構空間要大到足夠容納最“寬”的成員;

4.      其對齊方式要適合其中所有成員;

由於聯合體中的所有成員是共享一段記憶體的,因此每個成員存放的首地址相對與聯合體變數的地址的偏移量都為0,則所有成員的首地址都是一樣的。為了使得所有成員能共享一段記憶體,因此該記憶體空間的大小必須能夠容納成員中最大的成員。

例子:

union text

{

     chars[9];

    int  n;

    double  d;

};

S佔9個位元組,n佔4個位元組,d佔8個位元組,因此至少需要9個位元組的記憶體空間,但是其實該聯合體的大小並不是9個位元組,用sizeof計算出該聯合體的大小為16。從這裡可以看出聯合體所佔的記憶體空間不僅取決於最大的成員,還跟所有成員相關,即其大小必須滿足兩個條件:

1.      大小足夠容納最大成員;

2.      大小能被其包含的所有基本資料型別的大小所整除。

#include<iostream>

union u

{

       chars[9];

       int  i;

       doubled;

};

int main()

{

       unionu u1;

       printf("%d\n",sizeof(u1));

       printf("0x%x\n",&u1);

       printf("0x%x\n",&u1.s);

       printf("0x%x\n",&u1.i);

       printf("0x%x\n",&u1.d);

       u1.i=1;

       printf("%d\n",u1.s[0]);

//     printf("0x%x\n",u1.s[0]);

       unsignedchar *p=(unsigned char *)(&u1);

       printf("%d\n",*p);

       printf("%d\n",*(p+1));

       return0;

}

輸出結果:

16

0x18ff38

0x18ff38

0x18ff38

1

1

0

對於sizeof(u1)=16。因為u1s9位元組,n4位元組,d8位元組,因此至少需要9位元組。其包含的基本資料型別為charintdouble分別佔148位元組,為了使u1所佔空間的大小能被148整除,則需填充位元組以到16,因此sizeof(u1)=16.

對u1.n=1,將u1的n賦值為1後,則該段記憶體的前4個位元組儲存的資料為00000001 00000000 0000000000000000

因此取s[0]的資料表示取第一個單元的資料,其整型值為1,所以打印出的結果為1.

相關推薦

c\c++ 複習基礎要點06---聯合體

聯合體union 當多個數據需要共享記憶體或者多個數據每次只取其一的時候,可以利用聯合體。 1.      聯合體是個結構; 2.      它的所有成員對於基地址的偏移量都為0; 3.      聯合體的結構空間要大到足夠容納最“寬”的成員; 4.      其對齊方式

c\c++複習基礎要點15----c++執行時型別識別 dynamic_cast typeid type_info

C++提供了兩個操作符合一個類來實現執行時型別識別機制,它們是操作符dynamic_cast、操作符typeid和類type_info dynamic_cast操作符: dynamic_cast操作符可以將基類的指標安全地向下轉型為派生類指標。 語法格式:       

c\c++複習基礎要點12---容器vector

容器vector: 1.vector的能力: vector使用動態陣列實現的,所以元素之間總是存在某種順序,所以vectors是一種有序群集。vector支援隨機存取,因此只要知道位置,你可以在常數時間記憶體取任何元素。 在末端附加或刪除元素時,vector的效能相當好,可

Objective-C 2.0 基礎要點歸納

場景 問題 sub article 可選 特質 stop instance argc 本文的閱讀基本條件: 具備C/C++基礎知識,了解面向對象特征 閱讀過《Objective-C 2.0 程序設計(第二版)》、《Objective-C 程序設計 第

C++編程基礎06-布爾類型

控制 iostream false turn 修改 pre lse 防止 isp 1 // 06-布爾類型.cpp: 定義控制臺應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <iostream>

c語言基礎學習06

cas clu 小知識 fputs 轉義字符 而已 參與 子串 翻譯 =============================================================================涉及到的知識點有:1、C語言庫函數、字符輸入函數:

C 基礎要點

C的編譯過程 預編譯-------------> 編譯---------------->  彙編--------------->  連結     (.c)         

c++基礎要點整理(一)之——內部類

一. 內部類的定義       包含在一個類裡面都類稱為內部類,其定義形式為: class A { public: class InClass { void funcB

【C#期末複習1】零碎的基礎知識

最後一點就是堅持,有時候寫這些東西真的很痛苦,很讓人抓狂,但是你一旦你堅持下去,久而久之,你會看到自己的進步,某一天你回過頭去看自己以前寫的文章,當你能夠說出:“寫得真他媽菜”,那麼恭喜你,已經你升級了“。       &nb

DSP C語言基礎要點

 年初到現在,接觸DSP已經半年了,由於公司沒有人指導,做了這麼久都沒出什麼大的成果,也走了不少的彎路。以前做微控制器用C編過一些程式,個人覺得還可以。現在看來也只是在吃以前在學校裡面一些C語言皮毛的老本,加上一些網上說

C#基礎精華06(Linq To XML,讀取xml檔案,寫入xml)

Linq To XML xml 標記語言 html  xml 側重於儲存資料   html顯示資料 註釋<!-- 註釋 --> xml沒有預定義標籤  html有 核心類XElement,一個XElement表示一個元素,new XElement(“Order”

[.NET] 《Effective C#》快速筆記 - C# 高效編程要點補充

擔心 cti 四十六 catch con 影響 ted 註冊 ref 《Effective C#》快速筆記 - C# 高效編程要點補充 目錄 四十五、盡量減少裝箱拆箱 四十六、為應用程序創建專門的異常類 四十七、使用強異常安全保證 四十八、盡量使用安全的

C# 類型基礎(下)

合成 托管 相加 返回 長度 參數類型 一個 con 重載 前面介紹了基本的類型,接下來我們講講類型的轉換 值類型的兩種表現形式:未裝箱和已裝箱 ,而引用類型總是處於裝箱形式 int count = 10; object obj = count; 裝箱:值類型

C編程基礎

自身 自由 二進制 遍歷 ext 說明 gic 維護 cond 1. Hello World! 依照慣例首先Hello World鎮樓: 1 #include<stdio.h> 2 3 int main(void) { 4 printf("Hel

[C/C++]_[0基礎]_[static_cast,reinterpret_cast,dynimic_cast的使用場景和差別]

輸出 type class 可能 pen rgs make 在那 char 場景:1. C++的對象差別於C的原因是他們能夠有繼承關系, 方法有重載, 覆蓋關系等, 他們的對象內存數據結構因此也比較復雜.2. 非常多情況下我們須要一個父類來存儲子類的指針對象進行通用方法

【2017-06-20】Linux應用開發工程師C/C++面試問題之一:Linux多線程程序的同步問題

依次 其它 如果 開發工程師 logs 特殊 另一個 特殊情況 發生 參考之一:Linux 線程同步的三種方法 鏈接地址:http://www.cnblogs.com/eleclsc/p/5838790.html 簡要回答: Linux下線程同步最常用的三種方法就是互斥鎖、

C# 委托基礎

http throw 當前 告訴 .com html cati 特殊 multi 不知不覺,又開始委托的學習了,感覺這個東西我能學一輩子,哈哈哈!這次看的是官方的參考書(C#高編9),每次看不同的資料,總能學到不同的知識!言歸正傳 1、為什麽要使用委托? 我們習慣於將數據作

Chromium中多線程及並發技術要點(C/C++)

double down stat i/o and lte hbm fyi term 類別類說明演示樣例線程機制Thread(參考:線程模型及應用指南) MessagePump MessageQueue SequencedWorkerPool它是一個線程池,用於運行須要串

C++中的基礎

c++中的基礎進制轉換 #include<iostream> #include<stdlib.h> using namespace std; int main(void) { cout << "請輸入一個整數:" << endl; int x = 0; c

C#-01.語法基礎

不能 大寫字母 文件的 聲明 完全 傳遞參數 void 結果 數據 a. 語法基礎 i. 命名空間(namespace):是 C# 中組織代碼的方式,用來聲明命名空間 1. 語法:namespace 命名空間名稱