結構體型別

2021-09-01 21:00:46 字數 2507 閱讀 8244

##結構體型別建立

####結構體宣告

struct a

;//分號不能丟

上面一段**就可以被稱為乙個結構體,struct a為結構體名,內為成員變數,}後必須加;

其他形式的結構體宣告

1.匿名結構體宣告:用於結構體只使用一次是用匿名宣告

struct

x;//x 為結構體變數

struct

a[20],*p;//a[20]為結構體陣列,p為結構體指標,指向結構體

2.型別重定義結構體宣告

typedef

struct a

node;

//node為結構體名,struct a也為結構體名進行了型別重定義

結構體自引用

首先看錯誤的宣告方法

struct node

;//結構體一被使用,就會一直建立結構體,會崩潰

所以應該這樣宣告

struct node

;

struct a

;//分號不能丟

struct a p1;

//定義d定義結構體

struct a

a[20],

*p;//此種方式也為結構體定義

結構體的初始化與陣列的初始化完全一致

結構體可以被整體初始化,但不能被整體賦值

都用{}來初始化,{}裡面放不同型別

//例子

struct a

;//分號不能丟

struct a p1=,2};

//例子

struct a

p1=,2};

方法:

1.第乙個成員變數與結構體變數偏移量為0位址處(第乙個成員變數的位址=結構體位址)

2.其他成員變數要對齊到某個數字(對其數)的整數倍的位址處。

對齊數=編譯器預設的對其屬與該成員大小 的較小值 。(在vs中對齊數為8,linux為4)

對齊:存放該變數的起始偏移量要整除改變量的對齊數(通常是能整除該變數的最小整數)

3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

4.如果巢狀了結構體,巢狀結構體對齊到自己的最大對其屬的整數倍,結構體的整體大小就是所有最大對齊數(內巢狀結構體的對齊數)的整數倍。(乙個結構體對齊數,內部最大對齊數)。

為什麼要記憶體對齊?

記憶體對齊是一種用空間換取時間的行為的

修改預設對齊數操作

#pragma pack(8)

//設定最大對齊數

struct a

;//分號不能丟

#pragma pack()

#pragma pack(1)

struct b

;//分號不能丟

上面兩段** 成員變數型別完全相同,struct a 大小是12,struct b大小是6

因為函式傳參時會拷貝乙份臨時變數,如果穿結構體就會直接拷貝整個結構體浪費空間;

如果傳入結構體位址,就會拿乙個結構體指標來接收;指標在32位平台下,都是4個位元組,會大大節省了空間

位段用於計算機網路,定義協議

1.位段的成員必須是int,unsigned,char

2.位段的成員變數名後邊有乙個冒號和乙個數字。

和結構體相比,位段可以達到同樣的效果,但可以很好的節省空間,但有跨平台問題

struct a

;struct ss=

;s.a=10;

s.b=12;

s.c=3;

s.d=

4;

記憶體分配

列舉 --------列舉。把可能的取值----列舉

如 一周七天可以列舉,乙個物體有幾個顏色也可以列舉

enum day

;enum day day=fri;

day=

5; //也可以 但是無意義

列舉常量的值預設從0 開始,一次遞增,如果賦初值,則從初值處一次遞增;

聯合(共用體)

聯合是一種特殊的自定義型別,有一系列成員變數,特徵是這些成員共用一塊空間

union un

union un un;

printf("%d\n"

,sizeof

(un));

聯合體任然要遵循記憶體對齊

1.聯合體的大小至少是最大成員的大小;

2.當最大成員不是最大對齊數的整數倍時,就把聯合體擴大到最大對齊數的整數倍;

結構體型別 結構體變數 結構體陣列 結構體指標

問題1 一元錢換為1 2 5分的硬幣,有多少種兌換方?本題要點分析及參 對各種可能情況進行一一測試。這是實現迴圈的一種方式 窮舉法 但實際上只有只有餘額才能兌換成其它面值的硬幣 main 注意換行的控制和每列的對齊 問題3 某鐵路線上有10個站,需要準備多少種客票?main b a 0 p prin...

和結構體 結構體型別與結構體變數

結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構體。在c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。結構體可以被宣告為變數 指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素...

priority queue 結構體型別

記錄一下,以後不能忘了!如果priority queue插入結構體型別的變數,需要過載 運算子 有兩種過載 運算子方式 1.在結構體內部寫過載 舉例 include include using namespace std struct node node 100 int main printf n ...