c语言结构体定义:
1.先定义结构体数据类型,再声明变量
struct s_name
{
成员...
};
struct s_name var_name;//声明变量,在c++里struct可以不写。
2.定义结构体类型的同时,声明变量
struct s_name
{
成员...
}var_name1,var_name2; //在此声明变量
3.定义一个结构体,只能有有限个变量时
struct {
成员...
}var_name1,var_name2;
该结构体只有两个变量,由于该结构体无名,所有不能用来声明变量。
4.使用typedef为结构体(自定义)数据类型取别名
typedef struct s_name
{
成员...
} tt; //tt表示struct s_name 这个数据类型,之后可以通过tt直接声明结构体类型如:tt var;
关于结构体赋值:分为两类
struct stu{int sno;int id;int n;};
1.定义是初始化
顺序初始化:
struct stu s={3,4,5};//这种必须给结构体每个成员赋值
乱序初始化:
struct stu s1={.id=5,.n=9};//这种方式可以任意给指定成员赋值,这是c风格,只能在.c文件使用
struct stu s2={id:5,n:9};//这种方式是c++风格,在.cpp文件使用
上面必须是在定义时,赋值。
2.先定义后赋值
struct stu s2;
s2.sno=0; s2.id=9;s2.n=8;//等待
另外,相同类型的变量(对象)可以互相赋值;
struct stu s4= s2;
关于结构体大小的问题
首先有编译器编译时有个设置,结构体对齐基数,一般为4字节或8字节。计算结构体的方法有一下三点;
(1)结构体的第一个成员变量为结构体的首地址
(2)之后,其余成员变量相对结构体的首地址的偏移量为对齐基数和该成员变量字节大小较小值的整数倍
(3)最后,总结构体大小要为结构体里成员变量基本类型最大的字节数和对齐基数较小值的整数倍
通过宏#pragma pack(x)来修改对齐基数,默认对齐基数一般为4.如下面例子:
#pragma pack(2)
struct dd{ char a[13]; int b; };
此时sizeof(dd)结果为:18;
#pragma pack(4)
struct dd{ char a[13]; int b; };
此时sizeof(dd)结果为:20;
附加:
c++ string类型字节数为:28
union 联合体与结构体类似,区别为:联合体多个成员使用一块内存。 也就是同一时刻只存在一个有效成员。定义,赋值均和结构体一样。union联合体没有this指针。
union联合体大小为最大成员所占内存。
union之间不能直接使用==判断是否相等;需要重载==运算符
struct之间不能直接使用==判断两个结构体是否相等,需重载==运算符。
总结:对于基本类型(int,double,char,char*,float),编译器有自己的比较方式,即上述两个相同的基本数据类型可以直接使用关系运算符比较。
复杂类型(union,struct(和class一样)),编译器不知道怎么比较,因此,上述两个相同的数据类型不能直接使用关系运算符来比较,需要重载关系运算符,来告诉编译器比较方式。