1. 程式人生 > >1.結構體型別建立 2.結構體初始化 3.結構體記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合

1.結構體型別建立 2.結構體初始化 3.結構體記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合

結構體型別的建立

1.結構體的宣告
結構是一些值的集合,這些值稱為成員變數。每個結構體的成員可以是不同型別的變數。

struct Student
{
    char name[20];//名字
    short age;//年齡
    char sex[5];//性別
    char id[20];//學號
};//分號不能丟

int main()
{
    struct Student stu1;
    return 0;
}

2.在結構體宣告中還有一種匿名結構體型別

//匿名結構體型別
struct  //在這裡省略了結構體的名字,在引用的時候只能在結構體內使用。
{
    char name[20];
    short age;
    char sex[5];
}stu1;
int main()
{
    return 0;
}

結構體初始化

1.
struct point
{
   int x;
   int y;
}p1;//宣告型別的同時定義變數p1
  struct point p2;//定義結構體變數p2
  struct point p3 = {x,y};//初始化:定義變數的同時賦值
 2.
struct Stu//型別的宣告
{
   char name[15];//名字
   int age;//年齡
};
struct Stu s = {"zhangsan",20};//初始化
3.
struct Node
{
   int date;
   struct point p;
   struct Node* next;
}n1 = {10,{4,5},NULL};//結構體巢狀初始化

結構體記憶體對齊

struct s1
{
   char arr1;
   char arr2;
   int a;
};
printf("%d",sizeof(struct s1));//結果是8

記憶體對齊的規則
1.第一個成員永遠放在結構體起始位置的0偏移處。
2.從第二個成員開始,每個成員都放在某個對齊數的整數倍的偏移處。
這個對齊數 = 成員自身的大小和預設對齊數的較小值。
vs:8
Linux:4
3.結構體的總大小必須是所有成員的對齊數中最大對齊數的整數倍。
4.如果結構體中巢狀結構體,巢狀的結構體要對齊到自身最大對齊數的整數倍處。
結構體的總大小是所有對齊數中最大對齊數的整數倍(包含巢狀結構的對齊數)

#include<stdio.h>
struct S3
{
	double a;
	char c;
	int i;
};
struct S2
{
   char c1;
   struct S3 s3;
   double d;
};
int main()
{
   printf("%d\n",sizeof(struct S2));//32
}

位段

位段的宣告和結構是類似的,但有兩個不同:
1.位段的成員必須是int,unsigned int ,或者signed int
2.位段的成員名後面有一個冒號和一個數字。

#include<stdio.h>
struct s1
{
   int a:2;
   int b:5;
   int c:10;
   int d:30;
};
int main()
{
   printf("%d\n",sizeof(struct s1));//8
}

列舉

1.定義
列舉顧名思義就是一一列舉。把可能取到的值一一列舉出來。
例如:
一週的星期一到星期日是有限的7天,可以一一列舉

enum Day//星期
{
   Mon;
   Tues;
   Wed;
   Thur;
   Fri;
   Sat;
   Sun;
}

2.列舉的優點

  1. 增加程式碼的可讀性和可維護性
  2. 和#define定義的識別符號比較列舉有型別檢查,更加嚴謹 2. 和#define定義的識別符號比較列舉有型別檢查,更加嚴謹
  3. 防止了命名汙染(封裝)
  4. 便於除錯
  5. 使用方便,一次可以定義多個常量

聯合(共用體)

1.定義
聯合也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間。

//聯合型別的宣告
union Un
{
   char c;
   int i;
};
int main
{   //聯合變數的定義
   union Un un;
   //計算連個變數的大小
   printf("%d\n",sizeof(un));
}

2.聯合的特點
聯合的成員是共用同一塊記憶體空間的,這樣一個聯合變數的大小,至少是最大成員的大小(因為聯合至少得 有能力儲存最大的那個成員)。

union Un
 {
     int i;
     char c;
 };
  union Un un;
 
// 下面輸出的結果是一樣的嗎?
 printf("%d\n", &(un.i)); 
 printf("%d\n", &(un.c));
 
//下面輸出的結果是什麼?
 un.i = 0x11223344;
 un.c = 0x55;
 printf("%x\n", un.i); 

3.聯合大小的計算

  1. 聯合的大小至少是最大成員的大小。
  2. 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
#include<stdio.h>
union Un1 
{
	char c[5];//5
	int i;//4
};
union Un2
{
	short c[7];//2*7 = 14
	int i; };
	//下面輸出的結果是什麼?
int main()
{
	printf("%d\n", sizeof(union Un1));//8
	printf("%d\n", sizeof(union Un2)); //16
}