为什么需要结构体
为了表示一些复杂的事物,而普通的数据类型无法满足实际需求
什么叫结构体
把一些基本的类型组合在一起行程的一个新的符合数据类型,叫做结构体4
如何定义结构体
3种方式
struct Student//第一种
{
int age;
float socre;
char sex;
};
struct Student//第2种
{
int age;
float socre;
char sex;
} st2;
struct Student//第3种
{
truct Student st = { 88,66.6,'F' };
}st3;
怎么使用结构体变量
- 赋值和初始化
- 如何去除结构体变量中的每一个成员
- 结构体变量的运算
- 结构体变量和结构体变量指针作为函数参数传递的问题
举例
动态构造存学生信息的结构体数组链表
- 赋值和初始化
定义的同时可以整体初值
如果定以之后,则只能单个的赋初值
struct Student
{
int age;
float socre;
char sex;
};
int main()
{
struct Student st = { 88,66.6,'F' };//初始化,定义的同时赋值
struct Student st2;
st2.age = 10;
st2.sex = 'F';
st2.socre = 88;
printf("%d %f %c\n",st.age,st.socre,st.sex );
printf("%d %f %c\n", st2.age,st2.socre,st2.sex);
}
- 如何去除结构体变量中的每一个成员
1.结构体变量名.成员名
2.指针变量名->成员名
在计算机内部会被转化为(*指针变量名).成员名
struct Student
{
int age;
float socre;
char sex;
};
int main()
{
struct Student st = { 88,66.6,'F' };//初始化,定义的同时赋值
struct Student *pst = &st;//只能存放struct Student的地址
st.age;//第一种
pst->age = 88;//第二种
}
- pst->age 在计算机内部会被转化成(*pst).age….这个硬性规定,也是->的含义;
- 所以pst->age等价于(*pst).age也等价于st.age
- 结构体变量和结构体变量指针作为函数参数传递的问题
void InputStudent(struct Student *);//pstu只占4个字节
void OutputStudent(struct Student );
struct Student
{
int age;
char sex;
char name[100];
};
int main()
{
struct Student st;
InputStudent(&st);//对结构体变量输出,必须发送st的地址
OutputStudent(st);//对结构体变量输出,可以发送st的地址,也可以发送
}
void InputStudent(struct Student *pstu)//pstu只占4个字节
{
(*pstu).age = 10;
strcpy(pstu->name, "张三");
pstu->sex = 'F';
}
void OutputStudent(struct Student ss)
{
printf("%d %c %s \n", ss.age, ss.sex, ss.name);
}
- 应该发送地址还是发送内容
void InputStudent(struct Student *);//pstu只占4个字节
void OutputStudent(struct Student *);
struct Student
{
int age;
char sex;
char name[100];
};
int main()
{
struct Student st;
InputStudent(&st);//对结构体变量输出,必须发送st的地址
OutputStudent(&st);//对结构体变量输出,可以发送st的地址,也可以发送st的内容,但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
}
void InputStudent(struct Student *pstu)//pstu只占4个字节
{
(*pstu).age = 10;
strcpy(pstu->name, "张三");
pstu->sex = 'F';
}
void OutputStudent(struct Student *pst)
{
printf("%d %c %s \n", pst->age, pst->sex, pst->name);
}
指针的优点:
快速地传递数据
耗用内存小
执行速度快
- 结构体变量的运算
结构体变量不能相加,不能相减,也不能想除,但结构体变量可以相互赋值
- 举例
- 动态构造存学生信息的结构体数
- 动态构造一个数组,存放学生的信息,然后按分数排序
- 动态构造存学生信息的结构体数
struct Student {
int age;
float score;
char name[100];
};
int main()
{
int len,i,j;
struct Student *pArr;
struct Student t;
printf("请输入学生的个数:\n");
printf("len = ");
scanf("%d",&len);
//%动态构造一维数组
pArr=(struct Student *)malloc(len*sizeof(struct Student));
for (i = 0; i < len; ++i)
{
printf("请输入%d个学生的信息:", i + 1);
printf("age = ");
scanf("%d", &pArr[i].age);
printf("name = ");
scanf("%s", pArr[i].name);//因为name是数组名,本身就是首元素的地址,所以pArr[i].name不能够改成&pArr[i].name
printf("score = ");
scanf("%f", &pArr[i].score);
}
//输出
for (i = 0; i < len; ++i)
{
printf("第%d个学生的信息:\n", i + 1);
printf("age =%d \n", pArr[i].age);
printf("name =%s\n", pArr[i].name);
printf("score =%f\n",pArr[i].score);
printf("\n");
}
//排序
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - j; j++)
{
if (pArr[j].score > pArr[j + 1].score)
{
t = pArr[j];
pArr[j] = pArr[j + 1];
pArr[j + 1] = t;
}
}
}
}