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形式差不多了..错误是必然的
[解决办法]