教学网站开发视频,品牌代运营公司,网站规划建设实训报告,建网站公建网站公司C之struct和union对比介绍
在C中#xff0c;struct和union都是用来定义自定义数据类型的关键字#xff0c;但它们的作用略有不同。
首先了解一下它们的基本概念#xff1a;
struct#xff08;结构体#xff09;#xff1a;struct 是一个用户自定义的数据类型#xff…C之struct和union对比介绍
在C中struct和union都是用来定义自定义数据类型的关键字但它们的作用略有不同。
首先了解一下它们的基本概念
struct结构体struct 是一个用户自定义的数据类型可以包含多个不同类型的成员变量可以包含函数。这些成员变量在结构体中是独立的它们分别占用独立的内存空间。结构体中的成员可以通过指定的访问权限public, private, protected进行访问控制。
union联合体union 也是一个用户自定义的数据类型但不能包含函数。它的成员共享同一块内存空间。这意味着union 中的所有成员变量都位于同一个内存区域且内存空间的大小由最长的成员变量决定。 如果需要定义一个包含多个具有不同数据类型的成员的数据类型可以使用struct关键字。例如一个学生信息的数据类型包含学号、姓名和成绩等成员可以用struct来定义
struct Student { int id; string name; float grade;
};
使用struct定义的类型非常直观也很容易操作不需要过多的安全性考虑。 如果需要定义一个可以共享内存的数据类型可以使用union关键字。union中的不同成员可以在同一时间只有一个是有效的因为它们共用同一块内存。例如定义一个可以同时存储int、float和char类型数据的数据类型可以用union定义
union Data { int i; float f; char str[20];
};
使用union关键字定义的类型具有较高的危险性因为它的成员共享同一块内存如果使用不当容易出现数据混乱等问题需要特别注意安全性。 在 C 中struct 和 union 的成员默认是公共的public但是可以根据需要设置访问权限例如将某些成员设置为私有private或受保护protected。具体的访问权限设置通过在成员声明时添加访问修饰符来实现。
struct 可以有函数成员union不能包含函数成员。
因此struct和union的使用还是根据具体情况而定需要根据问题的实际需求进行选择。 对于 struct结构体它的成员可以是以下类型
数据成员可以是任何合法的 C 数据类型包括基本数据类型如整型、浮点型、布尔型、自定义数据类型如类、结构体、枚举等。
函数成员成员函数在 struct 内部定义的函数可以用于操作 struct 的数据。函数成员可以访问 struct 的私有成员和保护成员。
静态成员可以是静态数据成员或静态函数成员。静态数据成员是 struct 类型的对象共享的数据静态函数成员是不依赖于具体对象的函数。
struct结构体示例如下
#include iostream
using namespace std;struct Point {int x;int y;void print() {cout Point: ( x , y ) endl;}static int count;static void incrementCount() {count;}
};int Point::count 0;int main() {Point p1 {3, 4};p1.print(); // 输出: Point: (3, 4)Point::incrementCount();cout Point count: Point::count endl; // 输出: Point count: 1return 0;
}对于 union联合可以包含以下类型的成员
数据成员可以是任何合法的 C 数据类型包括基本数据类型如整型、浮点型、布尔型、自定义数据类型如类、结构体、枚举等。注意union 的数据成员共享存储空间只能存储一个成员的值。
嵌套结构体或联合可以在 union 内部定义嵌套的 struct 或 union。
union联合示例如下
#include iostream
using namespace std;union Data {int i;float f;char c;
};struct Employee {string name;union {int age;float salary;};
};int main() {Data d;d.i 42;cout Data value: d.i endl; // 输出: Data value: 42Employee e;e.name John;e.age 30;cout Employee: e.name , e.age years old endl; // 输出: Employee: John, 30 years olde.salary 5000.0;cout Employee: e.name , salary: e.salary endl; // 输出: Employee: John, salary: 5000return 0;
}