C語(yǔ)言結(jié)構(gòu)體超詳細(xì)講解
前言
本文開(kāi)始學(xué)習(xí)結(jié)構(gòu)體的知識(shí)點(diǎn),主要內(nèi)容包括:
- 結(jié)構(gòu)體類型的聲明
- 結(jié)構(gòu)體初始化
- 結(jié)構(gòu)體成員訪問(wèn)
- 結(jié)構(gòu)體傳參
1、結(jié)構(gòu)體的聲明
1.1 結(jié)構(gòu)的基礎(chǔ)知識(shí)
結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個(gè)成員可以是不同類型的變量
1.2 結(jié)構(gòu)的聲明
struct tag { member-list; }variable-list;
下面幾種方式都一樣,定義了學(xué)生的結(jié)構(gòu)體類型,內(nèi)容包括:名字、年齡、性別、學(xué)號(hào)
//舉例1 struct Stu { char name[20];//名字 int age;//年齡 char sex[5];//性別 char id[20];//學(xué)號(hào) };//分號(hào)不能丟 //舉例2 struct Stu { char name[20];//名字 int age;//年齡 char sex[5];//性別 char id[20];//學(xué)號(hào) }s1,s2,s3;//定義了3個(gè)結(jié)構(gòu)體類型的變量 //舉例3 typedef struct stu stu; //舉例4 typedef struct stu { char name[20]; int age; char sex[8]; float score; }stu; int main() { struct stu stu4;//局部變量 struct stu stu5; stu stu6;//全局變量 return 0; }
1.3 結(jié)構(gòu)成員的類型
結(jié)構(gòu)的成員可以是標(biāo)量、數(shù)組、指針,甚至是其他結(jié)構(gòu)體
1.4 結(jié)構(gòu)體變量的定義和初始化
struct Point { int x; int y; }p1; //聲明類型的同時(shí)定義變量p1 struct Point p2; //定義結(jié)構(gòu)體變量p2 //初始化:定義變量的同時(shí)賦初值。 struct Point p3 = { x, y }; struct Stu //類型聲明 { char name[15];//名字 int age; //年齡 }; struct Stu s = { "zhangsan", 20 };//初始化 struct Node { int data; struct Point p; struct Node* next; }n1 = { 10, {4,5}, NULL }; //結(jié)構(gòu)體嵌套初始化 struct Node n2 = { 20, {5, 6}, NULL };//結(jié)構(gòu)體嵌套初始化
2、結(jié)構(gòu)體成員的訪問(wèn)
2.1 點(diǎn)操作符訪問(wèn)
結(jié)構(gòu)變量的成員是通過(guò)點(diǎn)操作符(.)訪問(wèn)的。點(diǎn)操作符接受兩個(gè)操作數(shù):變量名.成員
struct S s; strcpy(s.name, "zhangsan");//使用.訪問(wèn)name成員 s.age = 20;//使用.訪問(wèn)age成員
2.2 ->操作符訪問(wèn)
指向一個(gè)結(jié)構(gòu)體的指針,結(jié)構(gòu)體指針訪問(wèn)指向變量的成員,變量名 ->成員
struct Stu { char name[20]; int age; }; void print(struct Stu* ps) { printf("name = %s age = %d\n", (*ps).name, (*ps).age); //使用結(jié)構(gòu)體指針訪問(wèn)指向?qū)ο蟮某蓡T printf("name = %s age = %d\n", ps->name, ps->age); }
3、結(jié)構(gòu)體傳參
3.1 參數(shù)是結(jié)構(gòu)體類型的變量
struct point { int x; int y; }p1 = {10,20}; struct s//結(jié)構(gòu)體 { char c; struct point sp; double d; char arr[20];//字符串 }; void print1(struct s ss)//傳參結(jié)構(gòu)體 { printf("%c\n", ss.c); printf("%d\n", ss.sp.x); printf("%d\n", ss.sp.y); printf("%lf\n", ss.d); printf("%s\n", ss.arr); } int main() { struct point p1 = { 100, 200 };//定義1個(gè)變量,并初始化 struct s ss = { 'w',{100,20},5.5,"hello" };//初始化 ss.c = 'b'; ss.sp.x = 1000; ss.sp.y = 2000; ss.d = 3.14; //ss.arr = "wolrd";錯(cuò)誤的方法 strcpy(ss.arr, "world");//字符串賦值函數(shù) print1(ss);//打印結(jié)構(gòu)體變量 }
3.2 參數(shù)是結(jié)構(gòu)體類型的變量的地址
struct point { int x; int y; }p1 = {10,20}; struct s { char c; struct point sp; double d; char arr[20];//字符串 }; void print2(struct s* ss)//傳參地址 { printf("%c\n", ss->c); printf("%d\n", ss->sp.x); printf("%d\n", ss->sp.y); printf("%lf\n", ss->d); printf("%s\n", ss->arr); } int main() { struct s ss = { 'w',{100,20},5.5,"hello" };//初始化 ss.c = 'b'; ss.sp.x = 1000; ss.sp.y = 2000; ss.d = 3.14; //ss.arr = "wolrd";錯(cuò)誤的方法 strcpy(ss.arr, "world"); print2(&ss);//打印結(jié)構(gòu)體變量 }
3.3 結(jié)構(gòu)體傳參對(duì)比
上面兩種函數(shù)實(shí)現(xiàn)的效果一樣,見(jiàn)下圖:
函數(shù)print1接受的是結(jié)構(gòu)體類型變量,是形參,另外開(kāi)辟了空間,將實(shí)參拷貝了一份,占用內(nèi)存空間大
- 函數(shù)print2接受的是結(jié)構(gòu)體類型的地址,定義結(jié)構(gòu)體類型的指針接收地址,只開(kāi)辟了空間存放地址,占用內(nèi)存空間小
**要注意:**函數(shù)傳參的時(shí)候,參數(shù)是需要壓棧的。如果傳遞一個(gè)結(jié)構(gòu)體對(duì)象的時(shí)候,結(jié)構(gòu)體過(guò)大,參數(shù)壓棧的的系統(tǒng)開(kāi)銷(xiāo)比較大,所以會(huì)導(dǎo)致性能的下降。因此,結(jié)構(gòu)體傳參的時(shí)候,要傳結(jié)構(gòu)體的地址,即函數(shù) print2 比函數(shù) print1 效果好。
總結(jié)
結(jié)構(gòu)體內(nèi)容較少,要牢記定義形式,和傳地址的用法。
下一篇將學(xué)習(xí)一些VS的調(diào)試技巧,編程出現(xiàn)bug,通過(guò)調(diào)試能發(fā)現(xiàn)問(wèn)題,并改進(jìn)程序,這一步非常重要。在學(xué)語(yǔ)言的同時(shí),適當(dāng)?shù)膶W(xué)習(xí)工具的使用,能夠達(dá)到事半功倍的效果。
到此這篇關(guān)于C語(yǔ)言結(jié)構(gòu)體超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解C語(yǔ)言中結(jié)構(gòu)體的使用
- C語(yǔ)言深入回顧講解結(jié)構(gòu)體對(duì)齊
- C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解
- C語(yǔ)言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用
- C語(yǔ)言簡(jiǎn)明清晰講解結(jié)構(gòu)體
- C語(yǔ)言詳解結(jié)構(gòu)體的內(nèi)存對(duì)齊與大小計(jì)算
- C語(yǔ)言詳解熱門(mén)考點(diǎn)結(jié)構(gòu)體內(nèi)存對(duì)齊
- C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法
相關(guān)文章
C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例分享
在本篇文章里小編給大家整理了關(guān)于C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法
這篇文章主要介紹了C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C++使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)事件和委托以及信號(hào)和槽機(jī)制
這篇文章主要為大家詳細(xì)介紹了C++如何使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)事件和委托以及信號(hào)和槽機(jī)制,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼
這篇文章主要介紹了華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05C語(yǔ)言中四種取整方式,取余/取模運(yùn)算以及負(fù)數(shù)取模問(wèn)題詳解
這篇文章主要介紹了C語(yǔ)言中四種取整方式及負(fù)數(shù)取模問(wèn)題,包括了算法的分析與改進(jìn),是很多程序設(shè)計(jì)競(jìng)賽中常見(jiàn)的算法,需要的朋友可以參考下2021-09-09C++?auto關(guān)鍵字的小知識(shí)點(diǎn)分享
這篇文章主要是來(lái)和大家介紹一些C++中的小知識(shí)點(diǎn),本文將從auto關(guān)鍵字開(kāi)始講起,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05