C语言结构和其他数据形式

前言

看到结构你会想到什么呢?数据结构?那么C语言中的结构到底又是什么呢?

一、何谓结构

在C语言中,结构是一块整体,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。
学过java的同学见到这种结构时,也许会有这样的感受:这怎么那么像内部类?尽管C不是面向对象的。
它是长这样的:

#define MAXTITLE 41
#define MAXAULTH 31 
struct book{
     char title[MAXTITLE];
     char author[MAXAULTH];
     float value;
};

二、结构声明

从上面我们可以看出结构体是由关键字struct 来声明的,它就像是一个模板,里面封装了相应的数据。
而book如果用java来理解的话,就可以理解成类名,这样我们如果实例化一个book对象的话,就可以照下面的方法来实现:

struct book mBook;

上面的mBook变量名其实我们也可以直接在定义结构体的时候,附带上定义好结构体的变量名。如下:

struct book{
   char title[MAXTITLE];
     char author[MAXAULTH];
     float value;
}mBook;

这样,我们在用的时候,就不再用struct 定义变量,可以直接使用mBook变量来调用结构体里面的数据。


mBook.titile;

就计算机而言,声明结构的过程和定义结构变量的过程其实可以被合并成一步,即将声明与变量定义合并在一起,不需要标记。这样一来上面的结构体就可以用下面的形式来写:

struct{
     char title[MAXTITLE];
     char author[MAXAULTH];
     float value;
}mBook;

当然上面这种形式虽然简化了,但是因为没有标记,所以对于要多次使用一个结构模板时,就不行了,这时就得使用带有标记的形式。

三、访问结构成员

用变量访问结构成员,用.来调用。如:mBook.title.

四、声明结构数组

如果把结构看成一个整体,看成一个类型的话,那么声明结构数组与声明其他类型数组就一样了。例如:

struct book mBook[40];

五、结构指针

因为指针代表了变量内存地址的首地址,便于操作。因此我们可以声明和初始化结构指针。
声明实例:

struct book *mBook;//跟其它指针声明一样

六、结构作为参数在方法中传递

我们可以把结构或结构的地址来作为参数传递,形式如下:

double sum(struct book mBook);/*参数是一个结构*/
double sum(const struct book *);/*参数是一个指针*/

当把结构指针作为参数传递时,因为缺少对数据的保护,可能会影响原数据结构中的数据。这时在ANSI C中新增的const限定词解决了这个问题,防止直接操作原数据。
同样,会Java的同学,会联想到final 关键字,当我们在方法中对参数声明为final 时,这个参数值是不能改变的,这里const也是如此。

七、typeDef简介

typedef 工具是一种高级数据特性,它能使我们为某一已知类型创建我们自己的名字。如:

typedef unsigned char Sunny;
//接下来我们就可以使用Sunny来定义变量了
Sunny x,y[20],*z;

这里,Sunny代表的就是unsigned char类型。

八、位结构

位结构是一种特殊的结构,在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:

 struct位结构名{ 

      数据类型 变量名: 整型常数; 

      数据类型 变量名: 整型常数; 

 } 位结构变量; 

其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 

数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。

变量名是选择项, 可以不命名, 这样规定是为了排列需要。 

例如: 下面定义了一个位结构。 

 struct{ 

      unsigned incon: 8;  

/incon占用低字节的0~7共8位/

      unsigned txcolor: 

4;/txcolor占用高字节的0~3位共4位/

      unsigned bgcolor: 

3;/bgcolor占用高字节的4~6位共3位/

      unsigned blink: 1;  /*blink占用高字节的第7位*/ 

 }ch; 

位结构成员的访问与结构成员的访问相同。 

例如: 访问上例位结构中的bgcolor成员可写成: 

  ch.bgcolor 



注意: 

1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长 

度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。

2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 

如果是指针, 其成员访问方式同结构指针。

3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字 

节。

4. 位结构成员可以与其它结构成员一起使用。 

例如: 

 struct info{ 

      char name[8]; 

      int age; 

      struct addr address; 

      float pay; 

      unsigned state: 1; 

      unsigned pay: 1; 

      }workers;’ 

上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结 

构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工

人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值