为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求.
为什么叫结构体
把一些基本数据组合在一起形成的一个新的复合数据类型,这个叫做结构体.
如何定义结构体
3种方式,推荐使用第一种:
//第一种方式
//这只定义了一个新的数据类型,并没有定义变量.
struct Student
{
int age;
float score;
char sex;
};
//第二种方式
struct Student2
{
int age;
float score;
char sex;
}st2;
//第三种方式
struct Student
{
int age;
float score;
char sex;
}st3;
怎样使用结构体变量
> 赋值和初始化
- 定义的同时可以整体赋初值;
例如:
struct Student st = {80, 66.6, 'F'};
- 如果定义完之后,则只能单个的赋初值.
例如:
struct st2;
st2.age = 10;
st2.score = 88;
st2.sex = 'F';
> 如何取出结构体变量中的每一个成员
- 结构体变量名.成员名
- 指针变量名->成员名 (第二种方式更常用)
指针变量名->成员名 在计算机内部会转化成 (*指针变量名).成员名
的方式来执行
所以说这两个方式是等价的
例子:
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st = {80, 66.6F, 'F'};//初始化 定义的同时赋初值.
//66.6在C语言中默认是double类型,如果希望一个实数是float类型,
//则必须在末尾加f或F,因此66.6是double,66.6f或66.6F是float类型.
struct Student * pst = &st;//&st不能改成st.
pst->age = 88;//第二种方式
st.age = 10;
return 0;
}
注意:
pst->age在计算机内部会被转化成 (*pst).age, 没有什么为什么,
这就是->的含义,这也是一种硬性规定;
所以pst->age等价于 (*pst).age 也等价于 st.age.
我们之所以知道 pst->age 等价于 st.age,是因为pst->age是被转化
成了 (*pst).age 来执行.
pst->age的含义:
pst所指向的那个结构体变量中的age这个成员.
> 结构体变量和结构体指针变量作为函数参数传递的问题
- 推荐使用结构体指针变量作为函数参数来传递.
注意:
函数参数只读不写的话可以用const关键字.
> 结构体变量的运算
- 结构体变量不能相加,不能相减,也不能相互乘除,
但结构体变量可以相互赋值.
例子:
struct Student
{
int age;
char sex;
char name[100];
};//分号不能省
struct Student st1, st2;
//st1+st2 st1*st2 st1/st2 都是错误的
st1 = st2 或者 st2 = st1 都是正确的
举例:
/*
动态构造存放学生信息的结构体数组
动态构造一个数组,存放学生的信息
然后按分数排序输出
*/
#include <stdio.h>
#include <malloc.h>
struct Student
{
int age;
float score;
char name[100];
};
int main(void)
{
int len;
struct Student * pArr;
struct Student t;
int i, j;
//动态的构造一维数组
printf("请输入学生的个数:\n");
printf("len = ");
scanf("%d", &len);
pArr = (struct Student *)malloc(len * sizeof(struct Student));
for (i = 0; i < len; ++i)
{
printf("请输入第%d个学生的信息:\n", 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 - 1); ++i)
{
for (j = 0; j < (len - 1 - i); ++j)
{
if (pArr[j].score < pArr[j+1].score)
{
t = pArr[j];
pArr[j] = pArr[j+1];
pArr[j+1] = t;
}
}
}
printf("\n\n学生的信息是:\n");
//输出
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");
}
return 0;
}
/*
在Microsoft Visual Studio 2010的过程:
-----------------------------------
请输入学生的个数:
len = 3
请输入第1个学生的信息:
age = 2
name = asd
score = 2
请输入第2个学生的信息:
age = 5
name = qwe
score = 5
请输入第3个学生的信息:
age = 9
name = zxc
score = 9
学生的信息是:
第1个学生的信息:
age = 9
name = zxc
score = 9.000000
第2个学生的信息:
age = 5
name = qwe
score = 5.000000
第3个学生的信息:
age = 2
name = asd
score = 2.000000
请按任意键继续. . .
-----------------------------------
总结:
... ...
*/
如有不对或者疏漏的地方,请多多指出。谢谢(⁄ ⁄•⁄ω⁄•⁄ ⁄)