在C語(yǔ)言中,結(jié)構(gòu)體是一種數(shù)據(jù)類型(由程序開(kāi)發(fā)者自己設(shè)計(jì)的類型)??梢允褂媒Y(jié)構(gòu)體來(lái)存放一組不同類型的數(shù)據(jù)。結(jié)構(gòu)體的定義形式為:
懷仁ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作! struct 結(jié)構(gòu)體名{ 成員列表;(基本數(shù)據(jù)類型;指針;數(shù)組或其他結(jié)構(gòu)類型)
};
2 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體是一種數(shù)據(jù)類型,是創(chuàng)建變量的模板,不占用內(nèi)存空間;結(jié)構(gòu)體變量才包含了實(shí)實(shí)在在的數(shù)據(jù),需要內(nèi)存空間。
結(jié)構(gòu)體變量初始化#includetypedef struct Student {//typedef 類型的重名名,將結(jié)構(gòu)體Student重命名為stu
int id;
const char* name; //節(jié)省內(nèi)存
char sex[4];
int age;
}stu;
int main() {stu st1 = {10010,"張三","男",19 };
printf("%s\n", st1.name); //張三
}
結(jié)構(gòu)體嵌套結(jié)構(gòu)體#includestruct Date {int year;
int month;
int day;
};
struct Student {int id;
const char* name; //節(jié)省內(nèi)存
char sex[4];
int age;
Date birth;
};
int main() {Student stu1 = {10010,"麗麗","女",19,2000,10,1 };
Student stu2 = {10011,"思思","女",18,{1999,12,1} };
Date date;
return 0;
}
3 結(jié)構(gòu)體成員訪問(wèn)#define _CRT_SECURE_NO_WARNINGS
#include#includetypedef struct Student {int id;
char name[10]; //節(jié)省內(nèi)存
char sex[4];
int age;
}stu;
int main() {stu st1 = {10010,"張三","男",19 };
stu* st2 = &st1; //定義一個(gè)結(jié)構(gòu)體指針變量st2.
//strcpy((*st2).name, "lisi");//方式1:(*結(jié)構(gòu)體類型指針).成員名
//strcpy(st2->name, "lisi");//方式2:結(jié)構(gòu)體類型指針->成員名
strcpy(st1.name, "lisi");//方式3:結(jié)構(gòu)體變量.成員名
//printf("%s\n", (*st2).name);//方式1 lisi
//printf("%s\n", st2->name);//方式2 lisi
printf("%s\n", st1.name); //方式3 lisi
}
4 結(jié)構(gòu)體大小
如何計(jì)算結(jié)構(gòu)體的大小?示例一
#includeint main() {struct A {int a;//4
char b;//2 (前面4是2的倍數(shù),不需要再加) +2
double c;//8 (前面的4+2=6不是8的倍數(shù),需要再加上2)
short d;//2 (前面4+2+2+8=16是2的倍數(shù)) +2
int e;//4 (前面16+2=18不是4的倍數(shù),需要再加上2)
};
printf("%d\n", sizeof(A));//4+2+2+8+2+2+4=24
}
注意:VS默認(rèn)對(duì)齊數(shù)為8。24恰好=MIN { 8(大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)),8(對(duì)齊方式)} 的整數(shù)倍。
示例二
#includeint main() {struct A {int a;//4
char b;//1 (4是1的倍數(shù),不需要再加)
};
//4+1=5
//最接近5
//并且是MIN { 4(大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)),8(對(duì)齊方式)} 的整數(shù)倍的數(shù)為8。
struct B {char c;//1 +1
short d;//2 (前面1不是2的倍數(shù),所以再加1)
A a;//8 (A不是基本數(shù)據(jù)類型,不需要和前面比較)
int f;//4 (前面的1+1+2+8=12是4的倍數(shù))
};
//1+1+2+8+4=16
//16是MIN { 4,8 } 的整數(shù)倍
//注意:大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)(將嵌套結(jié)構(gòu)體里的基本類型也算上)為4
printf("%d\n", sizeof(A));//8
printf("%d\n", sizeof(B));//16
}
注意:在嵌套結(jié)構(gòu)體中,大基本數(shù)據(jù)類型成員所占字節(jié)數(shù),要將嵌套結(jié)構(gòu)體里的基本類型也算上.
示例三
#includeint main() {struct A {char name[10];//10 +2
int a;//4
char* sex;//X64:8字節(jié) X86:4字節(jié)
};
//10+2+4+8=24 10+2+4+4=20
//24恰是MIN { 8,8 }的整數(shù)倍
//20恰是MIN { 4, 8 }的整數(shù)倍
printf("%d\n", sizeof(A));//24或者20
}
4-2 指定對(duì)齊值這里的結(jié)果可能是20或24。是因?yàn)閏har* sex;指針的大小和平臺(tái)有關(guān)系,在X64系統(tǒng)中為8字節(jié),在X86系統(tǒng)中為4字節(jié)。
預(yù)處理指令#pragma pack(n)可以改變默認(rèn)對(duì)齊數(shù)。n取值可以是1,2,4,8,16,……
示例一
#include#pragma pack(4)
struct A {double a;//8
int b;//4
};
#pragma pack()
//8+4=12 是MIN { 8,4 }的整數(shù)倍
int main() {printf("%d\n", sizeof(A));//12
}
示例二
#include#pragma pack(2)
struct A {char a;//1 +1
int b;//4
};
#pragma pack()
//1+1+4=6 是MIN { 4(大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)),2(對(duì)齊方式) }的整數(shù)倍
#pragma pack(4)
struct B {int i;//4
char c;//1
A a;//6 +1
int d;//4 (4+1+6=11不是MIN{4,4}的倍數(shù),需要再加1)
};
#pragma pack()
//4+1+6+1+4=16 是MIN { 4,4 }的整數(shù)倍
int main() {printf("%d\n", sizeof(A));//6
printf("%d\n", sizeof(B));//16
}
示例三
#include#pragma pack(4)
struct A {char a; //1 +3
double b;//8
int c;//4
short d;//2
};
#pragma pack()
//1+3+8+4+2=18 最接近MIN{8,4}的整數(shù)倍 20
#pragma pack(4)
struct B {int e;//4
char f;//1
A a;//20 +3
double g;//8
};
#pragma pack()
//4+1+20+3+8=36 最接近MIN{8,4}的整數(shù)倍 36
int main() {printf("%d\n", sizeof(A));//20
printf("%d\n", sizeof(B));//36
}
你是否還在尋找穩(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)查看詳情吧
網(wǎng)站標(biāo)題:C語(yǔ)言—結(jié)構(gòu)體總結(jié)-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article22/cchpcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、定制開(kāi)發(fā)、網(wǎng)站制作、靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容