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->结构体成员
发布了21 篇原创文章 · 获赞 44 · 访问量 1577

猜你喜欢

转载自blog.csdn.net/weixin_43964458/article/details/104543136