C语言:随笔10--共用体
共用體概念:使用幾個不同的變量共占通一段內存的結構稱為“共用體”類型的結構。
定義共用體類型變量的一般形式為:
union 共用體名
{成員列表
}變量列表;
//有點類似于結構
//例子
union data
{int i;char ch;float f;
}a,b,c;//abc表示這個共用體的變量
//或者可寫為:
union data
{int i;//占4個子節char ch;//占1個子節float f;//占4個字節
};
union data a,b,c;//所以在整個共用體內共用體共占4個字節,不是所有之和9。
共用體和結構體的比較:
(1)結構體變量所占內存長度是各成員占的內存長度之和。每個成員分別占有其自己的內存單元。
而共用體變量所占的內存長度等于最長的成員的長度。(例如上邊定義的“共用體”變量a,b,c各占4個字節(因為一個實型和整型變量都是占4個子節)而不是各占4+1+4=9個子節)
(2)只有先定義了共用體變量才能引用它,而且不能引用共用體變量,而只能引用共用體變量中的成員。
例如前面定義了a,b,c為共用體變量。a.i(引用共用體變量中的整型變量i)a.ch,a.f。但是不能把變量a拿來引用。
(3)同一個內存段可以用來存放機中不同類型的成員,但是每一瞬間只能存放其中一種,而不是同時存放幾種。(就是不能兼容)(一個時間只能存放一種)
(4)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用。(因為上一次存放的已經被下一次的給覆蓋掉了)
(5)共用體變量的地址和它的各成員的地址都是同一個地址。
(6)不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,又不能在定義共用體變量時對它初始化。
(7)不能把共用體變量作為函數參數,也布恩那個使函數待會共用體變量,但可以使用指向共用體變量的指針。
(8)共用體類型可以出現在結構體類型定義中,也可以定義共用體數組。反之,結構體也可以出現在共用體類型定義中,數組也可以作為共用體的成員。
例子:假設有若干個人員的數據,其中有學生和教師。學生的數據包括:姓名、號碼、性別、職業、班級。教師的數據包括:姓名、號碼、性別、職業、植物。可以看出,學生和教師所包含的數據是不同的。現要求把他們放在同一個表格中。
代碼:
#include<stdio.h>
struct//定義一個結構,因為他還有其他的一些數據
{int num;char name[10];char sex;char job;union{int banji;char position[10];}category;//是班級或者是職務,那么我們定義一個union,任選其一}person[2];//為了方便假設一個學生一個老師void main()
{int I;for(I=0;i<2;i++){}}
結果:
---枚舉類型:
在實際問題中,有些變量的取值被限定在一個有限的范圍內。(例如一個星期只有7天。)把這些量說明為整型,字符型或其他類型顯然是不妥當的。因此C語言提供一種“枚舉”類型。
設有變量a,b,c被說明為山鼠的weekday,可采用下述任一種方式:
//第一種
enum weekday{sum,mou,tue,wed,thu,fir,sat};
enum weekday a,b,c;
//第二種
enum weekday{sum,mou,tue,wed,thu,fir,sat}a,b,c;
//第三種
enum {sum,mou,tue,wed,thu,fir,sat};
----typedef定義類型
typedef是給已知的類型名起別名。
typedef聲明新的類型名來代替已有的類型名。
//比如聲明INTEGER為整型
typedef int INTEGER;//為int這個整型取一個別名叫做INTEGER,只要在程序中出現了INTEGER就是int。
,
//再加深,比如說我們要聲明的是結構類型
#include <stdio.h>
Typedef struct
{int month;int day;int year;
}DATE;//為struct這個結構取一個別名叫做DATE。
//事實上DATE就是上邊的結構。void main()
{DATE date_one;//用一個結構定義一個變量date_one.month=9;date_one.day=22;date_one.year=2020;//在為date_one賦值。printf("%d-%d-%d-\n",date_one.month,date_one.day,date_one.year);
}
用typedef為NUM聲明一個整型數組類型:
//聲明格式:
typedef int NUM[100];//說明他的類型是int整型的,他有100個變量
#incluede<stdio.h>
typedef int NUM[100];//說明他的類型是int整型的,他有100個變量
void main()
{NUM num={0};//用NUM來定義一個小的num,并給他賦初值//此處注意了NUM不用加后邊的[100],因為你只是一個修飾,修飾說上邊的這個名稱NUM數組有多少個成員變量而已。所以這里只要用他的名字就行了printf("%d\n\n",sizeof(num));
}
聲明STRING為字符指針類型:
typedef char* STRING
#include<stdio.h>
typedef char* P;//為char*起別名叫做P
void main()
{P p1;//用P來命名p1p1="I lOVE";//p1指向一個字符串常量printf("%s",p1);//打印
}
聲明POINTER為指向函數的指針類型,返回整型值。
typedef int (*POINTER)();//后邊一個括號()表示他是一個函數,再一個括號(*POINTER)表示指向的這個函數名是用一個指針指向他的。
#include<stdio.h>typedef void (*P)();
void fun();
void main()
{P p1;//用P聲明了一個p1指針,這個p1指針是(*P)()這個類型//實際上就是這樣一個聲明 void (*p1)();p1=fun;//p1指向fun//fun是函數的名稱,(函數名稱和這個函數的地址就是同一個東西,所以此處加不加“&”符(即&fun)都是是一樣的)剛好可以把他替代進去(p1)();//上邊一句只是賦值,還沒有調用。//它是一個函數,所以要加上括號}
void fun()
{printf("I Love");
}
說明:typedef可以聲明各種類型名,但不能用來定義變量。
typedef只是對已經存在的類型增加一個類型名,而沒有傳召新的類型。
當不同源文件中用到同一類型數據時,常用typedef聲明一些數據類型,把他們單獨放在一個文件中,然后在需要用到他們的文件中用#include命令把他們包含進來。
typedef與#define 有相似之處,例如:typedef int COUNT;#define COUNT int的作用都是用COUNT代表int。但是,它們兩者是不同的。
#define是在預編譯處理的,他只是作簡單字符串替換,而typedef是在編譯時處理的。實際上它并不是作簡單的字符串替換,而是采用如同定義變量的方法哪樣來設革命一個類型。
typedef (int*) p1;//p1這個名稱是指向整型指針的。
總結
以上是生活随笔為你收集整理的C语言:随笔10--共用体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:随笔9--链表
- 下一篇: C语言:随笔11--文件操作