【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月前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
|
C语言
【C语言程序设计】知识点汇总5——结构体与共用体
【C语言程序设计】知识点汇总5——结构体与共用体
131 0
|
存储 编译器 C语言
【自定义类型详解】第二篇——结构体实现位段
【自定义类型详解】第二篇——结构体实现位段
92 0
|
C语言
C语言学习笔记——结构体和共用体
C语言学习笔记——结构体和共用体
116 0
C语言学习笔记——结构体和共用体
|
编译器 C语言 C++
细讲C语言结构体(结构体内存对齐你懂了吗?)
结构体是一些值集合的,里面可以包括char,int,double等等的各种类型构成的一个新的类型,也就是说相当于自己基于C语言本身给出的类型自己把它组成一个集合。
113 0
细讲C语言结构体(结构体内存对齐你懂了吗?)
|
编译器 C++
C进阶:结构体的内存对齐
C进阶:结构体的内存对齐
110 0
|
9月前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(中)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
51 0
|
9月前
|
编译器 C语言 C++
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(上)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
28 0
|
9月前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
55 0

热门文章

最新文章