結(jié)構(gòu)體(struct)(C語言)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中聚合數(shù)據(jù)類型(aggregate data type)的一類。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、聶拉木網(wǎng)絡(luò)推廣、小程序設(shè)計、聶拉木網(wǎng)絡(luò)營銷、聶拉木企業(yè)策劃、聶拉木品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供聶拉木建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
結(jié)構(gòu)體的定義中,struct為結(jié)構(gòu)體關(guān)鍵字,tag為結(jié)構(gòu)體的標(biāo)志,member-list為結(jié)構(gòu)體成員列表,其必須列出其所有成員;variable-list為此結(jié)構(gòu)體聲明的變量。
結(jié)構(gòu)體(c語言)的作用:
結(jié)構(gòu)體和其他類型基礎(chǔ)數(shù)據(jù)類型一樣,例如int類型、char類型,只不過結(jié)構(gòu)體可以做成你想要的數(shù)據(jù)類型。以方便日后的使用。
在實際項目中,結(jié)構(gòu)體是大量存在的。研發(fā)人員常使用結(jié)構(gòu)體來封裝一些屬性來組成新的類型。由于C語言內(nèi)部程序比較簡單,研發(fā)人員通常使用結(jié)構(gòu)體創(chuàng)造新的“屬性”,其目的是簡化運算。
結(jié)構(gòu)體在函數(shù)中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關(guān)心這個是什么,只要根據(jù)定義使用就可以了。
STU??f?(STU??a)
{ ?STU??b={"Zhao",?'m',?85,?90};
int??i;
strcpy(?a.name,?b.name?);
a.sex?=?b.sex;
for?(?i=0;?i2;?i++?)??a.score[i]?=?b.score[i];
以上是將b中的數(shù)據(jù)賦值給a,相當(dāng)于a=b;這樣的一個操作
return??a;?
}
main()
{ ?STU??c=?{?"Qian",?'f',?95,?92?},?d;
d?=?f(c);//這里傳的c是個復(fù)制品(傳遞的不是結(jié)構(gòu)體指針),所以c不會變,d接收f()函數(shù)的返回值,因為返回值的內(nèi)容是f()中的b的值,所以,d與c不同
printf?("%s,%c,%d,%d,?",?d.name,?d.sex,?d.score[0],?d.score[1]);
printf?("%s,%c,%d,%d\n",?c.name,?c.sex,?c.score[0],?c.score[1]);
}
輸出結(jié)果為:A)??Zhao,m,85,90,?Qian,f,95,92
一個程序通常圍繞這兩個方面進行:數(shù)據(jù)存儲和數(shù)據(jù)操作;
結(jié)構(gòu)體是一種數(shù)據(jù)類型,用來將不同類型的數(shù)據(jù)組合在一起,決定數(shù)據(jù)的存儲問題(比如在內(nèi)存占多大的空間來,系統(tǒng)怎么解釋存儲數(shù)據(jù)的位數(shù)據(jù)啦等等)同int, double 等編譯器內(nèi)置的數(shù)據(jù)類型基本相同,只不過結(jié)構(gòu)體是用戶自己定義的數(shù)據(jù)類型而已,例如:
struct student
{
char name[20];
int NO;
};
函數(shù)是對數(shù)據(jù)的一種操作;
c語言的結(jié)構(gòu)體是一組數(shù)據(jù)的組合,并不是簡單的單一類型。所以在查找和輸出的時候,均不能直接操作,而是要進行變通。
1
查找。
對于以某一項為關(guān)鍵字進行查找時,比如在結(jié)構(gòu)體中有int型的成員a,要查找a為100的結(jié)構(gòu)體變量,這時需要遍歷每個結(jié)構(gòu)體(數(shù)組、鏈表、或者其它任意形式),對每個元素的成員a值進行比較,符合的則表示查找成功。
對于結(jié)構(gòu)體中元素較多,同時要對整個結(jié)構(gòu)體每個元素都匹配才算查找到的特殊情況,可以使用memcmp的方式,整體進行比較,以減少代碼量。不過這種情況較為少見,不過多描述。
2
輸出。
對于結(jié)構(gòu)體的輸出,其實就是對其每一項,或者若干項成員變量的輸出。
所以可以使用基本的輸出函數(shù),對每一項單獨輸出,輸出中為了方便閱讀,可以加一些說明文字。
如果對結(jié)構(gòu)體輸出有多處調(diào)用的需求,可以在將該功能封裝為函數(shù),供各個需要的函數(shù)調(diào)用。這樣的好處是,當(dāng)結(jié)構(gòu)體的成員出現(xiàn)變化,或者結(jié)構(gòu)體輸出要求更改時,修改一處代碼即可完成所有的輸出修改,實現(xiàn)易于維護的效果。
如果在結(jié)構(gòu)體定義時,或定義后取了別名,可以用別名,否則不能省“struct”
如:typedef
struct
Teacher
TEACHER;
則可以用TEACHER
代替struct
Teacher
C語言的結(jié)構(gòu)體沒有存取控制權(quán)限,相當(dāng)于C++存取控制權(quán)限中的public:
追問:
那struct
Teacher
*creat(struct
Teacher
*head);
和Teacher
*creat(struct
Teacher
*head);
一樣嗎?如果不一樣的話有什么區(qū)別呢?
追答:
是一樣的,struct
Teacher
和Teacher只是同一東西的兩種不同寫法。
void f(A c) /* 注意:c結(jié)構(gòu)變量名 但這個c也是個復(fù)制品,與原實參只是一樣的內(nèi)容,卻不是同一個!! */ 所以結(jié)果還是a={1,2}; 答案為B