1.結構體型別建立 2.結構體初始化 3.結構體記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合
阿新 • • 發佈:2018-12-22
結構體型別的建立
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.列舉的優點
- 增加程式碼的可讀性和可維護性
- 和#define定義的識別符號比較列舉有型別檢查,更加嚴謹 2. 和#define定義的識別符號比較列舉有型別檢查,更加嚴謹
- 防止了命名汙染(封裝)
- 便於除錯
- 使用方便,一次可以定義多個常量
聯合(共用體)
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.聯合大小的計算
- 聯合的大小至少是最大成員的大小。
- 當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
#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
}