1. 程式人生 > >C語言基礎知識——結構體

C語言基礎知識——結構體

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