前言
看到结构你会想到什么呢?数据结构?那么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;’
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。