二維碼
微世推網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 快報(bào)資訊 » 今日快報(bào) » 正文

嵌入式C語言基礎(chǔ)編程——5年程序員給你講解結(jié)構(gòu)體_精

放大字體  縮小字體 發(fā)布日期:2023-04-26 05:00:58    作者:田章楊    瀏覽次數(shù):226
導(dǎo)讀

本文主要是對(duì)C基礎(chǔ)敬請(qǐng)關(guān)注程關(guān)于結(jié)構(gòu)體得初步講解,后續(xù)會(huì)深入講解C高級(jí)相關(guān)得概念(C大神可先略過)。 本人近期會(huì)陸續(xù)上傳IT敬請(qǐng)關(guān)注程相關(guān)得資料和視頻教程,專業(yè)關(guān)注一下互相交流:C C++ Java python linux ARM

本文主要是對(duì)C基礎(chǔ)敬請(qǐng)關(guān)注程關(guān)于結(jié)構(gòu)體得初步講解,后續(xù)會(huì)深入講解C高級(jí)相關(guān)得概念(C大神可先略過)。 本人近期會(huì)陸續(xù)上傳IT敬請(qǐng)關(guān)注程相關(guān)得資料和視頻教程,專業(yè)關(guān)注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯(lián)網(wǎng)@。想學(xué)敬請(qǐng)關(guān)注程得朋友進(jìn)入主頁即可看到相關(guān)教程和資料。

本文主要講解得內(nèi)容:

1定義一個(gè)結(jié)構(gòu)體得一般形式

2結(jié)構(gòu)類型變量得說明

3結(jié)構(gòu)變量成員得表示方法

4結(jié)構(gòu)變量得賦值

5結(jié)構(gòu)變量得初始化

6結(jié)構(gòu)數(shù)組得定義

7結(jié)構(gòu)指針變量得說明和使用

7.1指向結(jié)構(gòu)變量得指針

7.2指向結(jié)構(gòu)數(shù)組得指針

7.3結(jié)構(gòu)指針變量作函數(shù)參數(shù)

8類型定義符 typedef

9本章小結(jié)

11.1 定義一個(gè)結(jié)構(gòu)體得一般形式

在實(shí)際問題中,一組數(shù)據(jù)往往具有不同得數(shù)據(jù)類型。例如,在學(xué)生登記表中,姓名應(yīng)為 字符型;學(xué)號(hào)可為整型或字符型;年齡應(yīng)為整型;性別應(yīng)為字符型;成績可為整型或?qū)嵭汀?顯然不能用一個(gè)數(shù)組來存放這一組數(shù)據(jù)。因?yàn)閿?shù)組中各元素得類型和長度都必須一致,以便于 敬請(qǐng)關(guān)注譯系統(tǒng)處理。猥瑣解決這個(gè)問題, C 語言中給出了另一種構(gòu)造數(shù)據(jù)類型——" 結(jié)構(gòu)(structure)"或叫"結(jié)構(gòu)體"。 它相當(dāng)于其它高級(jí)語言中得記錄。"結(jié)構(gòu)"是一種構(gòu)造類型,它是由若干"成員"組成得。每一個(gè)成員專業(yè)是一個(gè)基本數(shù)據(jù)類型或者又是一個(gè)構(gòu)造 類型。結(jié)構(gòu)既是一種"構(gòu)造"而成得數(shù)據(jù)類型,那嗎在說明和使用之前必須先定義它,也就 是構(gòu)造它。如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。

定義一個(gè)結(jié)構(gòu)得一般形式為:

struct 結(jié)構(gòu)名

{

成員表列

};

成員表列由若干個(gè)成員組成,每個(gè)成員都是該結(jié)構(gòu)得一個(gè)組成部分。對(duì)每個(gè)成員也必須作類 型說明,其形式為:

類型說明符 成員名;

成員名得命名應(yīng)符合標(biāo)識(shí)符得書寫規(guī)定。例如: struct stu

{

int num;

char name[20]; char sex; float score;

};

在這個(gè)結(jié)構(gòu)定義中,結(jié)構(gòu)名為 stu,該結(jié)構(gòu)由 4 個(gè)成員組成。第壹個(gè)成員為 num,整型變量; 第二個(gè)成員為 name,字符數(shù)組;第三個(gè)成員為 sex,字符變量;第四個(gè)成員為 score,實(shí)型變量。應(yīng)注意在括號(hào)后得分號(hào)是不可少得。結(jié)構(gòu)定義之后,即可進(jìn)行變量說明。凡說明為結(jié)構(gòu) stu 得變量都由上述 4 個(gè)成員組成。由此可見, 結(jié)構(gòu)是一種復(fù)雜得數(shù)據(jù)類型,是數(shù)目固定, 類型不同得若干有序變量得集合。

11.2 結(jié)構(gòu)類型變量得說明

說明結(jié)構(gòu)變量有以下三種方法。以上面定義得 stu 為例來加以說明。先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。

如 : struct stu

{

int num;

char name[20]; char sex; float score;

};

struct stu boy1, boy2;

說明了兩個(gè)變量 boy1 和 boy2 為 stu 結(jié)構(gòu)類型。也專業(yè)用宏定義使一個(gè)符號(hào)常量來表示一個(gè)結(jié)構(gòu)類型。

例如:

#define STU struct stu STU

{

int num;

char name[20]; char sex; float score;

};

STU boy1, boy2;

在定義結(jié)構(gòu)類型得同時(shí)說明結(jié)構(gòu)變量。例如:

struct stu

{

int num;

char name[20]; char sex; float score;

}boy1, boy2;

這種形式得說明得一般形式為:

struct 結(jié)構(gòu)名

{

成員表列

}變量名表列;

直接說明結(jié)構(gòu)變量。例如:

struct

{

int num;

char name[20]; char sex; float score;

}boy1, boy2;

這種形式得說明得一般形式為: struct

{

成員表列

}變量名表列;

第三種方法與第二種方法得區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。三 種方法中說明得 boy1,boy2 變量都具有下圖所示得結(jié)構(gòu)。

說明了 boy1,boy2 變量為 stu 類型后,即可向這兩個(gè)變量中得各個(gè)成員賦值。在上述 stu 結(jié)構(gòu)定義中,所有得成員都是基本數(shù)據(jù)類型或數(shù)組類型。

成員也專業(yè)又是一個(gè)結(jié)構(gòu),即構(gòu)成了嵌套得結(jié)構(gòu)。例如,下圖給出了另一個(gè)數(shù)據(jù)結(jié)構(gòu)。

按圖可給出以下結(jié)構(gòu)定義:

struct date

{

int month; int day; int year;

};

struct{

int num;

char name[20]; char sex;

struct date birthday; float score;

}boy1, boy2;

首先定義一個(gè)結(jié)構(gòu) date,由 month(月)、day(日)、year(年) 三個(gè)成員組成。 在定義并說明變量 boy1 和 boy2 時(shí),其中得成員 birthday 被說明為 data 結(jié)構(gòu)類型。成員名可與程序中其它變量同名,互不干擾。

11.3 結(jié)構(gòu)變量成員得表示方法

在程序中使用結(jié)構(gòu)變量時(shí),往往不把它作為一個(gè)整體來使用。在 ANSI C 中除了最優(yōu)具有相同類型得結(jié)構(gòu)變量相互賦值以外,一般對(duì)結(jié)構(gòu)變量得使用,包括賦值、輸入、輸出、運(yùn)算@都 是通過結(jié)構(gòu)變量得成員來實(shí)現(xiàn)得。

表示結(jié)構(gòu)變量成員得一般形式是: 結(jié)構(gòu)變量名.成員名

例如:

boy1.num 即第壹個(gè)人得學(xué)號(hào)

boy2.sex 即第二個(gè)人得性別

如果成員本身又是一個(gè)結(jié)構(gòu)則必須逐級(jí)找到蕞低級(jí)得成員才能使用。 例如:

boy1.birthday.month

即第壹個(gè)人出生得月份成員專業(yè)在程序中單獨(dú)使用,與普通變量完全相同。

11.4 結(jié)構(gòu)變量得賦值

結(jié)構(gòu)變量得賦值就是給各成員賦值??捎幂斎胝Z句或賦值語句來完成。

【例 11.1】給結(jié)構(gòu)變量賦值并輸出其值。

本程序中用賦值語句給 num 和 name 兩個(gè)成員賦值,name 是一個(gè)字符串指針變量。用 scanf 函數(shù)動(dòng)態(tài)地輸入 sex 和 score 成員值,然后把 boy1 得所有成員得值整體賦予 boy2。最后分別輸出 boy2 得各個(gè)成員值。本例表示了結(jié)構(gòu)變量得賦值、輸入和輸出得方法。

11.5 結(jié)構(gòu)變量得初始化

和其他類型變量一樣,對(duì)結(jié)構(gòu)變量專業(yè)在定義時(shí)進(jìn)行初始化賦值。

【例 11.2】對(duì)結(jié)構(gòu)變量初始化。

本例中,boy2,boy1 均被定義為外部結(jié)構(gòu)變量,并對(duì) boy1 作了初始化賦值。在 main 函數(shù)中, 把 boy1 得值整體賦予 boy2,然后用兩個(gè) printf 語句輸出 boy2 各成員得值。

11.6 結(jié)構(gòu)數(shù)組得定義

數(shù)組得元素也專業(yè)是結(jié)構(gòu)類型得。因此專業(yè)構(gòu)成結(jié)構(gòu)型數(shù)組。結(jié)構(gòu)數(shù)組得每一個(gè)元素都是具 有相同結(jié)構(gòu)類型得下標(biāo)結(jié)構(gòu)變量。在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu) 得一個(gè)群體。如一個(gè)班得學(xué)生檔案,一個(gè)車間職工得工資表@。

方法和結(jié)構(gòu)變量相似,只需說明它為數(shù)組類型即可。 例如:

struct stu

{

int num; char govname; char sex; float score;

}boy[5];

定義了一個(gè)結(jié)構(gòu)數(shù)組 boy,共有 5 個(gè)元素,boy[0]~boy[4]。每個(gè)數(shù)組元素都具有 struct stu 得結(jié)構(gòu)形式。對(duì)結(jié)構(gòu)數(shù)組專業(yè)作初始化賦值。

例如:

當(dāng)對(duì)全部元素作初始化賦值時(shí),也可不給出數(shù)組長度。

【例 11.3】計(jì)算學(xué)生得平均成績和不及格得人數(shù)。

本例程序中定義了一個(gè)外部結(jié)構(gòu)數(shù)組 boy,共 5 個(gè)元素,并作了初始化賦值。在 main 函數(shù)中用 for 語句逐個(gè)累加各元素得 score 成員值存于 s 之中,如 score 得值小于 60(不及格)即計(jì)數(shù)器 C 加 1,循環(huán)完畢后計(jì)算平均成績,并輸出全班總分,平均分及不及格人數(shù)。

【例 11.4】建立同學(xué)通訊錄

本程序中定義了一個(gè)結(jié)構(gòu) mem,它有兩個(gè)成員 name 和 phone 用來表示姓名和電話號(hào)碼。在主函數(shù)中定義 man 為具有 mem 類型得結(jié)構(gòu)數(shù)組。在 for 語句中,用 gets 函數(shù)分別輸入各個(gè)元素中兩個(gè)成員得值。然后又在 for 語句中用 printf 語句輸出各元素中兩個(gè)成員值。

11.7 結(jié)構(gòu)指針變量得說明和使用11.7.1 指向結(jié)構(gòu)變量得指針

一個(gè)指針變量當(dāng)用來指向一個(gè)結(jié)構(gòu)變量時(shí),稱之為結(jié)構(gòu)指針變量。結(jié)構(gòu)指針變量中得值是所 指向得結(jié)構(gòu)變量得首地址。通過結(jié)構(gòu)指針即可訪問該結(jié)構(gòu)變量,這與數(shù)組指針和函數(shù)指針得 情況是相同得。

結(jié)構(gòu)指針變量說明得一般形式為:

struct 結(jié)構(gòu)名 gov結(jié)構(gòu)指針變量名

例如,在前面得例題中定義了 stu 這個(gè)結(jié)構(gòu),如要說明一個(gè)指向 stu 得指針變量 pstu,可寫為:

struct stu govpstu;

當(dāng)然也可在定義 stu 結(jié)構(gòu)時(shí)同時(shí)說明 pstu。與前面討論得各類指針變量相同,結(jié)構(gòu)指針變量也必須要先賦值后才能使用。

賦值是把結(jié)構(gòu)變量得首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。如果 boy 是被說明為 stu 類型得結(jié)構(gòu)變量,則:

Pstu = &boy 是正確得,而: Pstu = &stu

是錯(cuò)誤得。

結(jié)構(gòu)名和結(jié)構(gòu)變量是兩個(gè)不同得概念,不能混淆。結(jié)構(gòu)名只能表示一個(gè)結(jié)構(gòu)形式,敬請(qǐng)關(guān)注譯系統(tǒng)并不對(duì)它分配內(nèi)存空間。只有當(dāng)某變量被說明為這種類型得結(jié)構(gòu)時(shí),才對(duì)該變量分配存儲(chǔ)空間。因此上面&stu 這種寫法是錯(cuò)誤得,不專家去取一個(gè)結(jié)構(gòu)名得首地址。有了結(jié)構(gòu)指針變量, 就能更方便地訪問結(jié)構(gòu)變量得各個(gè)成員。

其訪問得一般形式為:

(gov結(jié)構(gòu)指針變量).成員名或?yàn)椋?/p>

結(jié)構(gòu)指針變量->成員名

例如:

(govpstu).num 或者:

pstu->num

應(yīng)該注意(govpstu)兩側(cè)得括號(hào)不可少,因?yàn)槌蓡T符"."得優(yōu)先級(jí)高于"gov"。如去掉括號(hào)寫作govpstu.num 則@效于gov(pstu.num),這樣,意義就完全不對(duì)了。下面通過例子來說明結(jié)構(gòu)指針變量得具體說明和使用方法。

【例 11.5】

本例程序定義了一個(gè)結(jié)構(gòu) stu,定義了 stu 類型結(jié)構(gòu)變量 boy1 并作了初始化賦值,還定義了一個(gè)指向 stu 類型結(jié)構(gòu)得指針變量 pstu。在 main 函數(shù)中,pstu 被賦予 boy1 得地址,因此 pstu 指向 boy1。然后在 printf 語句內(nèi)用三種形式輸出 boy1 得各個(gè)成員值。從運(yùn)行結(jié)果專業(yè)看出:

結(jié)構(gòu)變量.成員名

(gov結(jié)構(gòu)指針變量).成員名結(jié)構(gòu)指針變量->成員名

這三種用于表示結(jié)構(gòu)成員得形式是完全@效得。

11.7.2 指向結(jié)構(gòu)數(shù)組得指針

指針變量專業(yè)指向一個(gè)結(jié)構(gòu)數(shù)組,這時(shí)結(jié)構(gòu)指針變量得值是整個(gè)結(jié)構(gòu)數(shù)組得首地址。結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組得一個(gè)元素,這時(shí)結(jié)構(gòu)指針變量得值是該結(jié)構(gòu)數(shù)組元素得首地址。設(shè) ps 為指向結(jié)構(gòu)數(shù)組得指針變量,則 ps 也指向該結(jié)構(gòu)數(shù)組得 0 號(hào)元素,ps+1 指向 1 號(hào)元素,

ps+i 則指向 i 號(hào)元素。這與普通數(shù)組得情況是一致得。

【例 11.6】用指針變量輸出結(jié)構(gòu)數(shù)組。

在程序中,定義了 stu 結(jié)構(gòu)類型得外部數(shù)組 boy 并作了初始化賦值。在 main 函數(shù)內(nèi)定義 ps 為指向 stu 類型得指針。在循環(huán)語句 for 得表達(dá)式 1 中,ps 被賦予 boy 得首地址,然后循環(huán)

5 次,輸出 boy 數(shù)組中各成員值。

應(yīng)該注意得是,一個(gè)結(jié)構(gòu)指針變量雖然專業(yè)用來訪問結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素得成員,但是, 不能使它指向一個(gè)成員。也就是說不最優(yōu)取一個(gè)成員得地址來賦予它。因此,下面得賦值是錯(cuò)誤得。

ps = &boy[1].sex; 而只能是:

ps = boy;(賦予數(shù)組首地址) 或者是:

ps = &boy[0];(賦予 0 號(hào)元素首地址)

11.7.3 結(jié)構(gòu)指針變量作函數(shù)參數(shù)

在 ANSI C 標(biāo)準(zhǔn)中最優(yōu)用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。但是這種傳送要將全部成員逐個(gè)傳送,www.是成員為數(shù)組時(shí)將會(huì)使傳送得時(shí)間和空間開銷很大,嚴(yán)重地降低了程序得效率。 因此蕞好得辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。這時(shí)由實(shí)參傳向形參得 只是地址,從而減少了時(shí)間和空間得開銷。

【例 11.7】計(jì)算一組學(xué)生得平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)敬請(qǐng)關(guān)注程。

本程序中定義了函數(shù) ave,其形參為結(jié)構(gòu)指針變量 ps。boy 被定義為外部結(jié)構(gòu)數(shù)組,因此在整個(gè)源程序中有效。在 main 函數(shù)中定義說明了結(jié)構(gòu)指針變量 ps,并把 boy 得首地址賦予它, 使 ps 指向 boy 數(shù)組。然后以 ps 作實(shí)參調(diào)用函數(shù) ave。在函數(shù) ave 中完成計(jì)算平均成績和統(tǒng)計(jì)不及格人數(shù)得工作并輸出結(jié)果。

由于本程序全部采用指針變量作運(yùn)算和處理,故速度更快,程序效率更高。

11.8 類型定義符 typedef

C語言不僅提供了豐富得數(shù)據(jù)類型,而且還最優(yōu)由用戶官網(wǎng)定義類型說明符,也就是說最優(yōu) 由用戶為數(shù)據(jù)類型取"別名"。類型定義符 typedef 即可用來完成此功能。例如,有整型量 a,b, 其說明如下:

int a, b;

其中 int 是整型變量得類型說明符。int 得完整寫法為 integer,猥瑣增加程序得可讀性,可把整型說明符用 typedef 定義為:

typedef int INTEGER

這以后就可用 INTEGER 來代替 int 作整型變量得類型說明了。例如:

INTEGER a,b;

它@效于:

int a, b;

用 typedef 定義數(shù)組、指針、結(jié)構(gòu)@類型將帶來很大得方便,不僅使程序書寫簡單而且使意義更為明確,因而增強(qiáng)了可讀性。

例如:

typedef char NAME[20]; 表示 NAME 是字符數(shù)組類型,數(shù)組長度為 20。然后可用 NAME說明變量,如:

NAME a1, a2, s1, s2;

完全@效于:

char a1[20], a2[20], s1[20], s2[20]

又如:

typedef struct stu

{

char name[20];

int age; char sex;

} STU;

定義 STU 表示 stu 得結(jié)構(gòu)類型,然后可用 STU 來說明結(jié)構(gòu)變量: STU body1, body2;

typedef 定義得一般形式為:

typedef 原類型名 新類型名

其中原類型名中含有定義部分,新類型名一般用大寫表示,以便于區(qū)別。

有時(shí)也可用宏定義來代替 typedef 得功能,但是宏定義是由預(yù)處理完成得,而 typedef 則是在敬請(qǐng)關(guān)注譯時(shí)完成得,后者更為靈活方便。

11.9 本章小結(jié)

1. "結(jié)構(gòu)"是一種構(gòu)造類型,它是由若干"成員"組成得。

2. 表示結(jié)構(gòu)變量成員得一般形式是:結(jié)構(gòu)變量名.成員名;結(jié)構(gòu)變量專業(yè)在定義時(shí)進(jìn)行初始化賦值。

3. 數(shù)組得元素也專業(yè)是結(jié)構(gòu)類型得,每一個(gè)元素都是具有相同結(jié)構(gòu)類型得下標(biāo)結(jié)構(gòu)變量。

4. 結(jié)構(gòu)指針變量說明得一般形式為:struct 結(jié)構(gòu)名 gov結(jié)構(gòu)指針變量名;訪問得一般形式為: 結(jié)構(gòu)指針變量->成員名。

5.結(jié)構(gòu)變量作函數(shù)參數(shù),蕞好得辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。

 
(文/田章楊)
免責(zé)聲明
本文僅代表發(fā)布者:田章楊個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright?2015-2025 粵公網(wǎng)安備 44030702000869號(hào)

粵ICP備16078936號(hào)

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

24在線QQ: 770665880

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號(hào): weishitui

韓瑞 小英 張澤

工作時(shí)間:

周一至周五: 08:00 - 24:00

反饋

用戶
反饋