6.4 共用体变量的初始化方法及成员的引用

前面特地强调过,共用体和结构体的最大区别在于共用体中的成员共用同一片内存区域,所有成员变量均从同一起始地址开始,仅仅是占用的内存大小区域不一致,其占用内存大小由成员变量占用内存最大的类型决定。如果共用体中的成员含有结构体类型的变量,就不存在对结构体的“原子分解”了,而是要把结构体所占用的内存大小视为一个整体,如:


include<stdio.h>

struct fe

{

double a;

char b;

};

union st

{

struct fe f;

double a;

int b;

char c;

};

void main()

{

union st d;

printf("sizeof(d):%d\n",sizeof(d));

return;

}


运行结果:


sizeof(d):16


按照前面对结构体的分析可知,结构体fe占用的内存大小为16字节,共用体类型的成员类型分别为struct fe、double、int、char,其中占用内存最大的为struct fe,占用16字节,所以共用体在内存中占用的内存大小为16字节。

如何对共用体变量进行初始化和引用呢?接下来通过下面的一段代码来展示对共用体变量的初始化和引用。


include<stdio.h>

union st

{

double a;

int b;

char c;

};

void main()

{

union st d;

d.a=1.23;

printf("d.a=%.2lf\n",d.a);

d.b=98;

printf("d.b=%.d\n",d.b);

d.c='a';

printf("d.c=%c\n",d.c);

return;

}


运行结果:


d.a=1.23

d.b=98

d.c=a


从上面的代码中可以看出,对于共用体类型的一般变量,其成员的引用方式为:


共用体类型名.共用体成员名


从其引用方式可以看出,这与前面讲解的结构体很类似,所以在此不再赘述。需要注意的一点是,共用体成员共享同一片内存单元,可以通过下面这段代码证实这一点。


include<stdio.h>

union st

{

double a;

int b;

char c;

};

void main()

{

union st d;

printf("&d=%d\n",&d);

printf("&d.c=%d\n",&d.c);

printf("&d.a=%d\n",&d.a);

printf("&d.b=%d\n",&d.b);

printf("sizeof(d.a)=%d\n",sizeof(d.a));

printf("sizeof(d.b)=%d\n",sizeof(d.b));

printf("sizeof(d.c)=%d\n",sizeof(d.c));

return;

}


运行结果:


&d=1245048

&d.c=1245048

&d.a=1245048

&d.b=1245048

sizeof(d.a)=8

sizeof(d.b)=4

sizeof(d.c)=1


在上面的运行结果中,共用体变量的起始地址为1245048,而共用体中的所有成员的起始地址均为1245048,共用体成员所占用的内存大小并不相同,正是由于共用体的这种特殊性,在初始化时不能像对结构体那样对其成员一次性初始化,但是可以对共用体中的第一个成员进行初始化,如:


include<stdio.h>

union st

{

double a;

int b;

char c;

};

void main()

{

union st d={3};

printf("d.a=%.2lf\n",d.a);

printf("d.b=%d\n",d.b);

return;

}


运行结果:


d.a=3.00

d.b=0


上面代码中的初始化方式是对共用体中的第一个成员进行初始化,所以通过对第一个成员的引用能够得到初始化的值,而对第二成员变量的引用得到的不是所需的值。

接下来看指向共用体的指针是如何对其成员变量进行引用的,代码如下:


include<stdio.h>

union st

{

double a;

int b;

char c;

};

void main()

{

union st d,*per;

d.a=1.23;

per=&d;

printf("d.a=%.2lf\tper->a=%.2lf\t(per).a=%.2lf\n",d.a,per->a,(per).a);

d.b=99;

printf("d.b=%d\tper->b=%d\t(per).b=%d\n",d.b,per->b,(per).b);

d.c='g';

printf("d.c=%c\tper->c=%c\t(per).c=%c\n",d.c,per->c,(per).c);

return;

}


运行结果:


d.a=1.23 per->a=1.23(*per).a=1.23

d.b=99 per->b=99(*per).b=99

d.c=g per->c=g(*per).c=g


在上面的代码中用了3种方法引用共用体中的成员变量,一种是前面讲解的以一般共用体类型的形式进行引用,另两种是采用指针的方式进行引用。

指针引用方法一:


(*共用体指针名).共用体成员名


与前面的结构体类型一样,在使用这种方法引用共用体成员的时候须考虑优先级的关系,其中的括号一定不能少。

指针引用方法二:


共用体指针名->共用体成员名


这种方法简单地采用共用体指针名和“->”结合的方式来引用共用体成员。