C++之struct

一、概念

结构体(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 结构体名 { 结构体成员列表 };

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值 , 成员2值…}
  • 定义结构体时创建变量
#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;
}
在C语言中,使用`struct`关键字来定义结构体。结构体可以包含多个成员变量,每个成员变量可以有不同的数据类型。结构体可以通过不同的方式来创建变量。 一种创建结构体变量的方式是在定义结构体时顺便创建变量。例如: ``` struct student { string name; int age; int score; } stu1; // 定义结构体时创建变量stu1 ``` 另一种方式是使用赋值方式创建结构体变量。例如: ``` struct student stu2 = {"可乐", 19, 100}; // 使用赋值方式创建结构体变量stu2 ``` 还可以先定义结构体,在后面通过赋值的方式来初始化成员变量。例如: ``` struct student stu3; // 先定义结构体 stu3.name = "雪碧"; stu3.age = 20; stu3.score = 90; ``` 此外,还可以使用结构体指针来操作结构体。例如: ``` struct student { string name; int age; int score; } *pStu; // 声明一个指向结构体的指针变量pStu pStu = &stu1; // 将指针指向已经创建的结构体变量stu1 cout << "姓名:" << pStu->name << " 年龄:" << pStu->age << " 分数:" << pStu->score << endl; ``` 这样就可以通过指针来访问结构体的成员变量。需要使用箭头运算符(`->`)来访问指针所指向的结构体的成员变量。 总结起来,C语言中可以使用`struct`关键字来定义结构体,并且可以通过不同的方式来创建结构体变量,包括在定义结构体时顺便创建变量、使用赋值方式创建变量和使用结构体指针来操作结构体成员变量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++struct](https://blog.csdn.net/gghhb12/article/details/123975142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C++ Struct(结构体)详解](https://blog.csdn.net/weixin_42018112/article/details/82429514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上生花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值