當前位置:首頁 » 編程語言 » c語言共用體類型
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言共用體類型

發布時間: 2022-09-19 08:39:31

㈠ 在c語言中,共用體一般有什麼作用

所謂共用體類型是指將不同的數據項組織成一個整體,它們在內存中佔用同一段存儲單元。其定義形式為:
union 共用體名
{成員表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了一個共用體數據類型union data ,定義了共用體數據類型變數obj。共用體數據類型與結構體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。

union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結構體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結構體類型所佔的內存空間為其各成員所佔存儲空間之和。而形同結構體的共用體類型實際佔用存儲空間為其最長的成員所佔的存儲空間。
對共用體的成員的引用與結構體成員的引用相同。但由於共用體各成員共用同一段內存空間,使用時,根據需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設計人員在同一內存區對不同數據類型的交替使用,增加靈活性,節省內存。

可以引用共用體變數的成員,其用法與結構體完全相同。若定義共用體類型為:
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最後一行的輸出是我們無法預料的。其原因是連續做mm.d='W';mm.b=34.2;兩個連續的賦值語句最終使共用體變數的成員mm.b所佔四位元組被寫入34.2,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了共用體變數的正確用法。

㈡ c語言中uint是什麼意思

c語言中uint是「共用體」類型結構,簡稱共用體,也叫聯合體。

在結構中各成員有各自的內存空間,一個結構體變數的總長度大於等於各成員長度之和。而在「聯合」中,各成員共享一段內存空間,一個聯合變數的長度等於各成員中最長的長度。

共享不是指把多個成員同時裝入一個聯合變數內,而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值,賦入新值則沖去舊值。

(2)c語言共用體類型擴展閱讀

uint是佔2位元組,uchar佔1位元組,uchar聲明的變數能存的位元組數肯定比uint少。無符號版本和有符號版本的區別就是無符號類型能保存2倍於有符號類型的正整數數據。

比如16位系統中一個int能存儲的數據的范圍為-32768~32767,而unsigned能存儲的數據范圍則是0~65535。

㈢ C語言設計 共用體 類型的本意和現在的主要應用

所謂共同體就是英文直譯就是聯合體,就是一個多個變數的結構同時使用一塊內存區域,區域的取值大小為該結構中長度最大的變數的值。
設有一個教師與學生通用的表格,教師數據有姓名,年齡,職業,教研室四項。學生有姓名,年齡,職業,班級四項。
編程輸入人員數據, 再以表格輸出。

程序用一個結構數組body來存放人員數據, 該結構共有四個成員。其中成員項depa是一個聯合類型, 這個聯合又由兩個成員組成,一個為整型量class,一個為字元數組office。在程序的第一個for語句中,輸入人員的各項數據,先輸入結構的前三個成員name,age和job,然後判別job成員項,如為"s"則對聯合depa·class輸入(對學生賦班級編號)否則對depa·office輸入(對教師賦教研組名)。

在用scanf語句輸入時要注意,凡為數組類型的成員,無論是結構成員還是聯合成員,在該項前不能再加"&"運算符。如程序第18行中
body[i].name是一個數組類型,第22行中的body[i].depa.office也是數組類型,因此在這兩項之間不能加"&"運算符。程序中的第二個for語句用於輸出各成員項的值:

int 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);
}
}

㈣ C語言關於共用體類型的問題

對於64位的浮點數,最高的1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M。
很顯然,在上面這種情況下,除了最後7位全部是0,E也全為0。這時,浮點數的指數E等於1-127(或者1-1023),有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數。這樣做是為了表示±0,以及接近於0的很小的數字。而%f只能列印出小數點後第六位,所以顯示的全部是0
如果再往後表示127位小數點,或者用科學計數法表示,可以看到是會有值的。只是他太小了。
書上的說的數值部分全部是0是不對的,數值部分後52位是有值的,只是乘上E-127以後太小了,可以忽略不計

㈤ c語言共用體類型

#include<stdio.h>
#include<stdlib.h>
struct
{
intnum;
charname[10];
charjob;
union
{
intclas;
charposi[10];
}cate;
}p[2];
intmain()
{
inti;
for(i=0;i<2;i++)
{
scanf("%d%c%s",&p[i].num,&p[i].job,p[i].name);//p[i].name已經是地址了,不需要&符號了
if(p[i].job=='s')
scanf("%d",&p[i].cate.clas);
elseif(p[i].job=='t')
scanf("%s",p[i].cate.posi);
elseprintf("inputerror!");
}
printf(" ");
for(i=0;i<2;i++)
if(p[i].job=='s')
printf("%d%s%c%d ",p[i].num,p[i].name,p[i].job,p[i].cate.clas);//class是unioncate的變數,當然p[i].clas是錯誤的了,況且上面的if語句不都是寫的p[i].cate.clas嗎
else
printf("%d%s%c%s ",p[i].num,p[i].name,p[i].job,p[i].cate.posi);//同上,並且p[i].cate.posi是char*類型,應該用%s而不是%c
system("pause");
return0;
}

㈥ c語言中共用體類型

共用體類型是union

㈦ c語言里,怎樣判斷共用體union的數據類型

我剛好也在考慮此問題,答案給各位補充完整:

ps:<C語言程序設計現代方法第二版>,該書明確說明。要判斷設置的是什麼類型的值只有增加標識。

可以這樣設計數據結構:

structmydata{
intsetflag;
union{
intstate;
char*msg;
}data;
};

mydata 自己設計得數據類型,setflag 標識設置的是哪個成員,從上到下可以從union的第一個成員開始:

如果第一個成員被設置,則setflag的最低位置1,其他位清零;

如果第二個成員被設置則,則setflag的倒數第二位置1,其他位清零;

以此類推,int一般是32位的,union最多可以有32個成員,成員多了可以再擴展標識變數(比如使用64位的long long 類型)。

然後寫一套操作函數:初始化mydata,設置成員值,獲取當前設置的成員值(可返回具體類型,union的每個成員需要對應一個get),判斷當前某個成員被設置,判斷當前是否設置過成員值。

自己實現的一套訪問函數簽名,如下:

//不知道編譯器會在setflag中放啥值,這個函數用來把setflag初始化為0
voidinitiate(structmydata*ptrdata);
//設置值得時候同時設置標識位
voidset(constvoid*ptrval,intbit);
//成功返回0,失敗返回-1,ptrintval指向預先分配的int地址空間
intgetstate(int*constptrintval);
//成功返回指向msg的指針,失敗返回NULL
char*getmsg();
//判斷當前設置的是哪個成員變數,取值1到32。如果給定的位被設置返回1,否則返回0
intissetmember(intflag);
//判斷當前是否設置過成員,setflag=0說明沒有設置過返回0,否則設置過返回1
intisset();

//initiate必須先調用,否則後面的判斷會有問題。弄得有點像C++或java的類了。

㈧ c語言中的共用體

我測試了一下
int為32bit
,long為32位
,char為8位機測試。
分析得出這樣的結果:

這正如共用結構體中
假如他們的共用首地址為0x10000000
那麼

地址
變數

0x10000000:
a[0]
如果執行語句
s.a[0]=0x39

0x10000004:
a[1]
相差4個位元組
那麼會產生如下變化:

0x10000000:
b
a[0]=0x39
b[0]=0x39
c[0]=0x39(
字元c[0]="9")

0x10000000:
c[0]
如果再執行語句
s.a[1]=0x38

0x10000001:
c[1]
那麼會產生如下變化:

0x10000002:
c[2]
a[1]=0x38

0x10000003:
c[3]
相差1個位元組

也即是地址0x10000000到0x10000003中的數據為0x00000039

也即是地址0x10000004到0x10000007中的數據為0x00000038

雖然是共用體,但是a
b
c同用了一個地址
如果對a賦值了也同時對b和c賦值
只是數據類型不同而已。

如果從地址上來分析
c如果定義的是c[8],那麼c[5]地址即為0x10000004
它的值就因該為0x38,因為和a[1]的地址相同。

查看b的是後可以直接用%d來查看
因為在本機上也是32bit和int相同

㈨ 在c語言中,共用體一般有什麼作用

共用體一般指聯合體,作用如下:

1、節省內存

有兩個很長的數據結構,不會同時使用,用結構體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了。

2、做某些轉換用

union{char a[8];double x;};

x=20.8;

cout<<hex<<a[0]<<「 」<<a[1]<<…<<endl;

(9)c語言共用體類型擴展閱讀:

結構體和共用體

結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。

結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。

共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。

共用體也是一種自定義類型,可以通過它來創建變數,