赞
踩
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。它就将不同类型的数据存放在一起,作为一个整体进行处理。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是32Bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragmapack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragmapack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragmapack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragmapack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
语法:struct 结构体名 { 结构体成员列表 };
#include <stdio.h> #include <iostream> #include <string> using namespace std; //结构体变量创建方式3:定义结构体时顺便创建变量 struct student { //成员列表 string name; int age; int score; }stu3; int main(){ //结构体变量创建方式1: struct 结构体名 变量名 struct student stu1; stu1.name = "七喜"; stu1.age = 20; stu1.score = 95; cout<<"姓名:"<<stu1.name <<" 年龄:"<<stu1.age <<" 分数:"<<stu1.score <<endl; //创建结构体变量方式2:struct 结构体名 变量名 = { 成员1值 , 成员2值…} struct student stu2 = {"可乐",19,100}; cout<< "姓名:"<< stu2.name <<" 年龄:"<<stu2.age<<" 分数:"<<stu2.score<< endl; //结构体变量创建方式3: stu3.name = "雪碧"; stu3.age = 20; stu3.score = 90; cout<<"姓名:"<<stu3.name <<" 年龄:"<<stu3.age<<" 分数:"<<stu3.score<< endl; return 0; }
作用:将自定义的结构体放入到数组中方便维护
语法: struct 结构体名 数组名[元素个数] = { { } , { } ,…, { } }
#include <stdio.h> #include <iostream> #include <string> using namespace std; //结构体变量创建方式3:定义结构体时顺便创建变量 struct student { //成员列表 string name; int age; int score; }; int main(){ //结构体数组 struct student stus[3] = {{"康师傅",20,95},{"百事",19,100},{"农夫山泉",20,90}}; for(int i=0; i < 3; i++){ cout<<"姓名:"<<stus[i].name <<" 年龄:"<<stus[i].age<<" 分数:"<<stus[i].score<< endl; } return 0; }
. 和-> 区别:
. 来访问结构体成员/属性
-> 来访问其指向的结构体成员/属性
#include <stdio.h> #include <iostream> #include <string> using namespace std; //结构体变量创建方式3:定义结构体时顺便创建变量 struct student { //成员列表 string name; int age; int score; }; int main(){ //结构体变量创建方式1: struct 结构体名 变量名 struct student stu1; stu1.name = "七喜"; stu1.age = 20; stu1.score = 95; cout<<"姓名:"<<stu1.name <<" 年龄:"<<stu1.age <<" 分数:"<<stu1.score <<endl; //结构体指针 struct student *p = &stu1; cout<<"姓名:"<<(*p).name <<" 年龄:"<<(*p).age<<" 分数:"<<(*p).score<< endl; cout<<"姓名:"<< p->name <<" 年龄:"<< p->age<<" 分数:"<< p->score<< endl; return 0; }
#include <stdio.h> #include <iostream> #include <string> using namespace std; //结构体变量创建方式3:定义结构体时顺便创建变量 struct student { //成员列表 string name; int age; int score; }; struct teacher { //成员列表 int id; //职工编号 string name; //教师姓名 int age; //教师年龄 struct student stu; //子结构体 学生 }; int main(){ //结构体嵌套 struct teacher t1; t1.id = 10000; t1.name = "老王"; t1.age = 40; t1.stu.name = "张三"; t1.stu.age = 18; t1.stu.score = 100; cout << " 教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl; cout << " 辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl; return 0; }
传递方式包括:值传递、地址传递
#include <stdio.h> #include <iostream> #include <string> using namespace std; //结构体变量创建方式3:定义结构体时顺便创建变量 struct student { //成员列表 string name; int age; int score; }; //值传递 void printStudent1(student stu){ stu.age = 28; cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl; } //地址传递 void printStudent2(student *stu) { stu->age = 28; cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl; } int main(){ //结构体做函数参数 struct student stu1; stu1.name = "七喜"; stu1.age = 20; stu1.score = 95; cout<<"姓名:"<<stu1.name <<" 年龄:"<<stu1.age <<" 分数:"<<stu1.score <<endl printStudent1(stu1); printStudent2(&stu1); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。