目錄
前言:
一、結構體類型的聲明:
? 1.結構的基礎知識:
? 2.結構的聲明:
? 3.結構成員允許的類型:
? 4.結構體變量的定義:
? 5.結構體變量的初始化:
二、結構體成員的訪問:
? 1.結構體變量訪問成員:
2.結構體指針訪問指向變量的成員:
三、結構體傳參:
四、總結:
? 上周因為考試復習和放假等等原因?qū)е履銈兦趭^的鑾同學停更了近一周,為了彌補上周的停更,這兩天我也開啟了狂暴日更模式,辛苦各位路過的小伙伴們給我點點關注點點贊,讓我有繼續(xù)狂暴下去的動力,鄙人在此謝過各位大佬了!
? 上文中我們學習了初階指針的相關知識,已經(jīng)對指針有了一定程度的了解和理解,對于指針的應用也是有了一定的心得,關于更深層次的內(nèi)容我將會在初階C語言全部介紹完畢后,開啟進階模塊為各位小伙伴們進行講解。而本文我將帶領小伙伴們了解下一章節(jié)關于結構體的內(nèi)容。
一、結構體類型的聲明: ? ? ? ? 1.結構的基礎知識:? 我們常常將結構稱為結構體,結構是一系列值的集合,這些值我們稱之為成員變量。結構的每個成員可以是不同類型的變量。這里我們應當進行區(qū)分:
數(shù)組:一組相同類型的集合
結構:一系列允許類型不同的成員的集合
? 結構體存在的意義是,在我們的日常生活中存在著許許多多的復雜對象,而這些復雜對象具有許許多多的屬性,難以通過某種單一類型的值進行描述,例如:
“學生”的屬性:姓名、年齡、性別、成績等等
“著作”的屬性:書名、書號、作者、定價等等
? 于是我們就通過使用結構體這樣包含一系列可以為不同類型的值的集合來描述我們想要描述的復雜對象。
? 2.結構的聲明:? 與函數(shù)使用相同,結構在使用前也需要聲明,它的聲明格式為:
struct tag
//tag為程序員可以根據(jù)需求自定義的標簽名
{
member_list;
//成員列表,含有一到多個
}variable_list;
//variable_list為變量列表,用于在聲明結構類型的同時定義變量(可以沒有)
? 例如我們在描述“學生”這個復雜變量時可以這樣去聲明:
struct student
//student為我們根據(jù)描述對象“學生”自定義的標簽名
{
//結構成員可以是不同類型的變量:
char name[20];
//成員:姓名
int age;
//成員:年齡
char sex[5];
//成員:性別
float score;
//成員:成績
};
? 3.結構成員允許的類型:? 結構的成員可以是標量(有大小無方向)、數(shù)組、指針,甚至是其它結構體(結構體支持嵌套)。
? 4.結構體變量的定義:? 結構體的定義有兩種方式,一種是在聲明類型的同時定義結構體變量,另一種是在主函數(shù)內(nèi)定義結構體變量:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct student
{
char name[20];
int age;
char sex[5];
float score;
}s1,s2;
//定義結構體變量s1、s2
//此處定義的結構體變量是全局的
struct student s3, s4;
//定義結構體變量s3、s4
//此處定義的結構體變量等同于聲明時定義,也是全局的
int main()
{
struct student s5, s6;
//定義結構體變量s5、s6
//此處定義的結構體變量是局部的
return 0;
}
? 兩種定義方式均可,但也有所不同。在聲明結構體類型時所定義的結構體變量是全局的,而在主函數(shù)內(nèi)定義結構體變量則是局部的。
? 5.結構體變量的初始化:? 結構體變量在進行初始化時同樣有兩種方式,一種是在聲明時定義并進行初始化,另一種是在主函數(shù)內(nèi)定義并進行初始化:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct student
{
char name[20];
int age;
char sex[5];
float score;
}s1 = { "Zhang",21,"Man",98.4 };
//初始化結構體變量s1,此處的結構體變量是全局的
struct student s2 = { "Wang",20,"Woman",99.5 };
//初始化結構體變量s2,此處初始化的結構體變量等同于聲明時初始化,也是全局的
int main()
{
struct student s3 = { "Jiao",21,"Man",67.2 };
//初始化結構體變量s3,此處的結構體變量是局部的
printf("%s %d %s %.1lf\n", s1.name, s1.age, s1.sex, s1.score);
printf("%s %d %s %.1lf\n", s2.name, s2.age, s2.sex, s2.score);
printf("%s %d %s %.1lf\n", s3.name, s3.age, s3.sex, s3.score);
return 0;
}
? 并且同樣的,在聲明結構體類型時所定義并初始化的結構體變量是全局的,而在主函數(shù)內(nèi)定義并初始化結構體變量則是局部的:
? 值得一提的是,結構體在進行初始化時允許進行嵌套初始化:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct student
{
char name[20];
int age;
char sex[5];
float score;
};
struct id
{
struct student s1;
//結構體允許嵌套初始化
char id[20];
};
int main()
{
struct id ID1 = { {"Zhang",21,"Man",98.4 },"2028224096" };
printf("%s %d %s %.1lf %s\n", ID1.s1.name, ID1.s1.age, ID1.s1.sex, ID1.s1.score, ID1.id);
return 0;
}
? 代碼運行起來依然可以得到我們想要的結果:
? 結構體變量訪問成員是指,通過點操作符 ' . ' 對結構體變量成員進行訪問。點操作符接受兩個操作數(shù),一個是結構體變量名,一個是結構體成員名:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct AGE
{
int age;
};
void Printf(struct AGE str)
{
printf("該同學的年齡為:%d\n", str.age);
}
int main()
{
struct AGE A1 = { 21 };
//定義并初始化結構體變量A1
printf("該同學的年齡為:%d\n", A1.age);
//通過點操作符訪問結構體變量A1的結構體成員age
//點操作符接受兩個操作數(shù),一個是結構體變量名A1,另一個是結構體成員名age
Printf(A1);
return 0;
}
如此就可以實現(xiàn)結構體變量對成員的訪問了:
? 而有些時候我們得到的不是一個結構體變量,而是指向一個結構體變量的指針,那么在這種情況下,我們又該如何去訪問結構體成員呢?答案是,使用結構體指針訪問指向變量的成員:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct AGE
{
int age;
};
void Printf(struct AGE* str)
//接收結構體地址
{
printf("該同學的年齡為:%d\n", (*str).age);
//使用結構體指針訪問指向?qū)ο蟮某蓡T
printf("該同學的年齡為:%d\n", str->age);
//或使用'->'操作符,也能實現(xiàn)使用結構體指針訪問指向?qū)ο蟮某蓡T
}
int main()
{
struct AGE A1 = { 21 };
//定義并初始化結構體變量A1
Printf(&A1);
//給結構體地址傳參
return 0;
}
? 通過使用結構體指針,我們成功的訪問了指向變量的成員:
? 類似于函數(shù),在函數(shù)中訪問結構體成員時,也存在著傳值調(diào)用與傳址調(diào)用的問題。為了研究這個問題,我們直接上代碼進行研究:
#define _CRT_SECURE_NO_WARNINGS 1
#includestruct TEST
{
int test;
};
//結構體傳參
void Printf1(struct TEST test1)
{
printf("打印測試用例Printf1:%d\n", test1.test);
}
//結構體地址傳參
void Printf2(struct TEST* test1)
{
printf("打印測試用例Printf2:%d\n", test1->test);
}
int main()
{
struct TEST test1 = {666};
Printf1(test1);
//傳值調(diào)用:傳結構體
Printf2(&test1);
//傳址調(diào)用:傳結構體地址
return 0;
}
? 那么上面的兩種調(diào)用方式哪一種更好呢?我們認為應當選 Printf2 函數(shù)。原因是函數(shù)在傳參時,參數(shù)是需要壓棧的,即將整個結構體變量的所有成員數(shù)據(jù)全部拷貝至函數(shù)執(zhí)行時所創(chuàng)建的臨時空間。那么假設在傳遞結構體對象的時候,結構體過大,參數(shù)壓棧的系統(tǒng)開銷有可能會很大,這種情況下將會導致我們計算機系統(tǒng)的性能的下降:
? 結論:我們在進行結構體傳參時,應當傳遞結構體的地址。
四、總結:? 那么到這里,今天我們關于初階結構體的學習就結束啦。關于結構體的知識其實還有很多,而我們今天學習的目標僅僅只是讓各位小伙伴們能夠?qū)W會使用結構體,關于結構體更深層次的知識點,我們將在后續(xù)的進階模塊全部為各位小伙伴們做更加詳細的全面介紹。
? 通過今天的學習,想必各位小伙伴們已經(jīng)學會了結構體的使用,大家如果仍然存有疑問,或者對于結構體的使用有自己的一些想法,可以在課下多多嘗試,用實驗來進行求證。如果實在無法解決,也歡迎各位先伙伴們私信我,我會竭盡我個人所能,為各位小伙伴們答疑解惑。懶惰不會讓你一下子跌倒,但會在不知不覺中減少你的收獲;勤奮也不會讓你一夜成功,但會在不知不覺中積累你的成果!
新人初來乍到,辛苦各位小伙伴們動動小手,三連走一走 ~ ~ ~??最后,本文仍有許多不足之處,歡迎各位看官老爺隨時私信批評指正!
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁題目:C語言第十八課:初階結構體-創(chuàng)新互聯(lián)
路徑分享:http://chinadenli.net/article28/dgjdcp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、服務器托管、ChatGPT、動態(tài)網(wǎng)站、微信小程序、手機網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)