【C++知识点】结构体和共用体

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:C/C++知识点
📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~

结构体

结构体概述

结构体(struct)是具有相同类型或不同类型的数据构成的数据集合。

C++ 中,结构体(struct)指的是一种数据结构,是 C++ 中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。

结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

结构体的定义和初始化

//C++结构体定义
//语法
struct structName { 
    type name1; 
    type name2; 
    type name3;
};

用 struct 定义了一个结构体 structName,该结构体有三个字段,字段名分别为 name1、name2 和 name3。定义结构体时,每个字段名后面都需要使用 ; 结尾。最后的大括号后面,同样需要使用 ; 结尾,如果没有分号,则程序会报错。

结构体变量定义

struct 结构体名 结构体变量名;

//方法一
struct student { 
    string name; 
    int age; 
    double score;
};
int main(){
    student s1,s2,s3;    
    return 0;
}

//方法二
struct student { 
    string name;
    int age;    
    double score;
}s1,s2,s3;
给成员赋值
//方法一
#include <iostream>
using namespace std;
struct student {  
    string name; 
    int age;   
    double score;
};
int main() {  
    struct student s1; 
    s1.name = "张三";//不同之处    
    s1.age = 20;    
    s1.score = 99.5;  
    return 0;
}

//方法二
#include <iostream>
using namespace std;
struct student {  
    string name; 
    int age;  
    double score;
};
int main() {   
    struct student s1;   
    student s1 = { “张三”,2099.5 };//不同之处   
    return 0;
}
结构体成员访问
#include <iostream>
using namespace std;
struct student {   
    string name;  
    int age;   
    double score;
};
int main() {  
    student s1 = { “张三”,2099.5 };
    cout << s1.name << endl; 
    cout << s1.age << endl; 
    cout << s1.score << endl;  
    return 0;
}
结构体默认值

在C++11标准后,可以直接在定义结构体时给成员赋初始值

struct student {
    string name = "C++"; 
    int age{ 20 }; 
    double score{ 99.5 };
};
结构体中定义函数
//语法
struct structName { 
    type name1; 
    type name2;
    type name3; 
    type funcName(type val1,type val2) { 
        return val; 
    }
};

struct student { 
    string name;
    int age; 
    double score;
    void printInfo() { 
        //打印学生信息 
        cout << name << endl; 
        cout << age << endl;
    }
};

结构体指针

指针可以存放任意的数据类型的地址,比如float、 int、long、dobule,也可以存放结构体的地址,存放结构体地址的指针,称为结构体指针。

//语法
struct structName *pName;

定义了一个结构体指针 pName,该指针存放的是结构体structName 的地址。

访问结构体指针成员
//语法
pName->fileld;

//如果是结构体指针,要访问其成员,不再是使用点,而是使用 ->。

//语法
(*pName).fileld;

//使用 * 的方式,访问结构体成员,必须要使用 () 改变运算符的优先级,否则,会出错。
访问结构体指针成员案例
 student s1; 
student* ps1 = &s1; 
ps1->name = "诸葛亮";
(*ps1).age = 20; 
cout << ps1->name << endl;
cout << (*ps1).age << endl;

结构体数组

数组可以存放任意的数据类型,比如 int、dobule,也可以存放结构体,存放结构体的数组,称为结构体数组。

//语法
struct structName arrName[len];

定义了一个结构体数组 arrName,该数组中每一个元素的类型都是一个 structName 类型的结构体,数组的长度为 len。

结构体数组案例
student arrstu[3];
for (int i = 0; i < 3; i++) { //输入 
    cin >> arrstu[i].name >> arrstu[i].age >> arrstu[i].score;
}
for (int i = 0; i < 3; i++) { //输出 
    cout << arrstu[i].name << " " << arrstu[i].age << " " << arrstu[i].score << endl;
}

student arrstu[3] = {
    {“name1”,20,90},
    {“name2”,21,92},
    {“name3”,22,99},
};
for (int i = 0; i < 3; i++) { //输出 
    cout << arrstu[i].name << " " << arrstu[i].age << " " << arrstu[i].score << endl;
}

结构体做函数参数

//语法
type funcName(structName structVal){ 
    return val;
}

使用结构体变量作为函数的实参时,采用的是值传递,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参必须是同类型的结构体变量。结构体指针,结构体数组,也可以做参数。

结构体做函数参数案例
#include <iostream>
using namespace std;结构
struct student {
    string name = "C++";
    int age{ 20 }; 
    double score{ 99.5 };
};
void printStudent(student s) {
    cout << s.name << endl; 
    cout << s.age << endl;
    cout << s.score << endl;
}
int main() {
    student s1 = { "王五",21,99 }; 
    printStudent(s1); return 0;
}

//结构体指针
void printStudent(student* s) {
    cout << s->name << endl; 
    cout << s->age << endl; 
    cout << s->score << endl;
}
student s1 = { "王五",21,99 };
printStudent2(&s1);

//结构体数组
void printStudent(student s[], int len) { 
    for (int i = 0; i < len; i++) { 
        cout << s[i].name << " " << s[i].age << " " << s[i].score << endl;
    }
}
student s1[2] = { "王五",21,99,"张三",19,90 };
printStudent(s1, 2);

共用体

共用体可以存放任意 数据类型 的组合,也可以用来存放任意数据类型的集合;共用体也叫联合体。

结构体的各个成员会占用不同的内存,互相之间没有影响,而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

//语法
union unionName{
    Type1 filed1;
    Type2 filed2;
    Type3 filed3;
};
//该共用体的三个字段是相互影响的,修改其中任何一个字段的值,都会影响其他字段的值

//语法
unionName.fileld;union person {
    int age;
    float weight;
};
person p1;
p1.age = 20;
//p1.weight = 50.5; //共用体的成员不可以全部一起使用,只能单独使用其中某一个字段。
cout << p1.age << endl;cout << p1.weight << endl; //共用体成员间影响内存

共用体与结构体区别

共用体和结构体 都可以存放任意 数据类型 的组合,但两者在内存的使用上却有很大的差别

结构体的各个成员会占用不同的内存,互相之间没有影响,而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。

共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

#include<bits/stdc++.h>
using namespace std;

//结构体
struct StructName {
    int name1;
    double name2;
    string name3;
};

//共用体
union UnionName {
    int filed1;
    double filed2;
    string filed3;
};

int main()
{
    int sizeStruct = sizeof(struct StructName);
    int sizeUnion = sizeof(union UnionName);
    cout << "sizeStruct = " << sizeStruct << " sizeUnion = " << sizeUnion << endl;

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值