结构体

结构体

重点:

        复合类型与结构体;

        数据抽象;

一、复合类型与结构体

            在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号为整型或者字符型;年龄为整型,性别为字符型等。显然不能用一个数组来存放这一组数据。因为数组各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structrue)“或叫”结构体”。它相当于其它高级语言中的记录。

              ”结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是基本数据类型或者又是一个构造类型。  

               结构既然是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它也就是构造它,如同在说明和调用函数之前要先定义函数一样。

                定义结构的形式:struct 结构名

                                           {成员表列};             

    例:定义和访问结构体

    

#include "stdafx.h"
int  main()
{
	struct complex_struct { double x,y;} z;
	double x=3.0;
	z.x=x;
	z.y=4.0;
	printf("struct value:z.x=%f z.y=%f\n",z.x,z.y);
	getchar();
	return 0;
}

    注意,上例中变量x和变量z的成员x的名字并不冲突,因为变量z的成员x只能通过表达式z.x来访问,编译器可以从语法上区分哪个x是变量x,哪个x是变量z的成员。结构体Tag也可以定义在全局作用域中,这样定义的Tag在其定义之后的各函数中都可以使用。

    结构体变量之间使用赋值运算符是允许的,用一个结构体变量初始化另一个结构体变量也是允许的。

二、数据抽象

            

                数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。

                数据抽象分为:复数运算层,复数存储表示层。

                这两个称为抽象层,表示层在下,从底层往上层来看,复数越来越抽象了,把所有这些层组合在一起就是一个完整的系统。组合使得系统可以任意复杂,而抽象使得系统的复杂性是可以控制的,任何改动都只局限在某一层,而不会波以及整个系统。

三、数据类型标志

            

enum coordinate_type{RECTANGULAR, POLAR};
struct complex_struct{
       enum coordinate_type t;
       double a,b;  
};

        enum关键字的作用和struct关键字类似,把coordinate_type这个标识符定义为一个标签,struct complex_struct表示一个结构类型,而enum coordinate_type 表示一个枚举类型。枚举类型的成员常量,它们的值由编译器自动分配,例如,定义了上面的枚举类型之后,RECTANGULAR就表示常量0,POLAR表示常量1。

四、嵌套结构体

            结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。

            例如,我们在复数的基础上定义复平面上的线段:

    

struct segment{
     struct complex_struct start;
     struct complex_struct end; 
};

            初始化也可以嵌套,因此嵌套结构体可以嵌套地初始化,例如:

struct segment s={{1.0,2.0},{4.0,6.0}};

            也可以平坦(Flat)地初始化。例如:

struct segment s={1.0,2.0,4.0,6.0};

            甚至可以把两种方式混合使用(这样可读性很差,应该避免):

struct segment s={{1.0,2.0},4.0,6.0};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章