结构体
一、为什么会出现结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。
例如描述一个班级的学生信息(学号、姓名、年级、性别。。。),单纯的基本数据类型变量很容易将张三的姓名匹配到李四的学号,不易区分。故使用结构体可满足。
二、结构体定义
类里面有属性和方法,结构体里只有属性。
用户根据实际需要自己定义的复合数据类型
三、使用1—普通结构体变量
1、定义结构体变量
//结构体
struct Student {
int sid;
char name[200];
int age;
};
2、创建结构体变量
数据类型(struct) 结构体名 变量名={赋值}
//创建结构体变量:数据类型 结构体名 变量名={赋值}
struct Student st ={1001,"aa",21};
3、访问结构体成员
结构体变量名.成员名
//访问结构体成员:结构体变量名.成员名
printf("%d %s %d\n",st.sid,st.name,st.age);
完整代码:
//结构体
struct Student {
int sid;
char name[200];
int age;
};
int main (void)
{
//定义结构体变量:数据类型 结构体名 变量名={赋值}
struct Student st ={1001,"aa",21};
//访问结构体成员:结构体变量名.成员名
printf("%d %s %d\n",st.sid,st.name,st.age);
return 0;
}
四、使用2—指针结构体变量
1、创建结构体变量
//指针结构体变量
struct Student *pst;
2、赋值
//赋值:pst指向st
pst=&st;
3、访问
结构体指针变量名->结构体成员名
//访问:pst->sid==>(*pst).sid==>st.sid
printf("sid=%d\n",pst->sid);
printf("sid=%d\n",(*pst).sid);
printf("sid=%d\n",st.sid);
//结构体
struct Student {
int sid;
char name[200];
int age;
};
int main (void)
{
//定义结构体变量:数据类型 结构体名 变量名={赋值}
struct Student st ={1001,"aa",21};
//访问结构体成员:结构体变量名.成员名
//printf("%d %s %d\n",st.sid,st.name,st.age);
//指针结构体变量
struct Student *pst;
//赋值:pst指向st
pst=&st;
//访问:pst->sid==>(*pst).sid==>st.sid
printf("sid=%d\n",pst->sid);
printf("sid=%d\n",(*pst).sid);
printf("sid=%d\n",st.sid);
return 0;
}
五、注意事项
- 结构体变量不能加减乘除,但可以相互赋值(st1=st2)
六、通过函数修改结构体变量的值
使用普通变量当参数时,占内存、耗时间,
参数为地址,不占用内存。
//结构体
struct Student {
int sid;
char name[200];
int age;
};
void fpst(struct Student *pst)
{
(*pst).age=22;
pst->sid=1002;
strcpy(pst->name,"xiaowang");
}
int main (void)
{
//定义结构体变量:数据类型 结构体名 变量名={赋值}
struct Student st ={1001,"aa",21};
//传参变量地址
fpst(&st);
//访问结构体成员:结构体变量名.成员名
printf("%d %s %d\n",st.sid,st.name,st.age);
return 0;
}
七、malloc动态创建、打印
#include <stdio.h>
struct Student {
int sid;
int age;
};
struct Student * CreateStudent(void);
void ShowStudent(struct Student *ps);
int main(void)
{
struct Student *ps;//定义一个指针变量
ps =CreateStudent();
ShowStudent(ps);
}
/*
创建链表
*/
struct Student * CreateStudent(void)
{
struct Student *p=(struct Student *)malloc(sizeof(struct Student));
p->sid=14;
p->age=22;
return p;
}
//遍历链表
void ShowStudent(struct Student *pst)
{
printf("%d %d",pst->sid,pst->age);
}