一,结构体目的声明
1,首先类比单个数据定义,如果一个数据定义为int,则该数只能存int类型;如果定义为char,则该数只能存char类型;
若此时有一个学生信息定义:有姓名,学号,性别,年龄等n个数据.
按单个数据定义进行学生信息赋值的话,一个人需要定义n的新数据,两个人就需新定义2n个数据,若人数过多仅仅定义新数据的工程就太庞大了。
2,所以此时用结构体来进行定义, 结构体的目的就是将不同类型的数据按照需求进行整体封装,结构体里面的数据类型与大小均可以自行添加,改变。
eg;上面学生信息定义:
struct STUDENT
{
char name[20]; //姓名
int num; //学号
char sex; //性别
int age; //年龄
};
此时新定义的学生,只需要调用该结构体就可直接定义这4项信息,而不用每个学生新定义4项信息。
而这里的STUDENT就相当于int也是一种类型,
int a表示int类型的a;STUDENT b则表示STUDENT类型的b,此时b包含封装的四种信息。
声明一个结构体类型的一般形式为:
struct 结构体类型名
{
变量信息
};
二,结构体定义
如上面,新定义一个学生,则可用struct STUDENT s1;此时s1就拥有了STUDENT的四项信息。
但是结构体类型的声明和函数声明类似,如果在所有函数之前进行声明,那么就可以在所有函数中直接用它来定义变量;
但如果是在某个函数中进行声明,那么只能在该函数中用它来定义变量。
所以某一函数里面定义的不能在其它函数里面使用,其他函数想使用只能引用。
或者定义全局变量:即定义的时候,在结构体最后“;”前添加。
局部定义形式:
struct 结构体类型名 物体;
全局定义形式:
struct 结构体类型名
{
变量信息
}物体;
三,结构体变量的赋值引用
赋值:
若此时有一个新学生s1需赋值则有两种方法:
1,定义的时候直接全部赋值(每一项需要与结构体对应):
struct STUDENT s1 = {"小明", ,20200000 ,"男", 18}; //姓名,学号,性别,年龄
(整体赋值仅限于定义时)
2,单独给每一项变量信息赋值(此时用”.“):
struct STUDENT s1;
strcpy(s1. name,"小明"); //姓名
s1.num=20200000; //学号
s1.sex="男"; //性别
s1.age=18; //年龄
引用:
与单独赋值一样:
若需获得s1的姓名,则cout<<s1.name;
若需获得s1的学号,则cout<<s1.num;
.........
四,结构体数组
和数组类似,只不过数组每个点只能存一个数,而结构体数组每个点存的是封装的一个不同数据类型的结构。
如数组定义int a[5],则每个点都存一个int类型数据
而结构体struct STUDENT s1[5];则每一个点都是一个结构体即存有四个信息。
比如定义5个学生,则为s1[0]代表第一个人,s1[1]代表第二个。
此时若要知道第三个人的性别年龄,则。
cout<<s1[2].sex;cout<<s12].age;
结构体数组可以跟数组比较。
五,结构体数组实际长度
sizeof(s1) / sizeof(struct STUDENT); //sizeof(s1)结构体数组大小;sizeof(struct STUDENT)每一个结点大小,即结构体大小
六,结构体做指针
结构体变量名在表达式中不会像数组一样被自动转换为指针,所以要想取得结构体变量的地址,必须在前面加&,如下赋值:
struct STUDENT s1;
struct STUDENT *s2 = &s1;
获取对应变成指针后的变量信息:
(*s2).memberName
s2->memberName
这篇博客原因就是因为课本上有一串代码,我还以为他呢正确,如下:
struct
{
int number;
char name;
}Node[10];
可以看出下面是按照C语言是错的,因为没有结构体类型名。没有类型名,就相当于int a;少了int,肯定错误
这串代码可能是伪代码之类的。
文章有什么不足或错误欢迎评论指正