列舉,結構體,共用體

2021-05-28 01:16:50 字數 1094 閱讀 5696

列舉的定義:

enum log_level

dbg,

inf,

war,

err,

fat,

all,

offvoid writeinfor(log_level level)

switch(level)

case dbg:

printf("%d\n",dbg);

......

}

}

上述定義的列舉型別,預設為dbg=0,inf=1,依次類推。

(1)列舉型別是實數型別,可以跟int型別相互轉換。 其所定義的常量子與列舉型別有同樣的可見性,即dbg等可以被列舉型別外面的**所看到。列舉型別沒有名字限定作用。struct有名字限定作用。

(2)列舉型別所佔的空間

c++標準文件中是這樣說明的:「列舉型別的尺寸是以能夠容納最大枚舉子的值的整數的尺寸」,同時標準中也說名了:「列舉型別中的枚舉子的值必須要能夠用乙個int型別表述」,也就是說,列舉型別的尺寸不能夠超過int型別的尺寸,但是是不是必須和int型別具有相同的尺寸呢?上面的標準已經說得很清楚了,只要能夠容納最大的枚舉子的值的整數就可以了。在vs2010中sizeof的值為4。

(3)列舉和int是否可以互換

列舉長度可能比int小,有些情況下最好不用互換。

enum etype ;

etype val;

std::scanf( "%d", &val );

列舉型別變數的尺寸不一定和int型別相同,這樣一來我們採用%d就 是說將列舉型別變數val當作4位元組的int變數來看待並進行引數壓棧,而在某些編 譯器下sizeof( val )等於1位元組,這樣scanf函式就會將val變數位址中的後續的三 位元組位址也壓入棧中,並對其進行賦值,也許val變數後續的三個位元組的位址沒有 特殊含義可以被改寫(比如是位元組對齊的空位址空間),可能會認為他不會出現錯 誤,其實不然,在scanf函式呼叫結束後會進行棧清理,這樣一來會導致scanf函式 清理了過多的位址空間,從而破壞了外圍函式的棧指標的指向,從而必然會導致程 序執行時錯誤。

結構體 共用體 列舉

結構體 共用體 列舉 分析 首先宣告的結構體元素year的位址是最低的 0012ff74 而最後宣告的day的位址是最高的 0012ff7c 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...

結構體 共用體 列舉

一 結構體 1.結構體和類一樣定義時最後要加分號 2.結構體型別定義變數時struct關鍵字不能省略 3定義好的結構體,系統對之不分配儲存單元 4.c99標準允許對某一成員初始化 5.不能企圖輸出結構體變數名來達到輸出結構體的目的 6.同類結構體間可以相互賦值 二 共用體 1.幾個不同的變數共享同一...

結構體,共用體,列舉體,typedef

概念 結構體時一種構造資料型別 用途 把不同型別的資料組合成乙個整體 記憶體 各成員所佔記憶體空間的累加 一.結構體的宣告與定義變數的方法一共有三種 1.常規定義 struct aa 注意大括號後面有分號 變數定義 struct 機構體名 結構體變數名錶 如 struct aa aa,bb 前面的s...