# 結構、指標與陣列
## 結構
### 結構宣告與存取
用來建立資料的集合可將不同資料型態的資料組成一組新的資料型態。
宣告方式:
```cpp=
struct 結構名稱
{
資料型態 結構成員1;
資料型態 結構成員2;
};
```
範例
```cpp=
struct student
{
char name[10];
int score;
int ID;
};
```
也可以在定義完結構後同時宣告建立結構變數
```cpp=
struct student
{
char name[10];
int score;
int ID;
}s1,s2;
```
設定結構成員範例(使用strcpy來複製字串),使用【.】來存取裡層結構物件
```cpp=
strcpy(s1.name,"Ricky");
s1.score = 90;
s1.ID = 10001;
```
也可以透過,來賦值
```cpp=
struct student
{
char name[10];
int score;
int ID;
};
int main(){
student s1 = {"Ricky",100,10001};//在C語言中必須要在student前面打上struct
}
```
假設結構變數有兩個一樣的話可以用這個方式給予
```cpp=
struct student
{
char name[10];
int score;
int ID;
}s1,s2;
strcpy(s1.name,"Ricky");
s1.score = 90;
s1.ID = 10001;
s2 = s1;
```
### 巢狀結構
```cpp=
struct 結構名稱 1
{
資料型態 結構成員1;
資料型態 結構成員2;
};
struct 結構名稱 2
{
struct 結構名稱 1 變數名稱;
```
以下為例,定義member結構,並使用原先定義好的name結構中宣告member_name成員定義m1結構變數
```cpp=
struct name{
char first_name[10];
char last_name[10];
};
struct member
{
struct name member_name;
char ID[10];
int salary;
}m1={{"Ricky","Chen"},"L1234567890",100000};
```
也可以這樣表示
```cpp=
struct member
{
struct {
char first_name[10];
char last_name[10];
}member_name;
char ID[10];
int salary;
}m1={{"Ricky","Chen"},"L1234567890",100000};
```
### 結構陣列
一般資料型態可以宣告為陣列,儲存相同的資料型態集合,結構則可以集合不同的資料型態
```cpp=
struct student
{
char name[10];
int math;
int english;
};
struct stduent class1[5];
```
舉例
```cpp=
#include<iostream>
#include <cstdlib>
using namespace std;
int main()
{
struct student
{
char name[10];
int math;
int english;
};//define
struct student class1[3]={{"Ricky",100,100},{"May",100,100},{"Cheryl",100,100}};
float math_Ave=0,english_Ave=0;
for(int i=0;i<3;i++)
{
math_Ave=math_Ave+class1[i].math;
english_Ave=english_Ave+class1[i].english;
cout<<"Name:"<<class1[i].name<<"Math:"<<class1[i].math<<"English:"<<class1[i].english<<endl;
}
cout<<"----------------------"<<endl;
cout<<"math_Ave:"<<math_Ave/3<<"english_Ave:"<<english_Ave/3<<endl;
return 0;
}
```
以下範例說明結構陣列中的陣列資料成員宣告,以字串陣列與字串還有整數變數為例
```cpp=
#include<iostream>
#include <cstdlib>
using namespace std;
int main()
{
struct mlb
{
char name[3][10];
char title[10];
int age;
};
struct mlb member_name[3]={{"Cole","Severino","Stanton","Yankees",30},{"Kershaw","Buehler","Betts","Dodgers",33},{"Trout","Rendon","Ohtani","Angles",31}};
for(int i=0;i<3;i++)
{
cout<<member_name[i].title<<'\t';
cout<<endl<<"----------------------"<<endl;
}
for(int i=0;i<3;i++)
{
cout<<member_name[i].name[0]<<'\t'<<member_name[i].name[1]<<'\t'<<member_name[i].name[2];
cout<<endl;
}
cout<<"----------------------"<<endl;
return 0;
}
```
### 結構指標
```cpp=
struct 結構名稱 * 結構變數名稱;
```
宣告好結構型態跟指標後才能存取奇指標變數成員
```cpp=
結構變數名稱 = &結構變數名稱;
```
範例
```cpp=
struct student
{
char name[10];
int age;
}m1;
struct member * ptr;
ptr = &m1;
```
要存取結構指標的資料成員就必須使用存取運算子(pointer member access operator)【->】來存取,或是用指標配合【.】也可以。
```cpp=
結構指標->結構成員名稱;
(* 結構指標).結構成員名稱;
ptr->name;
ptr->age;
(*ptr).name;
(*ptr).age;
```
這邊基本上就會出現一些面試考題了,一定要弄熟
```cpp=
#include<iostream>
#include<cstdlib>
using namespace std;
struct Test
{
int Age;
char Name[20];
};
int main()
{
Test T1[3]={{28,"Ohtani"},{28,"Severino"},{30,"Betts"}};
Test * pt2 = T1;
for(int i=0;i<3;i++){
cout<<pt2->Age<<''\t';
cout<<pt2->Name;
cout<<endl;
pt2++;
}
return 0;
}
```
## 指標與陣列
https://openhome.cc/Gossip/CGossip/PointerAndArray.html