您现在的位置:机电论文网>> 工控与编程>> 正文内容

c语言结构体说明

作者: 来源: 发布时间:2011/2/22 9:17:04  点击数:1916

1.直接声明结构体变量:

struct{
int length;
int width;
}box1;

这样就声明了一个名为box1的结构体变量,但是同时要注意,如果在同一个程序中还存在如下的声明:

struct{
int length;
int width;
}box2;

请千万不要认为这个时候box1和box2是两个相同类型的变量,如果你尝试将box1赋值给box2,你将会发现编译器会给你一个错误提示:incompatible types in assignment ,说明两个两个变量的类型是不同的

2.采用标签式的声明方式

struct BOX {
int length;
int width;
};

这样就可以使用这个标签BOX来声明一系列同类型的变量,请记住使用下面的声明方式,而不是简单的

BOX box1这样,当然这样也是可以的,不过需要换另外一种标签方式,声明方式如下:

struct BOX box1;

struct BOX box2;

这个时候两个变量的类型就是一样的了!当然你也可以在采用这种标签式的声明时,同时声明一个变量,如下面的一样:

struct BOX {
int length;
int width;
}box;

这个时候既采用了标签式声明又声明了一个变量box

3.利用typedef关键词产生新类型

这个时候就可以用产生的新类型来声明一个变量了,而不是简单的一个标签,这样书写代码会更清晰,也更易懂,同时也易维护

typedef struct {
int length;
int width;
}BOX; 注意:这个时候的类型名要写在最后 不要写在上面,开始的时候只是typedef struct,如果在这上面再加上一个东西,那是有其他作用的,类似这样:typedef struct box

现在如果要声明一个变量就可以用BOX box1,BOX box2来声明了!看上去简单了不少!

至此已经介绍了3种不同的声明结构体的方法,可以看到c语言在语法方面还是很松散的,可以根据个人的喜好来选择不同的声明方式,但是还有一个两个问题没有解决,如果学过数据结构的话,你会发现很多的数据类型,比如树,链表,图,里面的很多地方使用了结构体,并且在结构体里面引用自身,这就是今天要特别说明的地方

4.结构体的自引用?

如果要在一个结构体里面申明一个与本身一致的结构体类型,该怎么办呢?可能会这么写代码:

struct BOX {
int length;
int width;
struct BOX box1;
};

看上去很正确,在结构体中再声明一个与自己一样类型的结构体,但是这已经陷入了一个死循环,A包含B,B又包含A,没有休止!忽视了编译器的执行顺序,在一个结构体的声明没有结束之前,编译器并不知道该结构体的长度,所以编译器在编译的时候就不知道这个box1究竟是有多大了!会报一个错:
field `box1' has incomplete type

但是我们可以想一想,这里可以包含一个包含自身的指针,因为所有指针的长度是固定的,在编译之前就已经知道了,所以编译器在编译时会顺利通过,这也是大多数数据结构比如树,链接采用的一个技巧

struct BOX {
int length;
int width;
struct BOX *box1;
};

改为上面的声明样式就可以了,其中的box1现在成了一个指向自身的指针!编译会顺利通过!

最后我们还来思考一个问题,如果有下面的一个声明,你猜会有什么结果呢?

typedef struct {
int length;
int width;
BOX *box1;
}BOX;

原本是通过typedef来定义了一个新的结构体类型BOX,然后在结构体内部,使用这个新类型来定义一个指向本身的指针,但是这个时候编译器给出了一个error:syntax error before "BOX"

这是为什么呢?

因为类型名在声明的结尾才算完成定义,所以在结构内部使用的话是没有定义的,变通的方式是这样:

typedef struct box {
int length;
int width;
struct box *box1;
}BOX;

最后这个声明,将前面所说的几种不同方式的声明都结合起来了!


更多
字体:【】-【】-【】【关闭此页

上一篇:LabVIEW机器人模块——机器人选'   下一篇:手锯的使用注意事项'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。