C++共用体 结构体及其指针用法
一、共用体
共用体类型由一些数据组成,这些数据类型共用同一内存区块,已达到节省空间的作用。
共用体基本结构:
union 共用体类型名
{
数据类型 成员名1;(共用体成员)
数据类型 成员名2;
}变量名列表;
其中,定义时,共用体类型名和变量名列表必须有一个。
eg:
union table
{
int a;
char b;
};
union
{
int a;
char b;
}x;
共用体类型名在使用中,和平时我们使用的int,char,long类似。只是一种数据结构的名字而已。
int仅仅表示在内存中一个占8字节的空间的名字。而自己定义的共用体类型名就表示在内存中一个占用自己定义的共用体成员大小的一个空间的名字。在使用上和char,int一样。变量名列表就如同定义的变量名一样。
union table
{
int num1;
int num2;
};
table a;
int b;
//table 等价于int
//a 等价于b;
在使用中,为变量名列表<.>成员名
#include <iostream>
using namespace std;
void main()
{
union table // union
{ // {
char s[2]; // char s[2];
int num; // int num;
}; // }x;
table x; // 同左等价
x.s[0] = 'a'; //x为变量名列表,s[0]为成员名
x.s[1] = 'b';
cout << x.s << '\n' << x.num<<'\n';
x.num = 3;
cout << x.s << '\n' << x.num;
while (1);
}
输出结果
如图,先输出了给出的ab而后就是x.num中的乱码。当给入num=3时,内存空间被占用,s[2]又乱码了。所以共用体储存在同一内存区域。
二、结构体
当需要多种不同数据类型的数据组合在一起,构成新数据类型时,就需要用到结构体。在结构上,于共用体类似,不同点在于,共用体数据共用同一内存区域,而结构体数据占据不同内存区域,也就不会出现乱码的情况。
结构体基本结构
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
…………;
}结构体变量名列表;
同理结构体名和结构体变量名列表也必须有一个。
在使用中,结构体和共用体具有相同的用法。
struct student
{
int num;
char name[20];
char sex;
float height;
}per1={4801,"wang hai",'f',178.68},per2;
per2=per1; //将per1中各个成员的值逐个赋给per2中相应的成员。
cout<<per1.num<<'\n';
cout<<per2.num<<'\n';
cout<<per1.name;
结果如图
上述使用方法均适用于共用体和结构体
指针
除了用变量名访问共用体和结构体,还可以用指针访问
定义格式为
union 共用体类型名 *共用体指针名;
struct 结构体类型名 *结构体指针名;
访问格式为
(*指针名).成员名
或 指针名->成员名
当然,使用时还需要将指针指向你想访问的区块
指针名=&共用体(或结构体)变量名
void main()
{
struct table
{
char s[2];
int num;
}x;
table *p;
x.s[0] = 'a';
p = &x;
cout << (*p).s[0];
while (1);
}
这里将struct直接改为union就行,其他部分都不需要改动。