### 結構體介紹
C語言里可以在一個存儲區里記錄多個相關的數字,這種存儲區的類型叫結構體類型。
這種類型需要編寫專門的語句創建出來。
結構體類型的存儲區里包含多個子存儲區,每個子存儲區可以用來記錄一個數字。
結構體中不同子存儲區的類型可以不同,子存儲區也可能是結構體類型的存儲區。
結構體聲明語句用來創建結構體類型數據。
結構體聲明語句中需要使用struct關鍵字。
結構體聲明語句里包含多個變量聲明語句,這種變量叫做結構體的成員變量,每個成員變量代表一個子存儲區。
#include <stdio.h>
int main(){
struct person{
int age;
float height;
char name[10];
}
return 0;
}
成員變量聲明語句不會分配內存。
在C語言中結構體是不可以包含函數的。
結構體聲明語句可以放在任何地方包括頭文件里。
### 結構體變量
結構體類型可以用來聲明變量,這種變量叫做結構體變量。
結構體變量被分配了內存,它們才可以用來記錄數字。
聲明結構體變量的時候需要把struct關鍵字和結構體名稱一起作為類型名稱使用。
#include <stdio.h>
struct person{
int age;
float height;
char name[10];
}
int main(){
struct person prsn; //結構體變量聲明
return 0;
}
### typedef 關鍵字
typedef 關鍵字可以用來給一個數據類型起別名。
typedef通常會給結構體類型起別名,這個別名可以作為類型名稱使用。
可以把結構體類型聲明語句和起別名語句合并成一條語句。
#include <stdio.h>
typedef struct person{
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn;
return 0;
}
這個時候可以省略結構體本身的名稱。
#include <stdio.h>
typedef struct {
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn;
return 0;
}
### 結構體變量的初始化
結構體變量也應該初始化。
結構體變量的初始化方法和數組初始化一樣。
#include <stdio.h>
typedef struct person{
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn = {18, 1.68f, "lanyulei"};
return 0;
}
結構體變量通常不會作為整體使用,一般一次通常只使用其中的某個子存儲區。
可以采用如下寫在表示結構體內部的某個子存儲區:
prsn.age
其中prsn是結構體變量名稱,age是成員變量名稱
實例:
#include <stdio.h>
typedef struct person{
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn = {18, 1.68f, "lanyulei"};
printf("age = %d\n", prsn.age);
printf("height = %g\n", prsn.height);
printf("name = %s\n", prsn.name);
return 0;
}
同類型的結構體變量之間可以直接賦值。
#include <stdio.h>
typedef struct person{
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn2 = {0};
sperson prsn = {18, 1.68f, "lanyulei"};
prsn2 = prsn;
printf("age = %d\n", prsn2.age);
printf("height = %g\n", prsn2.height);
printf("name = %s\n", prsn2.name);
return 0;
}
### 結構體指針
結構體指針用來記錄結構體存儲區的地址。
當結構體指針和結構體存儲區捆綁后就可以采用以下方法通過結構體指針表示結構體的子存儲區。
p_person->age
其中p_person是一個結構體指針,age是一個成員變量的名稱。
實例:
#include <stdio.h>
typedef struct person{
int age;
float height;
char name[10];
} sperson;
int main(){
sperson prsn = {18, 1.68f, "lanyulei"};
sperson *p_person = &prsn;
printf("age = %d\n", p_person->age);
printf("height = %g\n", p_person->height);
printf("name = %s\n", p_person->name);
return 0;
}
### 結構體類型的形式參數
可以使用結構體類型的形式參數,從調用函數向被調用函數傳遞結構體數據,但是這樣做會浪費時間和空間。
直接傳遞結構體數據的例子:
#include <stdio.h>
typedef struct {
int row, col;
} pt;
void print(pt pt1){
printf("點的位置:(%d, %d)\n", pt1.row, pt1.col);
}
int main(){
pt pt1 = {0};
printf("請輸入一個點的位置:");
scanf("%d%d", &(pt1.row), &(pt1.col));
print(pt1);
return 0;
}
為了避免這種浪費,可以使用結構體指針形式參數。
傳遞結構體指針形式參數的例子:
#include <stdio.h>
typedef struct {
int row, col;
} pt;
void print(const pt *pt1){
printf("點的位置:(%d, %d)\n", pt1->row, pt1->col);
}
int main(){
pt pt1 = {0};
printf("請輸入一個點的位置:");
scanf("%d%d", &(pt1.row), &(pt1.col));
print(&pt1);
return 0;
}
聲明結構體指針形式參數的時候,盡量使用const關鍵字。
可以把結構體存儲區當返回值使用,這樣可以把結構體數據從被調用函數傳遞給調用函數。
#include <stdio.h>
typedef struct {
int row, col;
} pt;
pt read(void){
pt pt1 = {0};
printf("請輸入一個點的位置:");
scanf("%d%d", &(pt1.row), &(pt1.col));
return pt1;
}
int main(){
pt pt1 = read();
printf("點的位置: (%d, %d)\n", pt1.row, pt1.col);
return 0;
}
這個時候被調用函數需要提供一個結構體存儲區用來存放返回值。
這種直接傳遞數據的方式,也會造成時間和空間的浪費。
使用結構體存儲區可以避免這種情況,這個時候被調用函數需要提供一個結構體指針類型的存儲來存放返回值。
#include <stdio.h>
typedef struct {
int row, col;
} pt;
pt *read(pt *pt1){
printf("請輸入一個點的位置:");
scanf("%d%d", &(pt1->row), &(pt1->col));
return pt1;
}
int main(){
pt pt1 = {0}, *p_pt1 = NULL;
p_pt1 = read(&pt1);
printf("點的位置: (%d, %d)\n", pt1.row, pt1.col);
return 0;
}
不能把局部結構體存儲區的地址作為返回值。