C/C++中struct和union的理解

  在阅读和使用C或C++源代码时经常会遇到如下几种与结构体有关的一般代码:

typedef struct Man
{
	int age;
	int weight;
}MAN,*PMAN;//定义了两个数据类型:MAN和PMAN。当然Man也是数据类型,而且Man和MAN就是一个东西,只不过MAN是Man的别名。
typedef struct
{
	int age;
	int weight;
}MAN;//定义了一个数据类型:MAN
struct Man
{
	int age;
	int weight;
}man,*pman;//定义了一个数据类型Man,另外声明了一个Man类型的变量man和一个Man类型的指针
  在没有搞懂之前,每次遇到了它们,都需要复习一下。但是我们可以对他们理解一下的。

  首先我们可以用如下代码定义一个“Man”结构体:

struct Man
{
	int age;
	int weight;
};
  而类型定义符typdef的用法是给类型重新取一个有意义的名字,其用法:typedef 类型名 新类型名;。举个例子:

typedef int integer;//给int类型取一个名字叫integer
int main()
{
	int a = 0;
	integer b = 0;
	if (a == b)//实际上a和b都是int
		printf("a==b");
	return 0;
}//这些代码没有语法错误
  类型重定义的目的是使代码更具有可读性。然而typedef 类型名 新类型名;的类型名可不是一个必须存在的类型,也可以是一个当时声明的类型。所以标准代码写法

typedef struct
{
	int age;
	int weight;
}MAN;
应该这样看:

typedef struct Man { int age; int weight; } MAN; //这样写不方便阅读。

也可这么看:

typedef struct  { int age; int weight; } MAN; //相比上一行少了“Man”,因为我们不会再使用Man这个类型

而如果你这样写:

typedef struct  { int age; int weight; } ;//这样写没有任何意义,因为声明的东西都没有名字

所以,为了方便代码阅读,我们应该按照标准代码写法那样写。所以带typedef的结构体定义都可以这样理解。

而不带typedef的结构体定义后面写的自然而然是变量的声明。而且这个时候你必须写结构体的名字。

struct _Man
{
	int age;
	int weight;
}MAN;

  另外,union虽然不常用到,但是在阅读代码时还会经常遇到。union中的特点是成员数据只能选择一个,但是union的大小以占用内存最大的一个成员为准。

union A{
   int Flags;//占4字节
   char ExecuteOptions;//占1字节
};

  这里union A占4个字节,如果使用ExecuteOptions则只会使用第一个字节,如果使用的是Flags则使用的是整个的A的内存。但是我们一般不这么用,而是让union与struct一起组合使用。因为这样可以使代码的编写上更加方便,因为可以在不影响代码阅读的基础上使用的不同的方式访问同一块内存。

struct _File{
	union{
		struct{
		int lowSize;
		int HighSize;
		};
		long long fileSize;
	};
	char filename[260];
};

  上述代码中,我们定义了一个结构体_File,大小为268个字节,对于前8个字节,我们定义了两种方式进行访问,一个是以高低4个字节方式访问这8个字节,另一种直接以long long方式进行访问这8个字节。

struct _FileAttribute{
        union {
            struct {
                LONG AutoAlignment : 1;//占1比特
                LONG DisableBoost : 1;//占1比特
                LONG DisableQuantum : 1;//占1比特
                LONG ReservedFlags : 29;//占29比特
            };
            LONG FileFlags;//32比特的统一名称
        };
	char filename[260];
};
  上述代码,我们定义了一个占用264字节的结构体_FileAttribute,它的前4个字节我们按照两种方式访问,第一种是以比特方式,另一种是以long类型字节访问这是个字节。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章