結構體型別的建立
struct tag
stu;
這裡編譯器會把上邊兩個宣告當作不同的型別,而且如果我們在想建立乙個相同成員的結構體class2,就必須的在main()函式前邊建立,這樣及其不方便。struct
class;
struct
class1;
int main()
有標籤時,如果還需要相同型別的結構體,在建立時就特別方便了。struct tag
class;
int main()
struct tag
class;
//這是錯誤的
struct tag
class;
//這裡我們可以定義自身型別的結構體變數,因為指標的大小在32位機器始終為4位元組。
結構體的初始化struct tag
stu, *p;
stu.name;
我們先定義乙個結構體
結構體的記憶體對齊struct point
p1;struct point p2 = ; //定義變數的同時賦初值
結構體的對齊原則
1. 第乙個成員在與結構體變數偏移量為0的位址處。
2. 其他成員變數要對齊到對齊數的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs中預設為8,linux中預設為4。(修改編譯器的對齊數(#pragma pack(1))這裡的數字如果大於編譯器的預設值,則對齊數預設為編譯器的對齊數)
3. 結構體的總大小為最大對齊數的整數陪。(每個成員除了第乙個變數都有對齊數)
4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍。(結構體的對齊數就是結構體的最大對齊數)
為什麼存在記憶體對齊
位段位段的宣告和結構體類似,有兩點不同:
1. 位段的成員必須是int、unsigned int或signed int
2. 位段的成員名後邊有乙個冒號和乙個數字。
struct a
;//裡邊都是int型,佔8位元組記憶體
特別注意:struct a
;//這個佔16位元組,開始的時候我以為佔12位元組
c99規定int、unsigned int和bool可以作為位域型別,但編譯器幾乎都對此作了擴充套件,允許其它型別的存在。
使用位域的主要目的是壓縮儲存,其大致規則為:
和結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台問題存在。
列舉
enum為關鍵字,裡邊的成員都為列舉常量,這些常量預設從0開始,依次遞增1。也可以賦初值。enum
;
列舉的好處:enum
;
聯合(共用體)
聯合也是一種自定義型別,這種型別定義的變數包含一些列成員,這些成員共用一塊空間。
在union中所有的資料成員共用一塊空間,同一時刻只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。union un
判斷計算機大端小端
int checksystem()
c; c.i = 1;
return (c.ch ==1);
//如果是大端返回0,小端返回1
}
C語言之自定義型別指標
對於自定義型別,我舉個字串拷貝為例子。define crt secure no warnings include include intmain int argc,char ar 我們需要用 strcpy 函式來進行拷貝,以下是錯誤的 name buf 那麼有的人會這樣考慮,如果是這樣呢?name ...
c語言 自定義型別
struct stu 分號不能丟 匿名結構體型別 struct x struct a 20 p p x 非法的操作,上面倆種完全是不同的宣告 struct node 結構體的自引用 struct node n1 null 直接初始化 struct node n2 null 結構體巢狀初始化 先來看下...
C語言自定義型別
在學習c語言的時候,它有很多的自定義型別,例如 結構體,列舉,聯合。這些型別在我們的日常使用的時候,或多或少的都會遇見到,下面就系統的介紹一下這幾種型別。一.結構體 1.結構體型別的宣告 通俗點來說,結構就是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別的成員變數。如下所示 str...