目錄
創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開(kāi)發(fā),軟件開(kāi)發(fā),微信小程序開(kāi)發(fā),十年建站對(duì)成都砂巖浮雕等多個(gè)行業(yè),擁有豐富的網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn)。一、結(jié)構(gòu)體的設(shè)計(jì)
二、結(jié)構(gòu)體變量的初始化
2.1結(jié)構(gòu)體在內(nèi)存表示;
2.2結(jié)構(gòu)體初始化;
2.3結(jié)構(gòu)體指針變量
2.4結(jié)構(gòu)體嵌套結(jié)構(gòu)體
三、結(jié)構(gòu)體成員訪問(wèn)?
3.1、結(jié)構(gòu)體成員訪問(wèn)
3.2、結(jié)構(gòu)體變量和指針
?3.3、結(jié)構(gòu)體和函數(shù)?
四、結(jié)構(gòu)體與數(shù)組
五、計(jì)算結(jié)構(gòu)體大小
三個(gè)規(guī)則:
例1、?
例2、
指定對(duì)齊值
總結(jié)
C語(yǔ)言提供了基本的數(shù)據(jù)結(jié)構(gòu),例如 char 、short 、int 、float....等類型;這些偶稱為內(nèi)置類型。怎樣設(shè)計(jì)出來(lái)屬于自己的類型?
程序員可以使用結(jié)構(gòu)體來(lái)封裝一些屬性,設(shè)計(jì)出新的類型,在C語(yǔ)言中稱為結(jié)構(gòu)體類型。
結(jié)構(gòu)體的定義形式為
struct 結(jié)構(gòu)體名
{
成員列表(可以是基本的數(shù)據(jù)類型,指針,數(shù)組或其他結(jié)構(gòu)類型)
};
舉個(gè)例子來(lái)說(shuō)吧;
客觀事務(wù)(實(shí)體)是復(fù)雜的,要描述它必須從多方面進(jìn)行;也就是用不同的數(shù)據(jù)類型來(lái)描述不同的方面;用學(xué)生實(shí)體來(lái)說(shuō):
學(xué)生擁有什么? 學(xué)號(hào)、姓名、性別、年齡;
struct Student
{
char s_id[8];
char s_name[8];
char s_sex[4];
int s_age;
};
注意以下幾點(diǎn);
(1)、關(guān)鍵字struct是數(shù)據(jù)類型說(shuō)明符,指出下面說(shuō)的是結(jié)構(gòu)體類型;
(2)、標(biāo)識(shí)符Student是結(jié)構(gòu)體的類型名;
(3)、最后的分號(hào)一定要寫;
二、結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體是一種數(shù)據(jù)類型,也就是說(shuō)可以用它來(lái)定義變量。
結(jié)構(gòu)體就像一個(gè)“模板”,定義出來(lái)的變量都具有相同的性質(zhì)??梢詫⒔Y(jié)構(gòu)體比作“圖紙”,結(jié)構(gòu)體變量比作“零件”,根據(jù)同一張圖紙生產(chǎn)出來(lái)的零件的特性都是一樣的;
結(jié)構(gòu)體是一種數(shù)據(jù)類型,是創(chuàng)建變量的模板,不占用內(nèi)存空間;結(jié)構(gòu)體變量才包含了實(shí)實(shí)在在的數(shù)據(jù)、需要存儲(chǔ)空間;
2.1結(jié)構(gòu)體在內(nèi)存表示;C語(yǔ)言中? struct 不可少
2.2結(jié)構(gòu)體初始化;2.3結(jié)構(gòu)體指針變量2.4結(jié)構(gòu)體嵌套結(jié)構(gòu)體三、結(jié)構(gòu)體成員訪問(wèn)? 3.1、結(jié)構(gòu)體成員訪問(wèn)結(jié)構(gòu)體變量使用? ?.? ?訪問(wèn);
結(jié)構(gòu)體變量.對(duì)象
#include#includestruct Date
{
int year;
int month;
int day;
};
struct Student
{
char s_name[20];
struct Date birthday;
float score;
};
int main()
{
struct Student stu = { "liuwen",2000,10,1,99.9 };
printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);
stu.score = 77;
printf("name=%s\nbirtyday=%d.%d.%d\nscore=%f\n", stu.s_name, stu.birthday.year, stu.birthday.month, stu.birthday.day, stu.score);
return 0;
注意:對(duì)結(jié)構(gòu)體變量整體賦值有三種情況
(1)定義結(jié)構(gòu)體變量(用{}初始化)
(2)用已定義的結(jié)構(gòu)體變量初始化
(3)結(jié)構(gòu)體類型相同的變量可以作為整體相互賦值;
在C語(yǔ)言中不存在結(jié)構(gòu)體類型的強(qiáng)制轉(zhuǎn)換。
3.2、結(jié)構(gòu)體變量和指針內(nèi)置類型可以定義指針變量,結(jié)構(gòu)體類型也可以定義結(jié)構(gòu)體類型指針;
結(jié)構(gòu)體類型指針訪問(wèn)成員的獲取和賦值形式:
(1)(*p). 成員名(.的優(yōu)先級(jí)高于*,(*p)兩邊括號(hào)不能少)
(2)? ?p->成員名(->指向符)
示例:
#include#include//#define _CRT_SECURE_NO_WARNINGS
struct Inventory//商品
{
char description[20];//貨物名
int quantity;//庫(kù)存數(shù)據(jù)
};
int main()
{
struct Inventory sta = { "iphone",20 };
struct Inventory* stp = &sta;
char name[20] = { 0 };
int num = 0;
(*stp).quantity = 30;
stp->quantity = 30;
strcpy_s(name,sizeof(stp->description),stp->description);
printf("%s %d\n", stp->description, stp->quantity);
printf("%s %d\n", (*stp).description, (*stp).quantity);
return 0;
}
3.3、結(jié)構(gòu)體和函數(shù)?示例:
#include#include#define _CRT_SECURE_NO_WARNINGS
struct School
{
char s_name[20];//學(xué)校
int s_age;
};
void Print_a(struct School sx)
{
printf("%s %d\n", sx.s_name, sx.s_age);
}
void Print_c(struct School* sp)
{
printf("%s %d\n", sp->s_name, sp->s_age);
}
int main()
{
struct School sx = { "xi'an",100 };
Print_a(sx);
Print_c(&sx);
return 0;
}
內(nèi)存什么的看上面;
兩種傳參那個(gè)更好?通過(guò)內(nèi)存可以看出來(lái);
四、結(jié)構(gòu)體與數(shù)組結(jié)構(gòu)體數(shù)組,是指數(shù)組中的每一個(gè)元素都是一個(gè)結(jié)構(gòu)體類型。在實(shí)際應(yīng)用中,C語(yǔ)言結(jié)構(gòu)體數(shù)組常被用來(lái)表示有相同的數(shù)據(jù)結(jié)構(gòu)的群體,比如一個(gè)班的學(xué)生,一個(gè)公司的員工等;
例如:
#include#include#define _CRT_SECURE_NO_WARNINGS
struct Student
{
char s_name[20];//姓名
int age;//年齡
float score;//成績(jī)
};
int main()
{
struct Student cla[] =
{
{"liuwen",18,149.9},
{"qnge",18,145},
{"anan",19,188},
};
return 0;
}
五、計(jì)算結(jié)構(gòu)體大小
三個(gè)規(guī)則:(1)、結(jié)構(gòu)體變量的首地址,必須是結(jié)構(gòu)體變量的“大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)”的整數(shù)倍;
(2)結(jié)構(gòu)體變量中的每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量,都是該成員基本數(shù)據(jù)類型所占字節(jié)數(shù)的整數(shù)倍;
(3)、結(jié)構(gòu)體變量的總大小,為結(jié)構(gòu)體變量中“大基本數(shù)據(jù)類型成員所占字節(jié)”的整數(shù)倍;
示例:假設(shè)總零地址開(kāi)始(計(jì)算)
例1、struct node
{
char cha;
int ia;
char chb;
};
int main()
{
int size = 0;
struct node sd = { 'a',2,'b' };
printf("%d\n", sizeof(struct node));//12
return 0;
}
例2、struct node
{
char cha;
char chb;
int ia;
};
int main()
{
int size = 0;
struct node sd = { 'a','b',2 };
printf("%d\n", sizeof(struct node));//12
return 0;
}
為什么要理解字節(jié)對(duì)齊問(wèn)題?
(1)內(nèi)存大小的基本單位是字節(jié)(byte),理論上來(lái)講,可以從任意地址訪問(wèn)變量,但是實(shí)際上, cup并非逐字節(jié)讀寫內(nèi)存,而是以2,4,或8的倍數(shù)的字節(jié)塊來(lái)讀寫內(nèi)存,因此就會(huì)對(duì)基本數(shù)據(jù)類型的地址作出一些限制, 即它的地址必須是2, 4或8的倍數(shù)。那么就要求各種數(shù)據(jù)類型按照一定的規(guī)則在空間. 上排列,這就是對(duì)齊。
(2)有些平臺(tái)每次讀都是從偶地址開(kāi)始,如果一個(gè)int 型(假設(shè)為32位系統(tǒng))如果存放在偶地址開(kāi)始的地方那么一個(gè)讀周期就可以讀出這32bit,而如果存放在奇地址開(kāi)始的地方,就需要2個(gè)讀周期,并對(duì)兩次讀出的結(jié)果的高低字節(jié)進(jìn)行拼湊才能得到該32bit數(shù)據(jù)。顯然在讀取效率上下降很多。
(3)由于不同平臺(tái)對(duì)齊方式可能不同,如此一來(lái),同樣的結(jié)構(gòu)在不同的平臺(tái)其大小可能不同,在無(wú)意識(shí)的情況下,互相發(fā)送的數(shù)據(jù)可能出現(xiàn)錯(cuò)亂,甚至引|發(fā)嚴(yán)重的問(wèn)題。
指定對(duì)齊值預(yù)處理指令# pragma pack(n)可以改變默認(rèn)對(duì)齊數(shù)。n取值是1,2, 4,8, 16。
總結(jié)1)結(jié)構(gòu)體變量的首地址,必須是MIN{"結(jié)構(gòu)體大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)",指定對(duì)齊方式}大小的整數(shù)倍。
2)結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量,都是MIN{基本數(shù)據(jù)類型成員,指定對(duì)齊方式}大小的整數(shù)倍。
3)結(jié)構(gòu)體的總大小,為MIN{結(jié)構(gòu)體“大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)”(將嵌套結(jié)構(gòu)體里的基本類型也算上,得出大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)),指定對(duì)齊方式} 大小的整數(shù)倍。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧