1. 程式人生 > >C語言中聯合體union的使用

C語言中聯合體union的使用

本文編輯整理自: 一、前言 聯合體”(union)與“結構體”(struct)有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間, 一個結構變數的總長度是各成員長度之和。而在“聯合”中,各成員共享一段記憶體空間, 一個聯合變數的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入一個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值 一個聯合體型別必須經過定義之後, 才能使用它,才能把一個變數宣告定義為該聯合體型別。 二、聯合體的定義 定義一個聯合型別的一般形式為:  union聯合名
成員表  }; 成員表中含有若干成員,成員的一般形式為: 型別說明符 成員名。成員名的命名應符合識別符號的規定。 例如:  union perdata {    int class;    char office[10]; };   定義了一個名為perdata的聯合型別,它含有兩個成員,一個為整型,成員名為class;另一個為字元陣列,陣列名為office。聯合定義之後,即可進行聯合變數說明,被說明為perdata型別的變數,可以存放整型量class或存放字元陣列office。 三、聯合體變數的宣告   聯合變數的說明和結構變數的宣告方式相同, 也有三種形式。第一種先定義聯合體型別,再宣告聯合體變數
;第二種,定義聯合體型別的同時宣告聯合體變數;第三種,直接宣告聯合體(以匿名的形式定義聯合體型別)。 以perdata型別為例,說明如下:  第一種,先定義聯合體型別,再宣告聯合體變數 unionperdata {    int class;    char officae[10]; }; unionperdata a,b; /*說明a,b為perdata型別*/ 第二種,定義聯合體型別的同時宣告聯合體變數union perdata int class; char office[10];  }a,b; 第三種,直接宣告聯合體(以匿名的形式定義聯合體型別)union int class;
char office[10];  }a,b  經說明後的a,b變數均為perdata型別。a,b變數的長度應等於 perdata 的成員中最長的長度, 即等於office陣列的長度,共10個位元組。對a,b變數如賦予整型值時,只使用了2個位元組,而賦予字元陣列時,可用10個位元組。 四、聯合體變數的賦值和使用   對聯合體變數的賦值,使用都只能是對變數的成員進行。  聯合變數的成員表示為: 聯合變數名.成員名 例如,a被說明為perdata型別的變數之後,可使用 a.class,a.office  不允許只用聯合變數名作賦值或其它操作。 也不允許對聯合變數作初始化賦值,賦值只能在程式中進行。 一個聯合體變數, 每次只能賦予一個成員值。一個聯合變數的值就是聯合變員的某一個成員值。 [例4.1]設有一個教師與學生通用的表格,教師資料有姓名,年齡,職業,教研室四項。學生有姓名,年齡,職業,班級四項。 程式設計輸入人員資料, 再以表格輸出。 main() { struct    {       char name[10];       int age;       char job; union       {          int class;          char office[10];       } depa;    }body[2]; int n,i; for(i=0;i<2;i++)    {       printf("input name,age,job and department\n");       scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);       if(body[i].job=='s')          scanf("%d",&body[i].depa.class);       else          scanf("%s",body[i].depa.office);    }    printf("name\tage job class/office\n"); for(i=0;i<2;i++)    {    if(body[i].job=='s')       printf("%s\t%3d %3c %d\n",body[i].name,body[i].age ,body[i].job,body[i].depa.class);    else       printf("%s\t%3d %3c %s\n",body[i].name,body[i].age, body[i].job,body[i].depa.office);    } }   本例程式用一個結構陣列body來存放人員資料, 該結構共有四個成員。其中成員項depa是一個聯合型別, 這個聯合又由兩個成員組成,一個為整型量class,一個為字元陣列office。在程式的第一個for語句中,輸入人員的各項資料,先輸入結構的前三個成員name,age和job,然後判別job成員項,如為"s"則對聯合depa·class輸入(對學生賦班級編號)否則對depa·office輸入(對教師賦教研組名)。   在用scanf語句輸入時要注意,凡為陣列型別的成員,無論是結構成員還是聯合成員,在該項前不能再加"&"運算子。如程式第18行中 body.name是一個數組型別,第22行中的body.depa.office也是陣列型別,因此在這兩項之間不能加"&"運算子。程式中的第二個for語句用於輸出各成員項的值:

相關推薦

C語言聯合體union的使用

本文編輯整理自: 一、前言 “聯合體”(union)與“結構體”(struct)有一些相似之處。但兩者有本質上的不同。在結構體中,各成員有各自的記憶體空間, 一個結構變數的總長度是各成員長度之和。而在“聯合”中,各成員共享一段記憶體空間, 一個聯合變數的長度等於各成員中最長的長度。應該說明的是, 這裡所

淺談 C 語言的結構體【struct】與聯合體union

## C語言中結構 struct 與聯合 union 語法基本一致,如下以 struct 為例 一、struct 的基本用法 struct student {     int num;     char* sex; &nbs

C語言聯合體union

試題一:編寫一段程式判斷系統中的CPU 是Little endian 還是Big endian 模式?分析:作為一個計算機相關專業的人,我們應該在計算機組成中都學習過什麼叫Little endian 和Big endian。Little endian 和Big endian 是CPU 存放資料的兩種不同順序。

C 語言的結構體和共用體(聯合體

本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,

淺談C語言聯合體

      當多個數據需要共享記憶體或者多個數據每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對於聯合體是這麼描述的:      1)聯合體是一個結構;      2)它的所有成員相對於基地址的偏移量都為0;      3)此結構空間要大到足夠容納最"寬

問答關於C語言共同體(聯合體)的問題

 原問答是這樣的: “ #include main() { union data { long w; float x; char c; }; 執行下列語句後a的十進位制值是多少? union d

C語言結構體以及在結構體呼叫方法;聯合體聯合體的使用

#include <stdio.h>  #include<stdlib.h>void study(){}; struct student{ int age; int number; void(*study1)(); } main(){//使用,在結構

C語言字符、字符串、字符數組

文件 getc order 知識點 技術 ima 數組 c語言 align char a = ‘h‘; memory h char a[] = "Hello"; memory H e l l o ‘\0‘ stri

c語言一種典型的排列組合算法

scan .com nbsp 方法 can main else const 組合數 c語言中的全排列算法和組合數算法在實際問題中應用非常之廣,但算法有許許多多,而我個人認為方法不必記太多,最好只記熟一種即可,一招鮮亦可吃遍天 全排列: #include<stdio.h

c語言對字段寬度的理解?

style lib include creat span 演示 file code pre 1 /************************************************************************* 2 >

C語言求字符串的長度

類型 char 計算 語言 col pan har 字符 str1 在C語言中求字符串的長度,可以使用sizeof()函數和strlen()函數,後者需要引入string.h (#include <string.h>) 因為C語言字符串是以 \0 結尾表示結束的

sqlite學習筆記7:C語言使用sqlite之打開數據庫

實例 clas details code 返回 pri san filename stdlib.h 數據庫的基本內容前面都已經說得差點兒相同了。接下看看如何在C語言中使用sqlite。 一 接口 sqlite3_open(const char *filename, s

sqlite學習筆記11:C語言使用sqlite之刪除記錄

false done mta ase rom real not null -a ubun 最後一節,這裏記錄下怎樣刪除數據。 前面全部的代碼都繼承在這裏了,在Ubuntu14.04和Mac10.9上親測通過。 #include <stdio.h> #in

c語言命令行參數argc,argv[]詳解

[ ] 整數 argv 輸入 點擊 char main [1] 程序 main(int argc,char *argv[ ]) 1.argc為整數 2.argv為指針的指針(可理解為:char **argv or: char *argv[] or: char argv[][

sqlite學習筆記9:C語言使用sqlite之插入數據

name article void num mes cut cpp content int 前面創建了一張表,如今給他插入一些數據。插入數據跟創建表差點兒相同,不過SQL語言不一樣而已,完整代碼例如以下: #include <stdio.h> #inclu

C語言打印返回值

返回值 struct demo bsp %d return username har strdup demo: ----return :返回值------------------ int mosquitto_username

C語言的一個*和[]優先級問題

pre 執行 return ges spa 技術 分享 malloc bsp 最近寫著玩了這麽一段代碼 1 int Init(int **T, int v1, int v2, int v3) 2 { 3 4 if (!(*T=(int*) malloc(3*

C語言浮點數在內存的存儲方式

大端 部分 由於 包含 指數 類型 計算機 data- trac 關於多字節數據類型在內存中的存儲問題 //////////////////////////////////////////////////////////////// int ,short 各

理解C#語言的類型轉換----初學者的理解,請大神指教

寫代碼 需要 con c# 初學 har 3.1 parse 範圍 一下都是在視頻教學中學到後的理解,如果說錯了請大神指教 C#語言中的類型轉換,就是將某個數據要轉換成另一個類型的數據。 c#語言中的數據類型主要有: char類型(字符類型); string類型(字符串類型

C語言的編譯時分配內存

一個 地址 移植 eap 也會 功能 空間大小 全局區 限定 1.棧區(stack) --編譯器自動分配釋放,主要存放函數的參數值,局部變量值等; 2.堆區(heap) --由程序員分配釋放; 3.全局區或靜態區 --存放全局變量和靜態變量;程序結束時由系統釋放,分為全局初