- 为什么需要结构体
- 避免过度重复,模拟复杂事务,将基本类型组合在一起(相关信息整合在一起)。
- 什么是结构体
根据实际需要,把一些基本类型组合而形成的新的数据类型,这个叫做结构体
长相:学生信息:
struct student
{
int age;
double height;
char sex;
}
三、定义结构体
1.#include<stdio.h>
//第一种方式:先定义,在主函数中写变量名
struct student {
int age;
double height;
char sex;
};
//定义时写变量名
struct student2 {
int age;
double height;
char sex;
}st2;
//第三种方式
struct {
int age;
double height;
char sex;
}st3;
int main() {
struct student st = { 12,1.73,'f' };
}
推荐使用第一种方式定义结构体
四、如何使用结构体
1.赋值和初始化
定义的同时可以整体赋值
如果定义完之后,只能单个赋值
- 如何取出结构体变量中的每一个成员
第一种方式:
结构体变量名.成员名
st.age
第二种方式:指针变量名->成员名
指针型:struct *pst = &st
psr->age;计算机内部会转化为(*pst).age,一种硬性规定。也等价于st2.age
- 结构体变量的运算
不能相互加减,不能相互乘除,但可以相互赋值
for example:
struct student st1;
struct student st2;
//错误:st1 +st2,st1-st2,st1/st2,st1*st2
//正确:st1 = st2
- 结构体变量和结构体变量指针作为函数参数传递的问题
推荐使用结构体指针变量作为函数参数来传递
举例:动态构造存放学生信息的结构体数组
#include<stdio.h>
#include<stdlib.h>
struct Student {
int age;
float score;
char name[100];
};
void f(struct Student** p,int n);
void g(struct Student** p,int len);
int main()
{
int len;
printf("input len:");
scanf_s("%d", &len);
struct Student* a = (struct Student*)malloc(len * sizeof(struct Student));
if (a == NULL) {
return 0;
}
f(a,len);
free(a);
a = NULL;
}
void f(struct Student* p,int len) {
int i = 0;
for (i; i < len; i++)
{
printf("input age:");
scanf_s("%d", &p[i].age);
printf("input score:");
scanf_s("%f", &p[i].score);
printf("input name:");
scanf_s("%s", p[i].name,100);
}
g(p, len);
}
void g(struct Student* p,int len)
{
int i = 0;
for (i; i < len; i++)
{
printf("age:%d\n", p->age);
printf("score:%.2f\n", p->score);
printf("name:%s\n", p->name);
}
}