C语言——结构体

目录

一,什么是结构体

二,如何定义结构体

三,如何使用结构体变量

1.结构体变量的赋值和初始化

2.如何取出结构体变量中的每一个成员

3.通过函数对结构体变量进行输入和输出 

4.结构体变量的运算


一,什么是结构体

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。把一些基本数据类型组合到一起形成的一个新的复合数据类型,结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型,以方便日后的使用。

什么时候我们需要使用结构体呢

在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。例如一个学生的信息就需要成绩(浮点型),性别(字符),年龄(整形)等等。这些数据类型都不同但是他们又是表示一个整体,要存在联系,那么我们就需要一个新的数据类型。

#include<stdio.h>
int main (void)
{
	int age;
	float score;
	char sex;
	int age2;
	float score2;
	char sex2;
	
	return 0;
} 

上方程序定义了两个学生的成绩,年龄,性别,但我们所希望的是有一个变量可以同时储存一个学生的成绩,年龄,性别(均为基本类型变量),因为当同时定义多个学生的上方信息时,由于它并不是一个有机整体,可能会导致输入信息的错乱(例如:同学1的年龄可能会和同学2的成绩可能会放入同一个整体),为了表示一些复杂数据,而基本类型变量无法满足我们的需求,这时就需要定义一个结构体。

二,如何定义结构体

定义结构体相当于定一个一个新的数据类型,而不是在定义变量。

第一种方式(推荐):

struct student
{
	int age;
	float score;
	char sex;
};

第二种方式:

在定义结构体数据类型的同时,定义变量名,但这个只能定义一次,第二次想使用结构体时就会出问题。

struct student
{
	int age;
	float score;
	char sex;
}st;

第三种方式:

这种方式也可以定义结构体,但是未说明数据类型名,后续使用会不方便。

struct 
{
	int age;
	float score;
	char sex;
}st;

如上我们使用第一种方式定义了一个struct student数据类型,他其中就包括一个学生的成绩,年龄,性别这三个基本变量,在主函数中,我们就可以使用这个结构体数据类型来定义变量。

末尾分号不要省!!!

三,如何使用结构体变量

在学会定义结构体变量后,就要懂得如何让使用结构体变量,下面从四个方面来介绍如何使用结构体变量:

1.结构体变量的赋值和初始化

1)定义的同时赋初值

struct student st={18,66.6,'F'};

2)先定义变量,再对变量中的元素一一赋值

	struct student st2;
	st2.age =10;
	st2.score =88;
	st2.sex ='F';

2.如何取出结构体变量中的每一个成员

 在定义完结构体变量后编译后才可以使用结构体变量中的成员

1)结构体变量名.成员名

 2)指针变量名->成员名

使用第二种方式,必须定义一个指针变量

struct student *pst = &st;//pst只能存放struct student结构体变量的地址

pst->age在计算机内部会被转化成(*pst).age,所以pst->age等价于(*pst).age

pst->age的含义是:pst所指向的结构体变量中的age这个成员

3.通过函数对结构体变量进行输入和输出 

我们用一个程序来认识这个知识点吧

#include <stdio.h>
#include <string.h>

void Inputstudent(struct student *pstu);
void Outputstudent(struct student ss);
struct student
{
	int age;
	char sex;
	char name[100];
};//分号不可省 
int main (void)
{
	struct student st;
	Inputstudent(&st);//对结构体变量输入 必须发送st地址,要修改储存在st变量地址中的值 
	//printf ("%d\n",sizeof(st));
	//printf ("%d %c %s",st.age ,st.sex ,st.name );
	Outputstudent(st);//对结构体变量输出 可以发送st的地址,也可以直接发送st的内容  只输出不修改 
	                  //为了减少内存消耗,也为了提高执行速度,建议发送地址 
	
	return 0;
}
void Outputstudent(struct student ss)
{
	printf ("%d %c %s",ss.age ,ss.sex ,ss.name );
}
void Inputstudent(struct student *pstu)
{
	(*pstu).age =10;
	strcpy(pstu->name ,"张三");
	pstu->sex ='F'; 
}

在编写 Inputstudent ()函数时,要想在函数内部修改 st 变量的值,需要发送 st 变量的地址,才可以完成对 st 变量值的修改,例如下方 Inputstudent()函数,就不可以改变 st 变量的值

void Inputstudent(struct student stu)
{
	stu.age =10;
	strcpy (stu.name ,"张三");//不能写成 stu.name='张三';(字符串处理) 
	stu.sex ='F'; 
}

4.结构体变量的运算

结构体变量不能想加,不能相减,也不能相互乘除,但是结构体变量可以相互赋值