c语言入门很简单章共同体类型.pptx
第9章共同体类型如果要是一次只保存一种数据,但是每次保存数据的类型都不一样,用结构体的话就有点浪费了,因为结构体会把所有要保存的数据都定义一个成员变量。C语言提供了另外一种高级的自定义类型——共同体,它可以解决这个问题。
9.1共同体的含义与表示共同体是类似于结构体的一种高级的自定义数据类型,它可以弥补结构体每次保存不同种数据太麻烦的不足。
9.1.1共同体的用途共同体一次只能保存一种类型的数据,但是每次保存数据的类型可以不一样。
9.1.2共同体的表示说共同体是一种自定义的高级数据类型,是因为它类似于结构体,保存怎样的数据需要使用者自己来定义。在C语言中,共同体类型的定义形式如下所示:union共同体类型名{数据类型变量1;数据类型变量2;……数据类型变量n-1;数据类型变量n;};
“union”是共同体类型定义的关键字,这是C语言规定的,不能更改,否则就出错了。现在大家只要知道,如何定义一个共同体类型就好了!例如,要用一种数据类型来表示圆的半径,但是事先并不能确定,圆的半径到底是整数还是小数。这个时候就可以定义一个共同体类型radius了。它既可以保存整形数据也可以保存浮点型数据,但是每次只能选一种来保存。radius共同体的类型定义如下所示:unionradius{inti_radius;floatf_radius;};
9.1.3复杂的共同体从共同体的类型定义可以看出,其中的成员变量可以是任何类型的。共同体中的变量包含高级数据类型的时候,就可以认为这个共同体类型是一个复杂的共同体类型。这和复杂的结构体类型是类似的。例如,还是要定义一个radius的共同体类型,这次的共同体类型就有点复杂了。我们知道半径在一维空间中是由其长度确定的,在二维空间中是由一个二维点(x,y)确定的,在一个三维空间中是由一个三维点(x,y,z)确定的。而且每一维上的数据既可以是整数也可以是小数。要表示这样一个复杂半径数据,就需要一个复杂的共同体类型了。
我们可以先分析分析,如何定义这个复杂的共同体类型。首先,最需要表示的就是坐标系上的每一维的数据了。按照上面的描述,可以是整数也可以是小数,你可以只用浮点型类型来表示,但是为了准确的表示上面的描述,还是使用下面的共同体来表示吧:uniondata_dim{inti_data;floatf_data;};
其次,要表示的就是一维空间、二维空间以及三维空间上的半径信息了。一维空间上的半径信息可以直接用每一维上数据的类型(共同体uniondata_dim)来表示,二维空间上的数据就需要定义一个包含x,y两个成员变量的结构体了,而x,y本身又是用每一维上数据的类型(共同体uniondata_dim)来表示:structradius_2d{uniondata_dimx;uniondata_dimy;};
要表示三维空间上的半径信息的话,也是需要一个类似于structradius_2d的结构体的,三维半径信息结构体只是比二维半径结构体多了一个维的数据z而已,其形式如下:structradius_3d{uniondata_dimx;uniondata_dimy;uniondata_dimz;};
最后,就是要定义一个可以表示一维半径信息、二维半径信息和三维半径信息的共同体了。有了前面的定义,这个共同体就好定义多了。unionradius_info{uniondata_dimdata_1d;structradius_2ddata_2d;structradius_3ddata_3d;};
9.2共同体变量知道了如何定义一个共同体类型以后,就可以使用共同体类型来定义共同体变量了!顺便来看看,C语言中的共同体是如何实现可以保存不同种类的数据,但是每次只能保存一种的。
9.2.1共同体变量在C语言中,要想定义一个共同体变量,是很简单的。按照定义一般数据类型变量的形式来定义一个共同体变量。具体形式如下所示:共同体类型名共同体变量;例如,现在要定义一个unionradius共同体的变量r。就可以使用下面的C语言表示了。unionradiusr;
当然,也可以使用类似于结构体变量的定义方法,在共同体类型定义的时候,顺便把共同体变量也定义了。例如,定义radius共同体类型的时候,也可以定义radius共同体变量r。就像下面这样。uionradius{inti_radius;floatf_radius;}r;
9.2.2共同体成员变量的相互覆盖为什么结