结构和联合

1.结构基础知识

1.1 结构声明

通过例子说明结构声明的方式。

(1)

struct
{
  int a;
  char b;
  float c;     
}x;

这个声明创建了一个名叫x的变量,它包含三个成员。后面的x是变量列表。

(2)

struct
{
  int a;
  char b;
  float c;
}y[20], *z;

这个声明创建了包含20个结构的数组y和指向结构的指针z。

警告:虽然这两个声明的结构的成员列表完全相同,但是编译器会把他们当做两种不同的类型。所以z = &x是非法的。

可以加入标签字段为成员列表提供一个名字。

(3)

struct SIMPLE
{
  int a;
  char b;
  float c;
}    

这个声明把标签SIMPLE和成员列表联系在一起。该声明没有提供变量列表,所以它并未创建任何变量。使用标签创建变量如下:

struct SIMPLE x;

struct SIMPLE y[20], *z;

声明结构一种良好技巧是使用typedef创建一种新的类型,如:

typedef struct
{
  int a;
  char b;
  float c;    
}Simple;

这个技巧和声明一个结构标签的效果几乎相同。区别在于Simple现在是个类型名而不是个结构标签,所以后续的声明可能是下面的样子:

Simple x;
Simple y[20], *z;

提示:如果想在多个源文件中使用同一种类型的结构,应该把标签声明或typedef形式的声明放在一个头文件中。当源文件需要这个声明时可以使用#include指令把该头文件包含进来。

1.2 结构成员的访问

直接访问方式:结构变量的成员是通过点操作符(.)访问。点操作符的左操作数是结构变量的名字。下标引用和点操作符具有相同的优先级,结合性都是从左向右。

间接访问方式:通过->操作符。->操作符的左操作数是一个指向结构的指针。

1.3 结构的自引用

在结构内部包含自身(非指针)是非法的,类似永远不会终止的递归程序。

在结构体内部包含自身的指针是合法的,因为编译器在结构的长度确定之前就已经知道指针的长度。

 

2.联合基础知识

联合的声明类似结构,但行为与结构不同。联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,可以使用联合。联合声明例子如下:

union
{
  float f;
  int i;
}fi;

fi.f = 3.14159;

printf("%d\n", fi.i);

联合的长度就是它最长成员的长度。

posted @ 2018-10-17 17:17  快乐工作快乐玩  阅读(150)  评论(0编辑  收藏  举报