【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 = { “张三”,20,99.5 };//不同之处   
    return 0;
}

结构体成员访问

#include <iostream>
using namespace std;
struct student {   
    string name;  
    int age;   
    double score;
};
int main() {  
    student s1 = { “张三”,20,99.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;
}

目录
相关文章
|
9月前
|
存储 人工智能 算法
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
143 0
|
6月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
57 0
|
5月前
|
存储 算法 C++
【C++核心】结构体、共用体详解
这篇文章详细讲解了C++中结构体和共用体的概念、定义、使用场景和案例,包括结构体的创建、数组、指针、嵌套、函数参数传递,以及共用体的特点和应用实例。
68 4
|
5月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
8月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
686 21
|
6月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
64 0
|
8月前
|
存储 数据管理 程序员
C++一分钟之-结构体与联合体(Union)
【6月更文挑战第20天】在C++中,结构体(struct)用于组合多种数据类型形成复合类型,成员变量占用独立内存,适合存储不同类型且同时有效的数据。联合体(union)则让所有成员共享同一内存,适合节省空间和进行低级别类型转换,但需小心数据覆盖。通过`struct`和`union`,程序员能构建更灵活的代码,但也需留意内存对齐和数据管理等问题。
118 2
|
7月前
|
存储 程序员 编译器
|
8月前
|
存储 算法 C++
C++结构体
C++结构体
|
9月前
|
C++
C++程序中的结构体类型
C++程序中的结构体类型
89 1