C结构从0到1

 

目录

 

1、结构模板

1. 建立结构声明

2. 定义结构变量

3. 访问结构成员

4. 初始化结构

声明结构数组

声明和初始化结构指针


 

1、结构模板

1. 建立结构声明

 
  1. struct book{

  2. char title[MAXTITL];

  3. char author[MAXAUTL];

  4. float value;

  5. };

该声明描述了一个又两个字符数组和一个 float 类型变量组成的结构,该声明并未创建实际的数据对象,只描述了该对象由什么组成。

关键字 struct 表明跟在其后的是一个结构,后面是一个可选标记(该例是book),我们在后面的程序中可以这样声明:

struct book library;

这把 library 声明为一个使用book结构布局的结构变量。

在结构声明中,用一对花括号括起来的是结构成员列表。每个成员都用自己的声明来描述。成员可以是任意一种C的数据类型,甚至可以是其他结构。   右花括号后面的分号是声明所必须的,表示结构布局定义结束。

2. 定义结构变量

创建结构变量:

struct book library;

编译器执行这行代码便创建了一个结构变量library。编译器使用book模板为该变量分配空间。

在结构变量的声明中,struct book 所起的作用相当于一般声明中的 int 或 float 。例如可以定义两个 struct book 类型的变量或者指向它的指针:

struct book doyle, panshin, *ptbook;

下面的声明:

struct book library;

是下面声明的简化:

 
  1. struct book{

  2. char title[MAXTITL];

  3. char author[MAXAUTL];

  4. float value;

  5. }library;

声明结构的过程和定义结构变量的过程可以组合成一个步骤,组合后的结构声明和结构变量定义不需要使用结构标记。然而,如果打算多次使用结构模板,就要使用带标记的形式。

 
  1. struct {

  2. char title[MAXTITL];

  3. char author[MAXAUTL];

  4. float value;

  5. }library;

3. 访问结构成员

使用结构成员运算符——点(.)访问结构中的成员。例如,library.value 即访问 library 的 value 部分。可以像使用任何 float 类型变量那样使用 library.value 。

假如创建了一个结构体指针,那么与上面的有所不同,用 ->符号访问结构体指针

 
  1. struct book{

  2. char title[MAXTITL];

  3. char author[MAXAUTL];

  4. float value;

  5. int* ptr;

  6. }library;

library->ptr即访问 library 的 ptr 部分 

4. 初始化结构

初始化结构有两种方法,一个是按顺序赋值,另一种是使用指定初始化器。

按顺序初始化,假如有下面的结构体:

 
  1. struct book{

  2. char title[MAXTITL];

  3. char author[MAXAUTL];

  4. float value;

  5.  
  6. }library;

那么给这个结构体初始化就像这样:

 
  1. struct book library = {

  2. "shudannan",

  3. "libai",

  4. 10.0

  5. };

还有一种是使用指定初始化器。C99和C11为结构提供了指定初始化器,结构的指定的初始化器使用点运算符和成员名。

 
  1. struct book library = {

  2. .value = 10.0,

  3. .title = "shudaonan",

  4. .author = "libai"

  5. };

 

另外,对特定成员的最后一次赋值才是它实际获得的值。例如:

 
  1. struct book gift = {

  2. .value = 18.9,

  3. .author = "libai",

  4. 10

  5. };

赋给value的值是10,因为它在结构声明中紧跟在author成员之后。新值10取代了之前的18.9。

 

声明结构数组

声明结构数组和声明其他类型的数组类似。

struct book library[MAX];

以上代码把library声明为一个内含MAX个元素的数组。数组的每个元素都是一个book类型的结构。因此,library[0]是第1个book类型的结构变量,library[1]是第2个book类型的结构体变量。数组名library本身不是结构名,它是一个数组名,该数组中的每个元素都是struct book类型的结构变量。

 c04b42c59485412da5f429788b525a11.png

标识结构数组的成员

library                    //一个book结构的数组
library[2]                //一个数组元素,该元素是book结构
library[2].title        //一个char数组(library[2]的title成员)
library[2].title[4]        //数组中library[2]元素的title成员的一个字符

 

声明和初始化结构指针

假设有如下结构

 
  1. struct guy

  2. {

  3. struct name handle;

  4. char favfood[10];

  5. float income;

  6. };

struct guy * him;

首先是关键字struct,其次是结构标记guy,然后是一个星号,其后跟着指针名。这个语法和其他指针声明一样。

该声明并未创建一个新的结构,但是指针him可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构变量,可以这样写:

him = &barney;

和数组不同,结构变量名并不是结构变量的地址,因此要在结构变量名前加上&运算符。

 

用指针访问结构成员

用指针访问结构成员,可以使用->运算符。him->income既是访问结构体中的value成员。

还有一种方法

barney.income == (*him).income == him->income // 假设him == &barney

如果him是指向guy类型结构barney的指针,上面的关系恒成立,因为 * 和 & 是一对互逆运算符。

c语言开发语言

来自专栏

C语言

resize,m_fixed,h_64,w_64 菜鸟学编程o 24篇文章  0人订阅

pointRight.png

subject.pngAI必读

发布于2024-05-22著作权归作者所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值