话说结构体

来源:互联网 发布:荣威矩阵式led大灯 编辑:程序博客网 时间:2024/05/22 13:12

1. 结构体变量的声明

先看下面这个例子:

struct {

int number;

char name [NAME_LEN+1];

int on_hand;

} part1,part2;

这个两个结构体变量都有3个成员:number(零件的编号)name(零件的名称)on_hand(现有数量)struct{…}指明了类型,而part1part2则是具有这种类型的变量。

但是该种声明,不常用,而且如果在程序中的不同位置什么变量,会出现什么问题呢?

struct {

int number;

char name [NAME_LEN+1];

int on_hand;

} part1;

struct {

int number;

char name [NAME_LEN+1];

int on_hand;

} part2;

答案是根据C语言规则,part1part2不具有一致的类型,这样的话,不能把part1赋值给part2,也不能用它们来作为函数调用的参数。

为了解决该问题,C语言提高两种命名结构的方法:一是声明“结构标记”;二是使用typedef来定义类型名。

2. 结构标记的声明

结构标记(struct tag)是用于标记某种特定结构类型的名字。如下:

struct part{

int number;

char name [NAME_LEN+1];

int on_hand;

};

一旦产生了标记part,就可以用来声明变量了:

struct part part1,part2;

注意:结构标记只有在前面放置了单词struct才会有意义。

3. 结构类型的定义

typedef struct {

int number;

char name [NAME_LEN+1];

int on_hand;

} Part;

类型Part的名字必须出现定义的末尾,而不是字单词struct的后边。这样就可以像内置类型那样使用Part。如下:

Part part1,part2;

4. 结构体指针

从上例可以看出struct _node是结构标记;Node是结构体别名;*PNode是指向此类型结构体的指针。

但是下面这种声明形式是错误的。

typedef struct _node

{

char name[32];

pNode pNext;

} *pNode;

因为新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode

 

原创粉丝点击