陣列是一種資料形式,其特點是多個相同型別的元素集合起來
結構體是另一種重要的資料形式,特點是將不同型別的成員組合起來
陣列和結構體形成了兩種風格迥異的聚合方式,通過他們以及相互組合,巢狀的機制可以構造出複雜的,滿足應用要求的自定義資料型別
結構體允許將不同型別的資料元素組合到一起形成一種新的資料型別,其宣告形式為:
struct 結構型別名
;
例如可以通過如下宣告建立表示學生資訊的資料型別
struct student
1.結構體型別宣告
結構體型別宣告一般放在程式檔案開頭,此時這個宣告是全域性的。
在全域性作用域內,該宣告處處可見,因此同作用域內的所有函式都可以使用它。
結構體型別宣告也可以放到函式內部,此時這個宣告是區域性的。
說明:(1)結構體型別和普通資料型別一樣(如int,char,double等)一樣是型別名稱,而不是該型別的乙個實體,因此不會為結構體型別分配儲存空間
(2)結構體型別宣告成員時成員可以又是結構體型別
2.結構體型別例項化
定義結構體物件稱為結構體型別例項化,例項化會根據資料型別為結構體物件分配記憶體單元
定義結構體物件有兩種形式:
(1)先宣告結構體型別再定義物件
結構體型別名 結構體物件名列表
student a,b;
//定義結構體物件
(2)宣告結構體型別的同時定義物件
一般形式:結構體型別名 結構體物件名列表;
date d1,d2;
//定義結構體物件
3.結構體物件的記憶體形式
struct staff
;
staff s1 =
,2700.0
};
4.結構體物件成員引用
使用結構體物件主要是引用它的成員,其中一般形式為:結構體物件名.成員名
staff a,b;
a.id =
1002
;//將1002賦值給a物件中的id成員
b.salary = a.salary +
500.0
;//在表示式中引用物件成員
a.id++
;//按優先順序等於(a.id)++
(1)如果成員本身又是乙個結構體物件,就要用成員引用運算子,一級一級地引用。例如:
staff x;
x.birthday.year =
1990
;//逐級引用成員
(2)不能將乙個結構體物件作為整體進行輸入或者輸出,只能對結構體物件成員逐個進行輸入或輸出,例如:
staff x;
cin>>x.id>>x.***>>x.salary;
cin>>x.name;
(3)結構體物件可以進行賦值運算,但不能進行算術運算,關係運算等,例如:
complex m,n,k;
m = n;
//正確,結構體物件允許賦值
k = m+n;
//錯誤,結構體物件不能做算術運算
m > n;
//錯誤,結構體物件不能做關係運算
1.結構體與陣列
陣列元素可以是結構體型別,稱為結構體陣列,如一維結構體陣列定義形式為:
sturct 結構體型別名 結構體陣列名[常量表示式];
struct point
;point points[
100]
;//表示100個點的資料物件
一維結構體陣列初始化形式為:
struct 結構體型別名 結構體陣列名[常量表示式】 = ;
其中初值序列必須按記憶體形式做到型別,次序一一對應。
struct rect
;rect rect[2]
=,};
引用結構體陣列成員需要將下標運算,物件成員引用運算結合起來操作,其一般形式為:
陣列物件[下標表示式].成員名
結構體型別中包含陣列成員,陣列成員型別既可以是基本資料型別,又可以是指標型別,或者結構體型別。
例如表示平面三角形的資料物件,可以這樣定義:
struct ********
;
******** tri;
tri.p[0]
.x=10
,tri.p[0]
.y=10
;//結構體物件.陣列成員[下標表示式].成員名
2.結構體與指標
例如:
staff m;
//結構體物件
int*p1;
//指向id成員的指標型別是int*
char
*s1,
*s2;
//指向name,***成員的指標型別是char*
date *p2;
//指向birthday成員的指標型別是date*
p1 =
&m.id;
//取id成員的位址
s1 = m.name;
//name的成員是字元陣列,陣列名即是位址
s2 =
&m.***;
//取***成員的位址
p2 =
&m.birthday;
//取birthday成員的位址
例如:
struct staff m,
*p;//指向結構體物件的指標
p =&m;
//取結構體物件的位址
假設p是指向結構體物件的指標,通過p引用結構體物件成員有兩種方式:
(1)物件法:(*p).成員名
(2)指標法: p->成員名
p-
>id=
1002
;//將1002賦值給物件中的id成員,指標成員引用運算結果是左值(即成員本身)
p->salary = p-
>salary+
500.0
;//在表示式中引用指標指向的成員
p->id++
;//按優先順序等價於(p->id)++
如果成員本身又是乙個結構體物件指標,就要用指標引用運算子一級一級的引用成員。
例如:
data d =
;teacher a=
,*p=
&a;
p-
>id =
1001
;//通過指標p引用a的id成員
p->pbirthday-
>year =
2008
;//通過指標p->pbirthday引用d的year成員
3.結構體與函式
將結構體物件作為函式實參傳遞到函式中,採用值傳遞方式
例如:
struct data
;void
fun1
(data x)
;//函式原型
void
fun2()
;fun1
(a);
//函式呼叫
}
將結構體陣列作為函式引數,採用位址傳遞方式,函式呼叫實參是陣列名,形參必須是同型別的結構體陣列。
例如:
void
fun3
(data x)
;//函式原型
void
fun4()
;fun3
(a);
//函式呼叫
}
採用位址傳遞方式,形引數組的首位址與實參陣列完全相同
將結構體指標作為函式引數,採用位址傳遞方式
例如:
void
fun5
(data *p)
;//函式原型
void
fun6()
;fun5
(&a)
;//函式呼叫
}
函式的返回型別可以是結構體原型,這時函式將返回乙個結構體物件
例如:
data fun8()
;return a;
//返回結構體物件,複製到臨時物件中
}void
fun9()
自定義資料型別 結構型別
c 中自定義資料型別還有一種稱為結構型別,並且把該型別的各種資料型別一一整合到其中。學號 型別 姓名 字串 學生年齡 整型 院系 字串 平均成績 浮點型 每個學生的資訊成為了乙個整體,雜亂的資料和每個學生一一對應了起來,方便管理。如果需要建立學生型別,就可以這樣寫。include using nam...
C C 學習 自定義資料型別(結構體,共用體)
struct student 1 結構體型別宣告一般放在程式檔案開頭,此時這個宣告是全域性的。在全域性作用域內,該宣告處處可見,因此同作用域內的所有函式都可以使用它。2 結構體型別的宣告也可以放在函式內部,此時這個宣告是區域性的。說明 1 結構體型別和普通資料型別 eg int char doubl...
自定義型別 結構體
struct tag 結構體型別名稱 variable list 結構體變數 省略結構體型別名稱 匿名結構體型別 當省略掉結構體型別名稱時,就不能省略掉結構體變數,這樣是不合理的,所以一般我們不建議省略結構體型別名 struct x,y 全域性變數 struct a 20 p int main 注意...