C语言之结构体(struct)

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”}};

猜你喜欢

转载自blog.csdn.net/dream_follower/article/details/81065984
今日推荐