C語言回顧——指針與結構體

今天萌新博主與大家一起了解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->結構體成員
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章