結構體【struct】數組
一.結構體定義數據結構
概念:結構體是由一系列不一樣或相同基本類型數據組合而成的新的複合數據集合,從而使這些數據項組合起來反應一個信息。ide
意義:結構體的使用爲處理複雜的數據結構(如動態數據結構等)提供了有效的手段,並且,它們爲函數間傳遞不一樣類型的數據提供了方便。函數
特色:spa
1.結構體類型是用戶自行構造的;.net
2.它由若干不一樣的基本數據類型的數據構成。指針
3.它屬於C語言的一種數據類型,與整型、實型至關。所以,定義它時不分配空間,只有用它定義變量時才分配空間。對象
4.結構體類型中的成員名能夠與程序中的變量名相同,二者並不表明同一對象,編譯程序可 以自動對他們進行區分。blog
結構體類型的定義:內存
通常形式
Struct 結構體名
{
數據類型 成員名1;
數據類型 成員名2;
……
};
①.先定義結構,再說明結構變量。這種是C語言中定義結構體類型變量最多見的方式。
Struct 結構體名
{
成員列表;
};
Struct 結構體名 變量名;
如:
[cpp] view plaincopy
1. struct Clerk //職工信息
2. {
3. long num;
4. char name[20];
5. int age;
6. };
7. struct Clerk p1,p2; //變量p1和p2同爲 Clerk結構類型。
也能夠用宏定義使一個符號常量來表示一個結構類型, 例如:
[cpp] view plaincopy
1. #define CLERK struct Clerk
2. CLERK
3. {
4. Long num;
5. char name[20];
6. int age;
7. };
8. CLERK p1,p2;
②.在定義結構類型的同時說明結構變量。這種形式的定義爲:
Struct 結構體名
{
成員列表;
} 變量名;
實例如:
[cpp] view plaincopy
1. struct Clerk
2. {
3. Long num;
4. char name[20];
5. int age;
6. } p1,p2;
③.直接說明結構變量。這種形式的定義爲:
Struct // 沒有結構體名
{
成員列表;
} 變量名;
例如:
[cpp] view plaincopy
1. struct
2. {
3. Long num;
4. char name[20];
5. int age;
6. } p1,p2;
二.結構體的大小:
一個結構體變量佔用內存的實際大小,能夠利用sizeof來求出。它的運算表達式爲:
Sizeof(運算量) //求出給定的運算量佔用內存空間的字節數
其中運算量能夠是變量、數組或結構體變量,能夠是數據類型的名稱。
例如:
Sizeof(struct clerk)
Sizeof(p1)
三.結構體類型嵌套
結構體類型中可包含以定義的結構體類型。
[cpp] view plaincopy
1. struct date{
2. int month;
3. int day;
4. int year;
5. } ;
6. struct Clerk
7. {
8. Long num;
9. char name[20];
10. struct date birthday;
11. } ;
變量定義:如:struct Clerk p1,p2;
成員引用:p1.num, p1.name,
P1.bd.year , p1.bd.month, p1.bd.day
初始化:struct clerk p={0017482, 「Li shan」,{1986,6,15}};
△注意:結構體類型和變量也有全局和局部之分
定義在全部函數以外的結構體類型(變量)稱爲全局(或外部)結構體類型(變量)。
定義在函數內部的結構體類型(變量)稱爲局部(或內部)結構體類型(變量)。
結構體類型通常定義爲全局的,定義位置通常在主函數以前。
結構體變量初始化時,初始值類型對應成員的數據類型一致,不然會出錯。
四.結構體變量的初始化
與其餘類型變量同樣,也能夠給結構的每一個成員賦初值,這稱爲結構體的初始化。一種是在定義結構體變量時進行初始化。語法格式以下:
Struct 結構體名 變量名={初始數據表};
另外一種是在定義結構體類型時同時進行結構體變量的初始化。
Struct 結構體名
{
成員列表;
}變量名={初始數據表}; 如:
[cpp] view plaincopy
1. struct Clerk
2. {
3. Long num;
4. char name[20];
5. struct date birthday;
6. } p1={0017482, 「Li shan」,{1986,6,15}};
還有一種是在main函數中進行初始化。
Struct 結構體名 變量名;
變量名.成員名 = 數值;
變量名.成員名 = 數值;
……
[cpp] view plaincopy
1. Struct clerk p2;
2. P2.num = 0017482;
3. P2.name =」 lishan」;
4. P2.birthday = {1986,6,15}};
五.結構體數組
§1.結構體數組的定義
**具備相同結構體類型的結構體變量也能夠組成數組,即爲結構體數組。結構體數組的每個數組元素都是結構體類型的數據,他們都分別包含各個成員項。
其定義形式以下:
Struct 結構體名
{
成員列表;
};
Struct 結構體名 數組名[元素個數];
[cpp] view plaincopy
1. Struct student
2. {
3. Char name[20];
4. Char sex;
5. Int age;
6. Char addr[20];
7. };
8. Struct student stu[3];
§2.結構體數組的初始化
Struct 結構體名
{
成員列表;
};
Struct 結構體名 數組名[元素個數]={初始數據表};
OR
Struct 結構體名
{
成員列表;
} 數組名[元素個數]={初始數據表};
§3.結構體數組的使用
一個結構體數組的元素至關於一個結構體變量,所以有關結構體變量的規則也適用於結構體數組的元素。
⑴.引用某一元素中的成員。
如要引用數組第一個元素的name成員,則可寫爲:
stu[1].name
⑵.能夠將一個結構體數組元素賦值給同一結構體類型的數組的另外一個元素,或賦給同一類型的變量,如:
Struct student stu[3] , student1;
如今定義了一個結構體類型的數組,它有3個元素,又定義了一個結構體類型變量student1,
則下面的賦值是合法的。
Student1 = stu[0];
Stu[0] = stu[1];
Stu[1] = student1;
⑶.不能把結果體數組元素做爲一個總體直接進行輸入輸出。如:
Printf(「.......」,stu[0]);
scanf(「.......」,&stu[0]);
都是錯誤的。
只能是以單個成員爲對象進行輸入輸出,如:
scanf(「.......」,&stu[0].name);
scanf(「.......」,&stu[0].num);
Printf(「.......」,stu[0].name);
Printf(「.......」,stu[0].num);
六.結構體指針
△1.指向結構體變量的指針
結構體變量所佔內存的首地址稱爲結構變量的指針。
結構體指針變量的定義:
Struct結構體名稱*結構體指針變量名;
例如
[cpp] view plaincopy
1. Struct clerk
2. {
3. Long num;
4. Char name[20];
5. Struct data bd;
6. }a,*pa;
例如:
[cpp] view plaincopy
1. struct clerk b,*pb;
注意:結構體指針變量必須先賦值後使用。
△2.結構體指針變量賦初始值
將結構體變量的首地址賦給指針變量,如:
Struct clerk a,*pa=&a;
Struct clerk b,*pb;
pb=&b;
△3.經過結構體指針變量引用結構體成員
通常形式:(*指針變量).成員名
如:(*pa).num=10; 等價於 a.num=10;
Get((*pa).name); 等價於 get(a.name);
(*pa).bd.year=1986; 等價於 a.bd.year=1982;
△4.指向運算符:「->」直觀地引用結構體成員。
例如:上例可改寫爲:
pa->num=10; get(pa->name);pa->bd.year=1986;
△5.指向結構體數組的指針
#結構體數組的首地址,稱爲結構體數組的指針。例如
[cpp] view plaincopy
1. Struct clerk
2. {
3. Int num;
4. Char name[20];
5. Struct date birthday;
6. }a[3],*p;
或:struct clerk a[3],*p;
P=a;
則:p->a[0];p+1->a[1];p+2->a[2];
#經過指針訪問數組元素的成員:
P->num=10; 等價於 a[0].num=10;
scanf(「%s」,p->name); 等價於 scanf(「%s」,a[0].name);
若是:p++;則 p->a[1];
p->num=10; 等價於 a[1].num=10;
[cpp] view plaincopy
1.
2. /* 應用舉例:利用指向結構體的數組的指針輸出結構體數組*/
3. struct clerk
4. {
5. int num;
6. char name[20];
7. int age;
8. char addr[40];
9. };
10. int main()
11. {struct clerk *p, a[3]={{101,"zhangsan",26,"shanghai"},
12. {102,"lishan",27,"hubei"},
13. {103,"wangwu",28,"changsha"}};
14. int i;
15. for(i=0,p=a; i<3;i++,p++)
16. printf("%d,%s,%d,%s\n",p->num,p->name,p->age,p->addr);
17. }
18.
七.如何取出結構體變量中的每個成員?
總結三種方法:①.結構體變量.成員名
②.(*指針變量).成員名
③.結構體變量—>成員名
八.結構體變量和結構體指針變量做爲函數參數傳遞的問題。
#結構體變量作函數參數
[cpp] view plaincopy
1. struct clerk
2. {
3. int num;
4. char name[20];
5. int age;
6. char addr[40];
7. };
8. void func(struct clerk a);
9. int main(void)
10. {
11. struct clerk a={101,"zhangsan",26,"shanghai"};
12. func(a);
13. }
14. void func(struct clerk b)
15. {
16. printf("%d,%s,%d,%s\n",b.num,b.name,b.age,b.addr);
17. }
#結構體指針做函數參數:賦地址傳遞
[cpp] view plaincopy
1. struct clerk
2. {
3. int num;
4. char name[20];
5. int age;
6. char addr[40];
7. };
8. void output(struct clerk*p);
9. int main(void)
10. {
11. struct clerk*p,a[3]={{101,"zhangsan",26,"shanghai"},
12. {102,"lishan",27,"hubei"},
13. {103,"wangwu",28,"changsha"}};
14. p=a;
15. output(p);
16. }
17. void output(struct clerk *p)
18. {
19. int i;
20. for(i=0;i<3;i++,p++)
21. printf("%d,%s,%d,%s\n",p->num,p->name,p->age,p->addr);
22. return 0;
23. }
結構體變量做爲函數參數數據傳遞方式是賦值傳遞(單向值傳遞),實參把它每個的成員的值依次傳遞形參,運行時間與存儲空間的開銷很大,程序運行效率很低。實際應用中,通常使用結構體指針做爲函數參數。