中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C語(yǔ)言—結(jié)構(gòu)體總結(jié)-創(chuàng)新互聯(lián)

結(jié)構(gòu)體 1 結(jié)構(gòu)體類型的設(shè)計(jì)

在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)體的大小?
  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)體的總大小,必須是 { 大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)(將嵌套結(jié)構(gòu)體里的基本類型也算上,得出大基本數(shù)據(jù)類型成員所占字節(jié)數(shù)),指定對(duì)齊方式 } 的整數(shù)倍。
4-1 未指定對(duì)齊值

示例一

#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
		
}

這里的結(jié)果可能是20或24。是因?yàn)閏har* sex;指針的大小和平臺(tái)有關(guān)系,在X64系統(tǒng)中為8字節(jié),在X86系統(tǒng)中為4字節(jié)。

4-2 指定對(duì)齊值

預(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)

搜索引擎優(yōu)化
大洼县| 尼勒克县| 枞阳县| 岫岩| 前郭尔| 龙泉市| 上高县| 武宣县| 宣威市| 酉阳| 志丹县| 荃湾区| 长沙市| 嘉荫县| 石泉县| 黔南| 扶沟县| 丹凤县| 祁东县| 团风县| 罗源县| 泰和县| 武夷山市| 敦煌市| 岗巴县| 莱州市| 万载县| 禹州市| 湖州市| 桃江县| 东城区| 诸城市| 来安县| 上林县| 湘阴县| 静安区| 盘锦市| 蓝山县| 古交市| 永泰县| 沭阳县|