以前Fire也记得这部分也看过一段时日,也看的似懂非懂的样子,不过时间也长了,忘
的也差不多了。这几天看到这部分,感觉看的也挺透彻的,刚好弥补了以前的不足,同时也
把他记录下来,为以后可回忆留个脚印。。。
0:结构体的引出:
所有的变量大多数都是相互独立、无内在联系的。例如定义了整型变量a,b,c,他们
都是单独存在的变量,在内存中的地址也是互不相干的,但是在实际生活和工作中,有写数
据是有内在联系的,成组出现的。例如一个学生的学号、姓名、性别、年龄、成绩家庭地址
等项,是属于通一个学生的。如果把他们定义为不想干的变量,难以反映他们之间的内在练
习。人们希望把这些数据组成一个组合数据,有的人可能会想到数组,能否哟哥一个数组来
从方这些数据呢?显然不行。因为一个数组中只能存放同一类的数据。例如:整型数组
可以存放学号或成绩,但是不能存放姓名、性别等字符型的数据。
如图:
c语言允许用户建立由不同类型数据组成的组合型的数据结构,它称为结构体。
结构体变量
一:结构体定义:
结构体(structure):聚合数据类型,提供一种把相关数据组合到一起的手段。
1:通常,结构中的成员都是逻辑的。
2:在商业软件中,成员变量一般习惯以下划线(_)开头,结构变量在被定义后,编译器在
编译时为所有的成员分配内存。
3:结构体赋值:可以把一个结构变量的全部内容赋值给另一个同类的结构变量,而
不必逐个成员的赋值。注意与数组的区别:数组是不能被此赋值的,是因为数据名是
一个常量指针。数组是一个数据类型的聚焦,他本质上不是数据类型。
4:向函数传递结构时,实际上是传递结构成员的值,即都是值的传递。包括用结构体变量
作函数参数及函数返回一结构体变量两种情况。
注意:与数组的区别:结构体变量名仅代表值,而非地址。
5:结构体类型定义
struct 结构体名
{
类型标识符
成员名;
类型标识符
成员名;
.............
};
注意:struct是关键字。结构体名是合法的标识符,可以省去(无名结构体)。成员类型可以是基本型(int、char..)或构造型(构造一个结构体:结构体嵌套)。
二:结构体变量定义:
直接定义结构体变量,一般形式:
struct 结构体名
{
类型标识符
成员名;
类型标识符
成员名;
.............
}变量名链表;
例:
struct
student
//声明一个结构体类型struct
student
{
int
num;
char
name[20];
char
sex;
int
age;
float
score;
char addr[30];
}stu1,stu2;
//定义两个结构体变量
注意:
1:结构体类型与结构体变量概念不同。
结构体类型:不分配内存;变量:分配内存
结构体类型:不能赋值、存取、运算;变量:可以
例如:stu2.score=stu1score -------(赋值运算)
student1.age++
------------(自加运算)
2:在scanf函数中成员num,sex,age,score这些都要有取地址符号(&),但name和addr就不需要了。因为name和addr是数组名本来就是地址,所以不能画蛇添足的加上&。
例如:
scanf(“%d%s”,&stu1.num,stu1.name);(必须是结构体变量名.成员名。
“.”是成员运算符,优先级最高)
三:结构体变量的初始化
一般形式:
struct 结构体名
{
类型标识符
成员名;
类型标识符
成员名;
.............
};struct 结构体名 结构体变量={初始数据};
例:
struct student stu1={112,"Wang
Lin",'M',19,"200 Beijing Road"};
还有一种形似是直接在“}”后面stu1={112,"Wang
Lin",'M',19,"200 Beijing Road"};(个人比较喜欢使用第二种方式写)
结构体数组
一:结构体数组的引出:
一个结构体变量只能存放一个学生信息,对于多个学生的信息,我们可以使用一个结构体数组来存放,结构体数组的每个元素是一个结构体类型的变量。
定义结构体数组的方法与定义普通数组的方法类似:
结构体类型 数组名[数组长度];
例如:
struct
student
{
char
name[10];
int
age;
int
s1,s2;
};
struct student
st[6];
[*]提倡用这种方法,个人喜欢用这个形式。
二:结构体数组的初始化:
将每个数组元素的数据用话括号{
}括起来
struct
student
{
char
name[10];
int
age;
int
s1,s2;
};
struct student
st[3]={{"Mary",21,78,86},{"Alex",20,90,80},
{"Fire",22,99,98}};
[*]建议用这中格式
三:结构体数组元素的引用
例如:printf("%d%d",st[1].age,st[1].s1);
【*】数组元素直接可以整体赋值
例如:st[2]=st[0];
结构体指针
未完,待续.......