引用 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 语言结构体学习)