用途
用于自定义数据类型,一些基本类型的集合组成的一个类型
基本形式
sturct 结构体名{成员列表};
定义结构体并创建结构体变量
定义结构体
struct Student
{
string name;
int age;
int score;
};
创建结构体有3种办法
法1:先创建结构体变量再给结构体变量的属性赋值
//法1:先定义结构体变量再给结构体变量的属性赋值
Student s1;
s1.name = "zhangSan";
s1.age = 18;
s1.score = 80;
法2:创建结构体变量时同时给属性赋值
struct Student s2 = { "liSi",19,100 };
法3:定义结构体时顺便创建一个结构体变量
struct Student
{
string name;
int age;
int score;
}s3;//法3:定义结构体时顺便创建一个结构体变量
结构体数组
struct Student stuArray[3] =
{
{ "liSi",19,100 },
{ "WangWu",8,70 },
{ "ZhaoLiu",50,30 }
};
结构体指针
结构体指针
当直接访问结构体变量的属性时,用 结构体变量名.属性名即可访问 如:stu1.name
当使用指针来访问结构体变量的属性的时候用 指针变量名->结构体变量的属性名 如:p->name
struct Student s = { "liSi",19,100 };
struct Student* p = &s;//指针指向结构体变量
p->score = 80;
cout << "name: " << p->name << " age: " << p->age << " score: " << p->score << endl;
结构体嵌套结构体
结构体的子结构体要在结构体之前定义以免报错
struct Student //学生是老师结构体的子结构体,要在老师结构体前定义
{
string name;
int age;
int score;
};
struct Teacher
{
string name;
int id;
struct Student stu;
};
结构体的子结构体在结构体后面加一个. 比如:t.stu.name
主程序中使用范例:
Teacher t;
t.name = "wanglaoshi";
t.id = 010001;
t.stu.name = "herman";
t.stu.age = 10;
t.stu.score = 100;
结构体与函数
区别结构体的值传递与地址传递
void printStruct_value(struct Student s1)//值传递
{
s1.age = 200;
cout << "val name: " << s1.name << " age: " << s1.age << " score: " << s1.score << endl;
}
void printStruct_address(struct Student *p)//地址传递
{
p->age = 400;
cout << "address name: " << p->name << " age: " << p->age << " score: " << p->score << endl;
}
主程序使用:
printStruct_value(stu);
printStruct_address(&stu);
结构体中const的使用
结构体数组传入函数时,常常量大,为避免值传递新建空间消耗内存过多,常使用地址传递,指针只占用4个字节
同时为了避免地址传递类型的函数不小心修改了结构体变量的值,在传入函数时,命名成常量指针
以便于读数据时不对数据进行修改,可以理解为**“只读”模式**
这个‘常量不可修改’的限制只在函数内存在,因为不是这个结构体变量本身变成了常量,而是只有在使用这个指针时才会受到const的限制
错误示例:
void printStruct(const struct Student* p)//const的使用
{
p->age = 400;//报错:试图修改常量
cout << "address name: " << p->name << " age: " << p->age << " score: " << p->score << endl;
}