为什么会出现结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。
例如:
如果使用普通类型变量表示学生:
int sid; //学号
char name[200]; //姓名
int age; //年龄
使用普通变量,我们需要定义大量的基本类型来表示不同学生的学号、姓名、年龄,数据容易搞混。
使用结构体,可以很方便的表示一个学生:
struct strdent {
int sid;
String name;
int sage;
};
结构体和 java 中的类很像,只不过结构体中没有方法:
class strdent { //类的关键字为 class
int sid;
String name;
int sage;
void inputStudent() { //类中有方法,结构体中没有方法
}
}
可以说结构体是类的一个过渡。
什么是结构体
结构体是用户根据实际需求自己定义的复合数据类型。
结构体是数据类型,不是变量。
如何使用结构体
两种方式:
struct Student st = {1000,"zhangsan",20} ;
struct Student * pst = &str;
- st.sid
- pst->sid(pst 所指向结构体变量中的 sid 这个成员)
第一种:st.sid
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省略
int main(voie)
{
struct Student st = {1000,"zhangsan",20} ; //定义变量 st,同时赋值
printf("%d %s %d",st.sid,st.name,st.age); // 1000 zhangsan 20
//第二种给结构体成员赋值方式,变量名 + 点
st.sid = 99;
//st.name = "lisi"; //error,C 语言中 string类型不能直接赋值。
strcpy(st.name,"lisi");
st.age = 22;
printf("%d %s %d",st.sid,st.name,st.age); // 1000 zhangsan 20
return 0;
}
第二种:pst->sid
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省略
int main(voie)
{
struct Student st = {1000,"zhangsan",20} ;
//st.sid = 99; //第一种方式
struct Student * pst;
pst = &st;
pst->sid = 99;//第二种方式
return 0;
}
- pst->sid 等价于 (*pst).sid,*pst 等价于 st,(*pst).sid 等价于 st.id,即 pst->sid 等价于 st.sid。
注意事项
1、结构体变量不能加减乘除,但可以相互赋值。
2、普通结构体变量和结构体指针变量作为函数传参问题。
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省略
void f(struct Student *pst); //前置声明函数
void g1(struct Student st);
void g2(struct Student *pst);
int main(voie)
{
struct Student st ; //已经为 st 分配好了内存。
f(&st); // 函数输入
printf("%d %s %d\n",st.sid,st.name,st.age)
// 函数输出
g1(st); //1、执行速度慢 2、浪费空间,最少传递了 208 个字节(int sid 4个字节,char name[200] 个字节,int age 4 个字节)。
g2(&st); // 此方式只发送了 4 个字节(指针变量占用4个字节)
return 0;
}
void f(struct Student *pst)
{
pst->sid = 99; // 也可以写成 (*pst).sid = 99
strcpy(pst->name,"zhangsan");
pst->age = 22;
}
//这种方式耗内存,耗时间,不推荐。
void g1(struct Student st)
{
printf("%d %s %d\n",st.sid,st.name,st.age)
}
//推荐这种,只发送了地址。
void g2(struct Student *pst)
{
printf("%d %s %d\n",pst->sid,pst->name,pst->age)
}
网友评论