首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

[C语言]初学者的一些理解-结构体,共用体,枚举,位域

2013-10-11 
[C语言]菜鸟的一些理解-结构体,共用体,枚举,位域结构体 时间真快!!假期就要过去了。这是我最难过的一个国庆

[C语言]菜鸟的一些理解-结构体,共用体,枚举,位域
结构体

 

时间真快!!假期就要过去了。这是我最难过的一个国庆,

感谢时间快,又不希望它过得这么快。

 

前面学的数组,一旦定义了就只能存储定义的数据类型的数据了。

但是我们现实中每组数据不一定是由同一种数据类型组成。

比如:一个人的信息是由  姓名 年龄 职业 等组成。

这就不可能用数组的存储了。

 

C语言中提供了一种类型,结构体来解决这类问题,结构体可以将不同的数据类型封装在一起。我们再对其进行引用。我们可以根据实际情况来构造不同的类型。

 

简单的来理解:结构体就是我们自己定义的一个可以存储不同数据类型的数组。

 

声明结构体类型,其声明如下:

 

要用到  struct 这个关键字

 

struct  结构体名

{

数据类型1 结构体成员1;

数据类型2 结构体成员2;

};注意:这个分号省略。

 

 

定义结构体变量。

 

声明了结构体类型后,便可以使用该类型来定义结构体变量。

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

 

① 声明结构体类型后,再定义结构体变量。

 

struct 结构体名

{

数据类型1 结构体成员1;

数据类型2 结构体成员2;

};

 

struct 结构体名 变量名1,变量名2;

 

注意:struct 不可省略。

 

②不声明结构体类型,直接定义结构体变量。

 

 

struct 

{

数据类型1 结构体成员1;

数据类型2 结构体成员2;

}变量名1,变量名2;

 

③ 使用typedef 得到简化的结构体类型名,再定义结构体变量

由于结构体数据类型的名字由标识符合结构体名两部分组成,书写起来名字较长,因此,常常使用 typedef 来简化。其用法如下:

 

typedef struct 结构体名

{
数据类型1 结构体成员1;

数据类型2 结构体成员2;

数据类型n 结构体成员n;

}stru;

就可以通过stru来定义结构体变量了。

stru s1,s2;

 

 

结构体变量的初始化和赋值

 

代码如下

 

struct s

{

char str[100];

int i;

};

struct s s1 = {“Hello”,8};

 

也可以单独赋值

 

strcpy(str,”Hello”);//这里为什么要这样赋值呢?我也没有搞懂。

s1.i = 8;

 

 

 

 

访问结构体成员

访问结构体成员要用到成员操作符( . )就是一点。成员操作是二元操作符,操作符前面的是结构体变量,后面是结果体成员。

例1.

#include <stdio.h>typedef union data{int x;char c;float f;}ty_u;int main(void){ty_u ud;ud.x = 1;printf("x=%d c=%c f=%f\n",ud.x,ud.c,ud.f);ud.c = 'a';printf("x=%d c=%c f=%f\n",ud.x,ud.c,ud.f);ud.f = 8.1;printf("x=%d c=%c f=%f\n",ud.x,ud.c,ud.f);printf("输出共用体成员的地址:\n");printf("x=%p\nc=%p\nf=%p\n",&ud.x,&ud.c,&ud.f); return 0;}

输入同一个内存空间。


枚举

使用枚举变量需要注意以下几点:

① 枚举成员值以此增加1

定义枚举类型时,可以对枚举成员显示赋值,其后的枚举成员同样在改值的基础上加1,如下:

enum en

{A = 1, B,C,D = 8,E,F};

由于A赋值为1 则后面是B = 2 C = 3  由于D赋值为8 则E = 9,F = 10;

 

② 只能使用整型数值初始化

如下赋值是错误的

enum en

{A = 0.1,B,C,D,E,F};

建议整型以外的值,用const 定义  或define 

 

③ 不使用只有一个枚举成员的枚举类型。

没有必要这么麻烦吧,直接使用const 

 

位域

位域属于结构体,它允许在结构体内以位作为单位将其空间划分为多个区域,并将其分配给结构体的各个成员。在程序中可以通过操作位域的各个成员来操作其中的区域。利用位域可以使用较少的字节数来存储信息,其形式如下:

 

struct 结构体名

{

unsigned 位域成员名1:常量1;

unsigned 位域成员名2:常量2;

..................................................

/*定义其他结构体成员*/

 

数据类型 成员名;

........................

};

1.位域成员的类型只能为int 和 unsigned 型

2.位域成员声明中最后的常量值指定了该区域所占的位数,且该数组不能大于其数据类型所   

  占的位数。

3.位域成员和结构体成员可以交叉定义

4.位域成员访问方式与结构体成员访问方式完全一样

 

 

 

 


热点排行