詳解C語(yǔ)言結(jié)構(gòu)體的定義和使用
1.1: 結(jié)構(gòu)體用來干嘛?
生活中我們會(huì)遇到很多的表格,就比如你的學(xué)習(xí)成績(jī)表,有姓名 ,學(xué)號(hào),各科的成績(jī),總的成績(jī)等等,這是一些不同的數(shù)據(jù)類型,我們要是在c語(yǔ)言中想同時(shí)使用這些不同的數(shù)據(jù)怎么辦呢? 可以使用結(jié)構(gòu)體變量,結(jié)構(gòu)體變量在c語(yǔ)言中是一種構(gòu)造類型的數(shù)據(jù),顧名思義,它跟基本的如int這種原子類型的變量不同.可以把他看作這些基本變量的集合.
1.2:結(jié)構(gòu)體變量的基本定義格式
struct 結(jié)構(gòu)體名
{
<基本類型名> <成員變量名>;
<基本類型名> <成員變量名>;
<基本類型名> <成員變量名>;
};
注意:struct 是關(guān)鍵字是結(jié)構(gòu)體類型的說明標(biāo)識(shí)符,不能省略,結(jié)構(gòu)體名可以省略,我們?cè)谑褂?typedef struct 時(shí)就省略了就不寫結(jié)構(gòu)體名
1.3:結(jié)構(gòu)體變量的定義
(我們也可以在創(chuàng)建結(jié)構(gòu)體的時(shí)候聲明變量這里不再贅述,提一下我對(duì)結(jié)構(gòu)體變量的理解:首先結(jié)構(gòu)體就是一個(gè)各種基本數(shù)據(jù)類型的集合,而就結(jié)構(gòu)體變量就像我們定義一個(gè)集合s={1,2,3,4},s就相當(dāng)于一個(gè)結(jié)構(gòu)體變量,結(jié)構(gòu)體變量包含結(jié)構(gòu)體中的各個(gè)成員變量,我們可以對(duì)成員變量進(jìn)行引用,操作....)
struct 結(jié)構(gòu)體名 a, b; //定義了兩個(gè)結(jié)構(gòu)體變量 strcut 結(jié)構(gòu)體名 S[4]; //定義一個(gè)結(jié)構(gòu)體變量數(shù)組,有四個(gè)元素 strcut 結(jié)構(gòu)體名* p = &a; //定義一個(gè)結(jié)構(gòu)體指針,指向結(jié)構(gòu)體變量a
1.4結(jié)構(gòu)體變量的三種引用方法
結(jié)構(gòu)體變量.成員名 (*結(jié)構(gòu)體指針).成員名 結(jié)構(gòu)體指針->成員名 //使用指針的時(shí)候推薦使用這一種,因?yàn)樵跀?shù)據(jù)結(jié)構(gòu)中,很多這種引用方式
2.結(jié)構(gòu)體變量的使用(直接使用結(jié)構(gòu)體變量)
#include <stdio.h>
/*結(jié)構(gòu)體的使用*/
int main()
{
struct job_exam //定義一個(gè)job_exam的結(jié)構(gòu)體
{
unsigned num; //學(xué)號(hào)
char name[10]; //姓名
char gread_class[10]; //班級(jí)
int EngLish; //英語(yǔ)成績(jī)
int Chinese; //語(yǔ)文成績(jī)
int Match; //數(shù)學(xué)成績(jī)
int Sum_Exam; //總成績(jī)
};
struct job_exam Most_Exam_Student; //結(jié)構(gòu)體變量用來存放成績(jī)最高的同學(xué)的信息
struct job_exam SomeStudent_news[4] = { {1901,"隴軍","3-2班",100,100,78},{1902,"李華","3-2班",99,99,88},
{1903,"李明","3-2班",99,98,90},{1903,"李光","3-2班",99,98,80}}; //結(jié)構(gòu)體數(shù)組用來輸入4名同學(xué)的信息
for (int i = 0; i < 4; i++) //依次計(jì)算每一位同學(xué)的總成績(jī)
{
SomeStudent_news[i].Sum_Exam = SomeStudent_news[i].EngLish + SomeStudent_news[i].Chinese + SomeStudent_news[i].Match;
}
Most_Exam_Student = SomeStudent_news[0]; //假使第一個(gè)學(xué)生的成績(jī)最高
if (Most_Exam_Student.Sum_Exam < SomeStudent_news[1].Sum_Exam)
{
Most_Exam_Student = SomeStudent_news[1];
}
else if (Most_Exam_Student.Sum_Exam < SomeStudent_news[2].Sum_Exam)
{
Most_Exam_Student = SomeStudent_news[2];
}
else
{
Most_Exam_Student = SomeStudent_news[3];
}
printf("總成績(jī)最高學(xué)生的信息為:\n");
printf(" 編號(hào) 姓名 班級(jí) 英語(yǔ) 語(yǔ)文 數(shù)學(xué) 總成績(jī)\n");
printf("%6u %7s %7s %6d %6d %6d %6d",Most_Exam_Student.num,Most_Exam_Student.name,Most_Exam_Student.gread_class,Most_Exam_Student.EngLish,Most_Exam_Student.Chinese,Most_Exam_Student.Match,Most_Exam_Student.Sum_Exam);
}
2.1輸出結(jié)果

當(dāng)用結(jié)構(gòu)體變量作為函數(shù)參數(shù)進(jìn)行整體傳送時(shí),要將全部成員逐個(gè)進(jìn)行傳送,當(dāng)成員中有數(shù)組時(shí),會(huì)使傳送的時(shí)間和空間開銷都很大嚴(yán)重降低程序的效率,所以我們一般在使用時(shí)不直接傳送結(jié)構(gòu)體變量,而是傳送結(jié)構(gòu)體變量的地址,減少時(shí)間課空間的開銷
3.使用結(jié)構(gòu)體指針操作,返回總成績(jī)最低的學(xué)生信息
#include <stdio.h>
/*結(jié)構(gòu)體的使用*/
int Find_Sumexam(struct job_exam* pa); //函數(shù)聲明
struct job_exam //定義一個(gè)全局job_exam的結(jié)構(gòu)體
{
unsigned num; //學(xué)號(hào)
char name[10]; //姓名
char gread_class[10]; //班級(jí)
int EngLish; //英語(yǔ)成績(jī)
int Chinese; //語(yǔ)文成績(jī)
int Match; //數(shù)學(xué)成績(jī)
int Sum_Exam; //總成績(jī)
};
struct job_exam SomeStudent_news[4] = { {1901,"隴軍","3-2班",100,100,78},{1902,"李華","3-2班",99,99,88}, //結(jié)構(gòu)體數(shù)組用來輸入4名同學(xué)的信息
{1903,"李明","3-2班",99,98,90},{1903,"李光","3-2班",99,98,80} };
int main()
{
struct job_exam Most_Exam_Student; //結(jié)構(gòu)體變量用來存放成績(jī)最高的同學(xué)的信息
for (int i = 0; i < 4; i++) //依次計(jì)算每一位同學(xué)的總成績(jī)
{
SomeStudent_news[i].Sum_Exam = SomeStudent_news[i].EngLish + SomeStudent_news[i].Chinese + SomeStudent_news[i].Match;
}
Find_Sumexam(&Most_Exam_Student); //函數(shù)調(diào)用
printf("總成績(jī)最低學(xué)生的信息為:\n");
printf(" 編號(hào) 姓名 班級(jí) 英語(yǔ) 語(yǔ)文 數(shù)學(xué) 總成績(jī)\n");
printf("%6u %7s %7s %6d %6d %6d %6d",Most_Exam_Student.num,Most_Exam_Student.name,Most_Exam_Student.gread_class,Most_Exam_Student.EngLish,Most_Exam_Student.Chinese,Most_Exam_Student.Match,Most_Exam_Student.Sum_Exam);
}
int Find_Sumexam(struct job_exam* pa) //定義一個(gè)返回最高學(xué)生信息的函數(shù)
{
*pa = SomeStudent_news[0]; //假使第一個(gè)學(xué)生的總成績(jī)最高
for (int i = 1; i < 4; i++)
{
if (pa->Sum_Exam > SomeStudent_news[i].Sum_Exam)
{
*pa = SomeStudent_news[i]; //這樣的化只需要找到最高一個(gè)學(xué)生的地址返回他的信息就可以了
}
}
return 0;
}
3.1運(yùn)行結(jié)果

總結(jié):
結(jié)構(gòu)體沒有什么神奇的就是,一個(gè)集合里面包含了各種數(shù)據(jù)類型,我們想用什么加個(gè).就可以拿出來用,本質(zhì)和基本的數(shù)據(jù)類型沒有什么區(qū)別,歡迎大家來評(píng)論區(qū)指出有問題的地方
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VC++ 6.0 C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊詳細(xì)教程
這篇文章主要為大家介紹了VC++ 6.0 C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
解析c++ 中智能指針引用計(jì)數(shù)為什么不是0原理
這篇文章主要為大家介紹了C語(yǔ)言中智能指針引用計(jì)數(shù)為什么不是0原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解
深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類擁有資源,當(dāng)這個(gè)類的對(duì)象發(fā)生復(fù)制過程的時(shí)候,資源重新分配,這個(gè)過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝2013-09-09
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換的相關(guān)資料,需要的朋友可以參考下2017-06-06
仿寫C語(yǔ)言string.h頭文件檢驗(yàn)字符串函數(shù)
這里給大家分享的是一個(gè)C語(yǔ)言string.h頭文件檢驗(yàn)字符串函數(shù)的仿寫,非常的簡(jiǎn)單實(shí)用,小編覺得這篇文寫的還不錯(cuò),希望能夠給你帶來幫助2021-11-11

