读书人

C语言联合的一些有关问题

发布时间: 2012-05-28 17:59:54 作者: rapoo

C语言,联合的一些问题
书上关于“联合”讲得很少,有个例子是这样的
#include <stdio.h>
int main(void)
{
union u_ex
{
float deval;
int pnum;
double my_value;
}U1;
U1.my_value=125.5;
U1.(*pnum)=3;
U1.deval=1000.5;

printf("\ndeval%f pnum=%d my_value=%lf",U1.deval,U1.pnum,U1.my_value);

return 0;
}
后面的解释就是说最后的输出只有最后赋值的那个变量值是正确的,因为使用的是联合内存。
那么联合究竟使用在什么地方呢?这是问题一。
第二个问题,我企图把联合中的一个变量声明为指针,想要输出指针指向的数值,而非地址,但是编译通不过,这又是为什么呢?
#include <stdio.h>
int main(void)
{
union u_ex
{
float deval;
int *pnum;
double my_value;
}U1;
U1.my_value=125.5;
int a=3;

U1.pnum=&a;
U1.deval=1000.5;

printf("my_value=%lf\ndeval=%f \n pnum=%d \n",U1.my_value,U1.deval,U1.(*pnum),); //这句会报错

return 0;
}


[解决办法]
一、联合使用在一些有不同类型要求的地方。比如一个符号处理系统的单元,单元里存储的可能是指针、整数、浮点数或者文字符号等等,但同一时间里存储的只是其中之一,而不是所有。如果每一种类型都给定义一个成员的话占用的空间就太大了,而定义成联合则可以大大节约空间。

二、,U1.(*pnum)是语法错误,没有这样的语法。另外,你在前面的赋值过程里最终给U1的值是个浮点数,那么你想要把它看作是个指针就是个错误——因为里面存储的不是指针。
[解决办法]
联合是指他们都是用同一段内存.
于是,改变其中一个,几乎就改变了其他所有使用同一联合的.

U1.pnum=&a;
U1.deval=1000.5;

所以,上面第一行,给指针赋值成功,但是下一行立即改变了指针的值.
所以,已经是无效的指针了.

那么再对指针指向的内容进行访问,U1.(*pnum).那么就和
int *p;
*p形式差不多了..错误是必然的
[解决办法]

探讨

引用:
一、联合使用在一些有不同类型要求的地方。比如一个符号处理系统的单元,单元里存储的可能是指针、整数、浮点数或者文字符号等等,但同一时间里存储的只是其中之一,而不是所有。如果每一种类型都给定义一个成员的话占用的空间就太大了,而定义成联合则可以大大节约空间。

二、,U1.(*pnum)是语法错误,没有这样的语法。另外,你在前面的赋值过程里最终给U1的值是个浮点数,那么……

[解决办法]
你要搞清楚联合应该怎样用最常用的用法如下:
union u_ex
{
float deval;
int pnum;
double my_value;
}U1;
typedef struct _test
{
int type;
u_ex unit;
}test;
根据type的不同对联合的不同域赋值


}
[解决办法]
union,我更愿意称之为“共同体”,即不同内容占用同一块内存,不管是其中的哪个变量发生变化,其余内容都发生变化。我在程序中很少用这个类型,多用于数据跟踪或查看数据内容。如我想了解一个double类型数据在内存中究竟是如何组织的,就用char p[4]与double d组成的union,查看数据d的内存表现。

读书人网 >C语言

热点推荐