C語言基礎知識——結構體
阿新 • • 發佈:2018-12-01
1、C語言中提供了一些由系統已經定義好的資料型別,如:int,float,char等,使用者可以在程式中用它們定義變數,解決一般的問題,但人們要處理的問題往往比較複雜,只有系統提供的型別還不能滿足應用的要求,C語言允許使用者根據需要自己建立一些資料型別,用它來定義變數。
2、C語言允許使用者自己指定這樣一種資料結構,它由不同型別的資料組合成一個整體,以便引用,這些組合在一個整體中的資料是互相聯絡的,這樣的資料結構稱為結構體。
宣告一個結構型別的一般形式如下:
struct 結構體名
{
成員列表
};
大括號內是該結構體中的各個成員,由它們組成一個結構體,對各成員都應進行型別宣告。舉例如下:
struct student1
{
int id;
char name[20];
}s0;//定義struct student1型別的變數s0
注:一個結構體變數中可以存放一組資料(結構體陣列)
定義結構體型別的變數,並在其中存放具體的資料。舉例如下:
struct student1 s1; //定義struct student1型別的變數s1
struct student1 s2 = {2, "小明"}; //定義結構體變數並直接初始化
struct student1 s3 = {4, "小紅"};
注:a. 型別與變數是不同的概念,只能對變數賦值,存取或運算。不能對一個型別賦值,存取或運算。在編譯時,對型別是不分配空間的,只對變數分配空間
b. 對結構體中的成員可以單獨使用,它的作用相當於普通變數
c. 成員也可以是一個結構體變數
使用.引用成員,指標用“->”引用成員
printf ("id2 = %d, name2 = %s\n", s2.id, s2.name); //id2 = 2, name2 = 小明
struct student1 *ps = &s1;
s1.id = 20;
printf ("id4 = %d, name4 = %s\n", ps->id, ps->name); //id4 = 20, name4 = 小紅
3、記憶體對齊
I、結構體成員的首地址要能被該成員的型別長度整除
II、結構體為成員分配空間原則:
a、每次分配的時候按當前最大型別分配
b、如果當前空間夠用,則不再分配空間
c、如果當前型別大於系統係數的時候,按系統係數標準進行分配空間,否則按最大型別分配空間
#include <stdio.h>
struct Test
{
char c1;
int a;
char c2;
//char c3——再加上c3這一成員時,所佔記憶體空間依舊為12位元組
};
struct Test1
{
char c1;
char c2;
char c3;
int a;
};
struct Test2
{
char c1;
short s;
int a;
char c3;
struct Test t1; //成員也可以是一個結構體變數
int b[20];
};
int main()
{
printf ("sizeof Test = %lu\n", sizeof(struct Test)); //sizeof Test = 12
printf ("sizeof Test1 = %lu\n", sizeof(struct Test1)); //sizeof Test = 8
printf ("sizeof Test2 = %lu\n", sizeof(struct Test2)); //sizeof Test = 104
struct Test2 t1, t2;
t1 = t2;//通過結構體可對陣列進行賦值
return 0;
}
**4、**共用體
所用成員共用一段記憶體,共用體大小是成員中佔據最大的成員的大小
union Test
{
int a;
char c;
};
int main()
{
printf ("sizeof Test = %lu\n", sizeof(union Test)); //sizeof Test = 4
union Test t;
t.a = 10;
t.c = 'A';
printf ("%d\n", t.a); //65,原先所存的Int型的10,被後存入的char型‘A’所覆蓋(‘A’==65)
return 0;
}