一文學(xué)會(huì)c語(yǔ)言結(jié)構(gòu)體的定義和使用方法
一、什么是結(jié)構(gòu)體
在實(shí)際問(wèn)題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類(lèi)型;例如在學(xué)生信息登記表中,姓名為字符型,學(xué)號(hào)為整型或字符型,年齡為整型,性別為字符型,成績(jī)?yōu)檎突驅(qū)嵭?。因?yàn)閿?shù)據(jù)類(lèi)型不同,顯然不能用一個(gè)數(shù)組來(lái)存放。
在C語(yǔ)言中,可以使用結(jié)構(gòu)體(Struct)來(lái)存放一組不同類(lèi)型的數(shù)據(jù)。結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語(yǔ)言中聚合數(shù)據(jù)類(lèi)型(aggregate datatype)的一類(lèi)。結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實(shí)現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時(shí)也是一些元素的集合,這些元素稱(chēng)為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類(lèi)型,成員一般用名字訪問(wèn)。
定義結(jié)構(gòu)體的一般形式為:
struct 結(jié)構(gòu)體名{
成員列表
};
在成員表列中可以是幾種基本數(shù)據(jù)類(lèi)型,也可以是結(jié)構(gòu)體類(lèi)型。
struct 類(lèi)型名{} 變量;后的分號(hào)不能漏
例如用結(jié)構(gòu)體來(lái)表示學(xué)生信息:
struct stu{ char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) };
二、結(jié)構(gòu)體變量
結(jié)構(gòu)體也是一種數(shù)據(jù)類(lèi)型,可以用來(lái)說(shuō)明變量。例如:
struct stu stu1, stu2;
定義了兩個(gè)變量 stu1 和 stu2,它們都是 stu 類(lèi)型,都由 4 個(gè)成員組成。注意關(guān)鍵字struct不能少。
結(jié)構(gòu)體的各個(gè)成員在內(nèi)存中是連續(xù)存儲(chǔ)的。stu1、stu2 的內(nèi)存如下圖所示:
也可以在定義結(jié)構(gòu)體的同時(shí)定義結(jié)構(gòu)體變量:
struct stu{ char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) } stu1, stu2;
如果只需要 stu1、stu2 兩個(gè)變量,也可以不寫(xiě)結(jié)構(gòu)體名字:
struct{ //沒(méi)有寫(xiě) stu char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) } stu1, stu2;
這樣做書(shū)寫(xiě)簡(jiǎn)單,但是因?yàn)闆](méi)有結(jié)構(gòu)體名,后面就沒(méi)法用該結(jié)構(gòu)體定義新的變量。
也可以用宏定義使一個(gè)符號(hào)常量來(lái)表示一個(gè)結(jié)構(gòu)類(lèi)型,例如:
#define STU struct stu STU{ char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) }; STU stu1, stu2;
后面我們會(huì)學(xué)習(xí)Windows編程,大部分結(jié)構(gòu)體都是這樣定義的。
typedef和#define用法不同,甚至可以結(jié)合起來(lái)靈活使用,使用時(shí)一定要注意兩者的不同之處。
三、成員的獲取和賦值
在C語(yǔ)言中,使用點(diǎn)號(hào).來(lái)獲取結(jié)構(gòu)體中的一個(gè)成員,一般格式為:
結(jié)構(gòu)變量名.成員名
例如:
stu1.name; //第一個(gè)學(xué)生的姓名 stu2.score; //第二個(gè)學(xué)生的成績(jī)
獲取成員后,就可以對(duì)該成員進(jìn)行賦值了,例如:
stu1.name = “Tom”; stu2.score = 90.5;
除了可以對(duì)成員進(jìn)行逐一賦值,也可以像數(shù)組一樣整體賦值,例如:
struct stu{ char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) } stu1, stu2 = { "Tom", 10, 'M', 90 };
不過(guò)整體賦值僅限于上面這樣的情況,也就是定義結(jié)構(gòu)體的同時(shí)聲明變量。下面的寫(xiě)法是錯(cuò)誤的:
stu2 = { "Tom", 10, 'M', 90 };
一個(gè)完整的示例:
#include <stdio.h> #define STU struct stu int main(){ STU{ char *name; //姓名 int num; //學(xué)號(hào) char sex; //性別 float score; //成績(jī) }; STU stu1; stu1.name = "James Bond"; stu1.num = 1; stu1.sex = 'M'; //用M表示男性,W表示女性 stu1.score = 99; printf("Hello everyone! My name is %s, a naughty boy, but with good scores(%.2f) and top No.(%d)!", stu1.name, stu1.score, stu1.num); return 0; }
附:結(jié)構(gòu)體數(shù)組
指向結(jié)構(gòu)體對(duì)象的指針變量既可以指向結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組中的元素。
struct Student { int num; char name[20]; char sex; } s1[3]; struct Student *p;
指針可以指向數(shù)組,代碼如下:p = s1; p = &s1[0]; 指針移動(dòng)p++ 移動(dòng)一個(gè)結(jié)構(gòu)體字節(jié)大?。?/p>
指針訪問(wèn)成員方式:(*p).num p->num。
總結(jié)
到此這篇關(guān)于c語(yǔ)言結(jié)構(gòu)體的定義和使用的文章就介紹到這了,更多相關(guān)c語(yǔ)言結(jié)構(gòu)體定義和使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng)
如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng),本文介紹cspider爬蟲(chóng)庫(kù),這個(gè)cspider爬蟲(chóng)庫(kù)的使命在于,我們能夠使用c語(yǔ)言,依然能夠優(yōu)雅地編寫(xiě)爬蟲(chóng)程序,需要的朋友可以參考下2015-12-12c語(yǔ)言單詞本的新增、刪除、查詢(xún)按順序顯示功能
這篇文章主要介紹了c語(yǔ)言單詞本的新增、刪除、查詢(xún)按順序顯示功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C語(yǔ)言實(shí)現(xiàn)選擇排序、直接插入排序、冒泡排序的示例
這篇文章主要介紹了C++實(shí)現(xiàn)選擇排序、直接插入排序、冒泡排序的代碼示例,相當(dāng)簡(jiǎn)潔直觀,也是算法和數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)中的基礎(chǔ),需要的朋友可以參考下2016-02-02C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02基于Matlab實(shí)現(xiàn)嗅覺(jué)優(yōu)化算法的示例代碼
嗅覺(jué)劑優(yōu)化是一種新穎的優(yōu)化算法,旨在模仿氣味分子源尾隨的藥劑的智能行為。本文將利用Matlab實(shí)現(xiàn)這一智能優(yōu)化算法,需要的可以參考一下2022-05-05