C 語(yǔ)言結(jié)構(gòu)體的使用方法
C 語(yǔ)言結(jié)構(gòu)體使用
1. 結(jié)構(gòu)體的聲明和定義
1.1 介紹
- 我們知道數(shù)組是同種類型值的集合,而結(jié)構(gòu)就是可以將不同類型的值放在一起。
- 結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個(gè)成員可以是不同類型的變量。
- 結(jié)構(gòu)的成員可以是標(biāo)量、數(shù)組、指針,甚至是其他結(jié)構(gòu)體。
如我們可以將一個(gè)學(xué)生的一些屬性放在一起
struct stu//定義一個(gè)結(jié)構(gòu)體類型,就如int、char,struct stu是我們定義的結(jié)構(gòu)體類型
{
//成員變量
char name[20];//名字
int age;//歲數(shù)
char id[20];//學(xué)號(hào)
};
int main()
{
struct stu a;//定義一個(gè)struct stu類型的變量a,而對(duì)象a中就包含了名字,歲數(shù),學(xué)號(hào)的屬性
}
1.2定義的幾種類型
類型1:
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu a;//定義局部變量a
}
類型2:
struct stu
{
char name[20];
int age;
}s1,s2;//定義全局變量s1,s2
2. 結(jié)構(gòu)體初始化
代碼如下:
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
int main()
{
//初始化時(shí),其實(shí)是和數(shù)組初始化一樣,用大括號(hào),里面放上初始化的值。若結(jié)構(gòu)體里面包含結(jié)構(gòu)體,則大括號(hào)里面 //在放一個(gè)大括號(hào),里面放內(nèi)部結(jié)構(gòu)體初始化的值
struct stu a={"bobo",18,"2021520",{15.8,"free"}};
}
3. 結(jié)構(gòu)體成員訪問
3.1 成員介紹
- 結(jié)構(gòu)變量的成員是通過點(diǎn)操作符(.)訪問的。點(diǎn)操作符接受兩個(gè)操作數(shù),如:m.n(m為結(jié)構(gòu)體變量,n為結(jié)構(gòu)體中你想要訪問的成員變量)
- 指向一個(gè)結(jié)構(gòu)體的指針訪問指向變量的成員是通過操作符(->)訪問的。 如:m->n(m為指向一個(gè)結(jié)構(gòu)體的指針,n為結(jié)構(gòu)體中你想要訪問的成員變量),也可以(*m).n
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
int main()
{
struct stu a={"bobo",18,"2021520",{15.8,"free"}};
//法一
printf("%s\n",a.name);
printf("%d\n",a.age);
printf("%.1f\n",a.b.height);//若訪問結(jié)構(gòu)體中的結(jié)構(gòu)體中的一個(gè)成員,先訪問到內(nèi)部的結(jié)構(gòu)體,再訪問內(nèi)部結(jié)構(gòu)體中的成員
//法二
struct stu* pa=&a;
printf("%s\n",pa->name);
printf("%d\n",pa->age);
printf("%.1f\n",pa->b.height);
//法三
printf("%s\n",(*pa).name);
printf("%d\n",(*pa).age);
printf("%.1f\n",(*pa).b.height);
}
4. 結(jié)構(gòu)體傳參
注意:
結(jié)構(gòu)體傳參的時(shí)候
,要傳結(jié)構(gòu)體的地址更好
代碼如下:
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
void print1(struct stu p)
{
printf("%s %d %s %.1f %s",p.name,p.age,p.id,p.b.height,p.b.name);
}
void print2(struct stu* pa)
{
printf("%s %d %s %.1f %s",pa->name,pa->age,pa->id,pa->b.height,pa->b.name);
}
int main()
{
struct stu a={"bobo",18,"2021520",{15.8,"free"}};
//寫一個(gè)函數(shù)打印a的內(nèi)容
print1(a);//結(jié)果為:bobo 18 2021520 15.8 free(正常打印)
//再寫一個(gè)函數(shù),通過傳a的地址打印a的內(nèi)容
print2(&a);//結(jié)果為:bobo 18 2021520 15.8 free(正常打?。?
return 0;
}
那么傳值和傳址有什么不同,哪個(gè)更好呢?(首選傳址)
- 傳參時(shí),其實(shí)是對(duì)實(shí)參的一份拷貝,是會(huì)開辟一塊空間來(lái)存儲(chǔ)實(shí)參。傳值,是將整個(gè)實(shí)參拷貝過去,而傳地址,傳過去的只是地址,傳參的效率更高一些。
- 函數(shù)傳參的時(shí)候,參數(shù)是需要壓棧的。 如果傳遞一個(gè)結(jié)構(gòu)體對(duì)象的時(shí)候,結(jié)構(gòu)體過大,參數(shù)壓棧的的系統(tǒng)開銷比較大,所以會(huì)導(dǎo)致性能的下降。
那么什么是函數(shù)調(diào)用的參數(shù)壓棧呢?
棧:一種數(shù)據(jù)結(jié)構(gòu),是一種只能在一端進(jìn)行插入和刪除操作的特殊線性表
特點(diǎn):先進(jìn)的后出,后進(jìn)的先出。(先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)被第一個(gè)讀出來(lái)))
壓棧:給棧里存數(shù)據(jù)

- 每一個(gè)函數(shù)的調(diào)用都會(huì)在內(nèi)存的棧區(qū)上開辟一塊空間,并且數(shù)據(jù)都會(huì)如壓棧一樣一個(gè)一個(gè)的存放進(jìn)棧區(qū),如果數(shù)據(jù)比較多、大時(shí),參數(shù)壓棧就比較吃力,所以導(dǎo)致性能就會(huì)下降。
到此這篇關(guān)于C 語(yǔ)言結(jié)構(gòu)體的使用基礎(chǔ)版的文章就介紹到這了,更多相關(guān)C 語(yǔ)言結(jié)構(gòu)體的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言結(jié)構(gòu)體的具體使用方法
- C語(yǔ)言入門篇--初識(shí)結(jié)構(gòu)體
- C語(yǔ)言自定義類型詳解(結(jié)構(gòu)體、枚舉、聯(lián)合體和位段)
- c語(yǔ)言結(jié)構(gòu)體字節(jié)對(duì)齊的實(shí)現(xiàn)方法
- C語(yǔ)言中結(jié)構(gòu)體與內(nèi)存對(duì)齊實(shí)例解析
- C語(yǔ)言結(jié)構(gòu)體計(jì)算內(nèi)存占用問題解析
- C語(yǔ)言結(jié)構(gòu)體指針案例解析
- C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程
- C語(yǔ)言結(jié)構(gòu)體簡(jiǎn)單入門講解
- C語(yǔ)言使用四種方法初始化結(jié)構(gòu)體
- C語(yǔ)言新手練習(xí)之多維數(shù)組、結(jié)構(gòu)體及函數(shù)
- C語(yǔ)言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況
- C語(yǔ)言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解
- C語(yǔ)言結(jié)構(gòu)體內(nèi)存的對(duì)齊知識(shí)詳解
- C語(yǔ)言結(jié)構(gòu)體占用內(nèi)存深入講解
- C語(yǔ)言結(jié)構(gòu)體版學(xué)生成績(jī)管理系統(tǒng)
相關(guān)文章
用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)
本篇文章是對(duì)使用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù),用實(shí)例進(jìn)行了分析說明,需要的朋友參考下2013-05-05
VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫(kù)文件的詳細(xì)過程
這篇文章主要介紹了VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫(kù)文件的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
C語(yǔ)言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”
本文的主要內(nèi)容,設(shè)計(jì)一個(gè)程序,找出100-999之間的“水仙花數(shù)”,需要的朋友可以參考下2015-07-07
C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用
C語(yǔ)言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言內(nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05
C++如何實(shí)現(xiàn)BCD碼和ASCII碼的相互轉(zhuǎn)換
這篇文章主要介紹了C++實(shí)現(xiàn)BCD碼和ASCII碼互轉(zhuǎn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
c++連接mysql數(shù)據(jù)庫(kù)的兩種方法(ADO連接和mysql api連接)
現(xiàn)在正做一個(gè)接口,通過不同的連接字符串操作不同的數(shù)據(jù)庫(kù)。要用到mysql數(shù)據(jù)庫(kù),C++連接mysql有2種方法:利用ADO連接、利用mysql自己的api函數(shù)進(jìn)行連接,下面看看如何用吧2013-12-12
C++函數(shù)的嵌套調(diào)用和遞歸調(diào)用學(xué)習(xí)教程
這篇文章主要介紹了C++函數(shù)的嵌套調(diào)用和遞歸調(diào)用學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

