聚合数据类型能够同时存储超过一个的单独数据。C语言中有两种aggregate data type:数组和结构
在声明结构时,必须列出它包含的所有成员,包括每个成员的类型和名字。
语法:struct tag{member - list}variable-list;
后面的variable-list是用来创建变量的。
上面的创建方式也可以写成这样:
创建结构还有一种更好的技巧:用typedef定义
typedef struct{ int a; char b; float c; } Simple;
这个方法与上面的效果几乎一模一样,区别仅仅在于现在Simple是一个结构类型名称而不是一个结构标签。后续的声明只需要 Simple x;与java的对象创建相同
结构成员可以使标量数组指针甚至是其他结构
结构变量的成员是通过点操作符(.)访问的,这点和java的对象引用一致。
点操作符和下表引用具有相同的优先级,他们的结合性都是从左向右。
假设我们现在有一个指向结构的指针(struct simple *c),我们该如何访问这个结构的成员呢?
一种方法是(*c).f
但是c语言提供了一种更为方便的操作符:->.于是上面的表达式可以写为c ->f .
在结构的内部不可以包含这个结构的本身。这点与面向对象语言有巨大差别
struct SELF_REF1 { int a ; struct SELF_REF1; } ;
类似这样的引用是非法的,但是下面这种引用却是合法的.
struct tree{ int a; struct tree *node; };
这种结构里面包括自身结构的指针被应用到链表和树等数据结构中,
设想一下我们要声明一些相互之间存在依赖的结构。也就是说一个结构包含了另一个的成员。但是这些结构声明的顺序该怎么定义呢?这时候我们就需要用到不完整的声明,这种方法和函数的声明类似。
结构的初始化和数组的初始化很相似,由位于一对花括号内部,由逗号分割的初始值列表可用于结构各个成员的初始化。
原文:https://www.cnblogs.com/JasonJ/p/14725807.html