C结构体运用

本文介绍了C语言中的结构体,包括结构声明,如何定义结构变量,初始化结构,创建结构数组,结构的嵌套,以及如何通过指针操作结构体。重点讨论了C99引入的伸缩型数组成员特性,其在内存分配上的特殊性,以及在使用时的注意事项,如不能直接赋值或拷贝,不应按值传递给函数等。
摘要由CSDN通过智能技术生成

1.结构声明:描述了一个结构的布局,关键字“struct”。

        如:

        该声明描述了一个由两个字符数组和一个float类型变量组成的结构。

        关键字“struct”,后面是一个可选的标记(该例中“book”)。

2.定义结构变量

        2.1 结构有两层含义:1.“结构布局”(即:结构声明),2.“结构变量”。

          如:struct boook library;

          创建了一个结构体变量library,而“struct book”相当于一般声明中的 int 或 float(基本数据类型).

        2.2 定义结构体变量有三种方式:

          

3.初始化结构

          

4.结构数组

  前面说过结构体在定义之后其类型相当于一般数据类型,如:"struct book".

  一般的数组定义方式:int arr[N];

  同样结构数组的定义方式:

  

5.结构嵌套

  

  输出结果:

  

6. 指向结构体的指针

    结构体类型相当于基本数据类型同样也可以声明只想结构体的指针

    

    运行结果:

    

7. 向函数传递信息

  7.1传递结构成员 (以值的方式传递)

  7.2传递结构 (以值的方式传递)

  7.3传递结构的地址(以指针的方式传递)

  7.4等

注:结构体类型相当于基本数据类型(说三遍),结构体所具有的操作与基本数据类型所具有的操作类似,无论是结构体变量指向结构体的指针结构数组向函数传递信息以及它们之间的结合运用都与基本数据类型相似(可以说一样)。

附加:链式结构,联合(union),枚举类型(enum),typedef(自定义类型) 等知识。

8.伸缩型数组成员

  C99的一个特性:伸缩型数组成员,利用这项特性声明的结构,其最后一个数组具有一些特性

    第一个特性:该数组不会立即存在。

    第二个特性:使用该伸缩型数组成员可以编写合适的代码,就好像它确实存在并具有所需数目                               元素一样。

  声明一个伸缩型数组有如下规则

    a.该成员必须是结构的最后一个成员

    b.结构中至少有一个成员

    c.该数组的声明类似于普通数组,只是它的方括号中是空的。

    示例:

        

        声明该结构变量时,不能用scores做任何事,因为没有给这个数组预留储存空间。

        实际上,C99的意图是希望你声明一个指向struct flex类型的指针,然后用malloc()来分配足            够的空间,以储存struct flex类型结构的常规内容和伸缩型数组成员所需的额外空间。

         例如,假设用scores表示一个内含5个double类型的数组,可以这样做:

          

        带伸缩型数组成员的结构有一些特殊要求:

         a.不能用结构进行赋值或拷贝

            struct flex * pf1, * pf2;

            *pf1 = *pf2        //不要这样做

            这样做只会拷贝出伸缩型数组成员以外的其他成员,确实要拷贝,应使用memcpy()

         b.不要以按值的方式把这种结构传递给函数,应传递该结构的地址

         c.不要使用带伸缩型数组成员的结构作为函数成员或另一个结构的成员。

 

 

  

          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖子S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值