C语言结构体学习总结

来源:本站
导读:目前正在解读《C语言结构体学习总结》的相关信息,《C语言结构体学习总结》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《C语言结构体学习总结》的详细说明。
简介:该文章讲述了C语言结构体学习.

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;

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

提醒:《C语言结构体学习总结》最后刷新时间 2024-03-14 01:01:24,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C语言结构体学习总结》该内容的真实性请自行鉴别。