✍个人博客: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 = { “张三”,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;
}