1.向函数传递结构的信息
1.传递结构成员
2.传递结构的地址
3.传递结构(对于有的编译器,可能不匀速把结构作为参数传递给函数)
2.其他的结构特性
现在的C允许把一个结构赋值给另一个结构,但是数组不能这样做,也就是说,如果n_data和o_data都是相同类型的结构,可以这样做
o_data=n_data;
还可以把一个结构初始化为相同类型的另一个结构
struct names right_field={"Ruthie","Geogre"};
struct names captain=right_field;
而且现在函数还可以把结构作为返回值返回。
3.伸缩型数据成员(C99)
C99新增了一个特性:伸缩型数组成员,利用这项特性声明的结构,其最后一个数组成员具有一些特性:
- 该数组不会立即存在
- 使用这个伸缩型数组成员可以编写合适的代码
- 就好像他确实存在并具有所需数目的元素一样
声明一个伸缩型数组成员有以下规则:
- 伸缩型数组成员必须是结构的最后一个成员
- 结构中必须至少有一个成员
伸缩型数组的声明类型普通数组,只是它的方括号中是空的
例如下面这个:
struct flex{
int count;
double average;
double scores[];//伸缩型数组成员
}
声明一个struct flex类型的结构变量时,不能用scores做任何事,因为没有给这个数组预留存储空间,实际上,C99的意图并不是让你声明struct flex类型的变量,而是希望你声明一个指向struct flex类型的指针,然后用malloc()类分配足够的空间,以存储struct flex 类型结构的常规内容和伸缩型数组成员所需的额外空间,例如,假设用scroes 表示一个内含5个double类型值的数组,代码如下:
struct flex *pf;//声明指针
pf=malloc(sizeof(struct flex)+ 5* sizeof(double));
4.匿名结构(C11)
所谓匿名结构就是利用嵌套定义结构,
struct name
{
char first[20];
char last[20];
};
struct person
{
int id;
struct names name;//嵌套结构成员
};
上面的代码是以前的方式,在C11中可以用嵌套的匿名成员结构定义person
struct person
{
int id;
struct {char first[20]; char last[20];};//匿名结构
}
上述两种方式的初始化方式是一样的:
struct person ted={8483,{“Ted”,”Grass”}};