今天萌新博主與大家一起了解C語言中指針與結構體部分
【我們爲什麼要使用結構體?】
假如我們要設計一個員工管理系統,一共有100名員工,我們需要記錄每一個員工的姓名,性別,職位,地址,電話號碼等相關信息,如果我們逐一去申請變量,那麼我們需要用到600個變量,顯然不好操作;那我們如果定義數組,顯然也是不可採取的,因爲定義每一個員工中需要用到數據的類型都各不相同。那我們怎麼辦呢?
爲了方便處理數據,結構體就是把一些相關的,類型不同的子項數據結合在一起,結構體實際上是一種自定義的數據類型,可以包含若干個數據類型相同或者不同的數據項。
簡單的來說,結構體可以將多個單一的數據結合在一起,方便處理數據
【定義結構體】
struct 結構體名 {
數據類型 結構體成員;
} 結構體變量名(可選);
來個例子吧!
struct person_info{//描述人的信息,struct一定不能丟
char name[];
int age;
char add[];
...
}Rual,Kobe;//可以定義結構體變量,也可以不定義
結構體的成員可以是人員類型,也可以包括其他結構體
struct person_infor
{
char name[];
int age;
char job[];
char add[];
long int phone;
struct date time;//結構體的成員可以是其他結構體,但是必須提前定義好
};
我們可以根據結構體來定義結構體變量:
struct person_info{
char name[];
int age;
char add[];
...
};
struct employee_infor Kobe;//定義變量Kobe
struct employee_infor Gasol;//定義變量Gasol
注意:
1.我們在定義結構體與結構體變量時,struct一定不能丟,函數體必須在函數體外定義,也可以把結構體定義在頭文件中,然後在程序中用#include包含。
2.定義結構體必須在函數體外,使用結構體的時候必須在函數體外。
來個例子吧!估計大家又聽不懂了
#include <stdio.h>
struct pe_info//定義結構體
{
char name[100];//切記不要初始化變量
int age;
char add[100];
};//注意;表示定義結束
int main(void)
{
//pe_info Kobe;這樣定義變量是錯誤的
//pe_info Gasol;這樣定義變量是錯誤的
struct pe_info Kobe={"Kobe",37,"Lakers"};//賦值
struct pe_info Gasol={"Gasol",35,"bull"};
//加上struct是爲了區分普通變量
//訪問Kobe的姓名
printf("struct pe_for Kobe lst mem %s\n",Kobe.name);
printf("struct pe_for Gasol lst mem %s\n",Gasol.name);
return 0;
}
運行結果:
如何訪問結構體的成員?
形式:結構體變量名.成員
我們在初始化結構體變量的時候,也可以用typedef
,去簡化結構體變量名。
我們來看一段代碼:
我們用pinf
來簡化struct pe_info
;與上面代碼的效果是一樣的。
#include <stdio.h>
typedef struct pe_info//定義結構體
{
char name[100];//切記不要初始化變量
int age;
char add[100];
}pinf;//注意;表示定義結束
int main(void)
{
//pe_info Kobe;這樣定義變量是錯誤的
//pe_info Gasol;這樣定義變量是錯誤的
pinf Kobe={"Kobe",37,"Lakers"};//賦值
pinf Gasol={"Gasol",35,"bull"};
//加上struct是爲了區分普通變量
//訪問Kobe的姓名
printf("struct pe_for Kobe lst mem %s\n",Kobe.name);
printf("struct pe_for Gasol lst mem %s\n",Gasol.name);
return 0;
}
運行結果:
我們再來個例子:給結構體賦值並輸出結構體
#include <stdio.h>
typedef struct pe_info//定義結構體
{
char name[100];//切記不要初始化變量
int age;
char add[100];
}pinf;//注意;表示定義結束
int main(void)
{
//pe_info Kobe;這樣定義變量是錯誤的
//pe_info Gasol;這樣定義變量是錯誤的
pinf Kobe={"Kobe",37,"Lakers"};//賦值
pinf Gasol={"Gasol",35,"bull"};
//加上struct是爲了區分普通變量
//訪問Kobe的姓名
printf("struct pe_for Kobe lst mem %s\n",Kobe.name);
printf("struct pe_for Kobe 2st mem %d\n",Kobe.age);//注意年齡是int整型
printf("struct pe_for Kobe 3st mem %s\n",Kobe.add);
printf("\n");
printf("struct pe_for Gasol lst mem %s\n",Gasol.name);
printf("struct pe_for Gasol 2st mem %d\n",Gasol.age);
printf("struct pe_for Gasol 3st mem %s\n",Gasol.name);
return 0;
}
運行結果:
那麼結構體在內存中是怎麼處理的呢?
我們看下面的結構體:
struct date_typ{
int a;
char b;
double c;
}tt;
int a——4個字節
char b——1個字節
double c——16個字節
所以結構體總長度爲4+1+16=21字節;
【結構體數組】
結構體數組和基本數組定義方法相同
先定義結構體,再聲明結構體數組
typedef struct pe_infor{
char name[SIZE];
int age;
char team[SIZE];
}pe_info;
pe_info pers[30];//聲明一個數組,包含30個元素
我們用結構體數組來寫個程序:輸入5個同學的學號,姓名和成績:
#include <stdio.h>
typedef struct stu_info//定義結構體
{
int id;
char name[100];
int score;
}s_inf;
int main(void)
{
s_inf stu[5];//定義一個長度爲5的結構體數組
for(int i=0;i<5;i++)//循環輸入學生信息
{
printf("input %d stu_name:",i+1);//姓名
scanf("%s",&stu[i].name);
printf("input %d stu_id:",i+1);//學號
scanf("%d",&stu[i].id);
printf("input %d stu_score:",i+1);//分數
scanf("%d",&stu[i].score);
printf("\n");
}
return 0;
}
運行結果:
【指向結構體的指針】
typedef struct pe_infor{
char name[SIZE];
int age;
char team[SIZE];
}pe_info;
pe_info *p;//賦值
p=&pe_info;
結構體指針一般用->
符號來引用變量
pe_info *p=NULL;//定義結構體類型的指針,分別引用結構體成員
p->name;等價於(*p).name;
p->age;等價於(*p).age;
p->team;等價於(*p).team;
//指向結構體的指針p->結構體成員