十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
74?
目錄
結(jié)構(gòu)體類型的設(shè)計
結(jié)構(gòu)體成員的訪問
結(jié)構(gòu)體變量和指針
結(jié)構(gòu)體的內(nèi)存大小
使用枚舉類型
聯(lián)合體類型
在c語言中,結(jié)構(gòu)體是一種數(shù)據(jù)類型。
結(jié)構(gòu)體的定義形式為
struct? ?結(jié)構(gòu)體名
{
成員列表(可以使基本數(shù)據(jù)類型,指針,數(shù)組或其他結(jié)構(gòu)類型);
};
例題:學(xué)生結(jié)構(gòu)體
struct student{//關(guān)鍵字struct是數(shù)據(jù)類型說明符,指出下面說明的是結(jié)構(gòu)體類型,,標識符student是結(jié)構(gòu)體的類型名
char name;
int age;
char sex[4];
int id;
double score;
};//分號不可少
注意:結(jié)構(gòu)體是一種數(shù)據(jù)類型,市創(chuàng)建變量的模板,不占用內(nèi)存空間;結(jié)構(gòu)體變量才包含了實實在在的數(shù)據(jù),需要存儲空間。
結(jié)構(gòu)體成員的訪問訪問格式:結(jié)構(gòu)體變量.成員名
printf("%s\n",stu.name);
結(jié)構(gòu)變量整體賦值三種情況
1)定義結(jié)構(gòu)體變量(用{}初始化)。
2)用已定義的結(jié)構(gòu)變量初始化。
3)結(jié)構(gòu)體類型相同的變量可以作為整體相互賦值。
其他情況只能對成員注意賦值。
在c語言中不能進制轉(zhuǎn)換。
內(nèi)置類型能夠定義指針變量,結(jié)構(gòu)體類型也可以定義結(jié)構(gòu)體類型指針。
結(jié)構(gòu)體變量和指針結(jié)構(gòu)體類型指針訪問成員的獲取和賦值形式:
(*p).成員名(.的優(yōu)先級高于*,(?p)兩邊的括號不能少)
或
p->成員名 (->是減號加大于號,中間沒有空格,稱為指向符)
在對于結(jié)構(gòu)體成員數(shù)據(jù)修改時可以用strcpy函數(shù)
strcpy((*p).name,"lisi");
strcpy(p->name,"lisi");
結(jié)構(gòu)體的內(nèi)存大小1.內(nèi)存大小的基本單位是字節(jié)(byte),理論上來講,可以從任意地址訪問變量,但是實際上, cup并非逐字節(jié)讀寫內(nèi)存,而是以2,4,或8的倍數(shù)的字節(jié)塊來讀寫內(nèi)存,因此就會對基本數(shù)據(jù)類型的地址作出一些限制,即它的地址必須是2,4或8的倍數(shù)。那么就要求各種數(shù)據(jù)類型按照一定的規(guī)則在空間上排列,這就是對齊。
2.由于不同平臺對齊方式可能不同,如此一來,同樣的結(jié)構(gòu)在不同的平臺其大小可能不同,在無意識的情況下,互相發(fā)送的數(shù)據(jù)可能出現(xiàn)錯亂,甚至引發(fā)嚴重的問題。
指定對齊值
預(yù)處理指令#pragma pack(n)可以改變默認對齊數(shù)。
例
#pragma pack(2)
struct B {//6
char c;//1+1
int i;//4
}
#pragma pack()
#pragma pack(4)
struct A{//16
int i;//4
char c;//1+1
B b;//6
char d;//1
}
#pragma pack()
3.由于存儲變量地址對齊的問題,計算結(jié)構(gòu)體大小的3條規(guī)則:
1)結(jié)構(gòu)體變量的首地址,必須是結(jié)構(gòu)體變量中的MIN(大基本數(shù)據(jù)類型成員所占字節(jié)數(shù),指定對齊方式)。
2)結(jié)構(gòu)體變量中的每個成員相對于結(jié)構(gòu)體首地址的偏移量,都是MIN(該成員數(shù)據(jù)類型成員所占字節(jié)數(shù),指定對齊方式)。
3)結(jié)構(gòu)體變量的總大小,為結(jié)構(gòu)體變量中MIN(大基本數(shù)據(jù)類型成員所占字節(jié)數(shù),指定對齊方式)。
如果一個變量只有幾種可能的值,則可以定義為枚舉類型,所謂“枚舉”就是把可能的值一一列舉起來,變量的值只限于列舉出來的值得范圍內(nèi)。
使用枚舉類型的一般形式
enumerate【枚舉名】{枚舉元素列表};
例:
enum weekday{sun,mon,tue,wed,thu,fri,sat};//每一個枚舉元素都代表一個整數(shù),C語言編譯按定義時的順序默認它們的值為0,1,2,3,4,5?。在上面的定義中, sun的值自動設(shè)為0, mon的值為1,?, sat 的值為6。
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}workday,weekend;//常量sun的值為7,mon的值為1,以后的順序加1,sat為6。
聯(lián)合體類型一般結(jié)構(gòu)為
union? ?聯(lián)合體名
{
成員列表;
}變量列表;
例:兩種形式
union data
{ int i;
char ch;
flaoat f;
};
union data a,b,c;
union data
{ int i;
char ch;
flaoat f;
} a,b,c;//結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個成員分別占有其自己的內(nèi)存單元。而共用體變量所占的內(nèi)存長度等于最長的成員的長度。例如,上面定義的“共用體”變量a,b,c各占4個字節(jié)(因為一個float型變量占4個字節(jié)),而不是各占4+1+1=9個字節(jié)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧