C语言,联合的一些问题

ivandark 2012-04-27 12:59:29
书上关于“联合”讲得很少,有个例子是这样的
#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;
}
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
union,我更愿意称之为“共同体”,即不同内容占用同一块内存,不管是其中的哪个变量发生变化,其余内容都发生变化。我在程序中很少用这个类型,多用于数据跟踪或查看数据内容。如我想了解一个double类型数据在内存中究竟是如何组织的,就用char p[4]与double d组成的union,查看数据d的内存表现。
nice_cxf 2012-04-27
  • 打赏
  • 举报
回复
你要搞清楚联合应该怎样用最常用的用法如下:
union u_ex
{
float deval;
int pnum;
double my_value;
}U1;
typedef struct _test
{
int type;
u_ex unit;
}test;
根据type的不同对联合的不同域赋值


}
muyi66 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

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

二、,U1.(*pnum)是语法错误,没有这样的语法。另外,你在前面的赋值过程里最终给U1的值是个浮点数,那么……
[/Quote]如下:
#include <stdio.h>
int main(void)
{
union u_ex
{
float deval;
int *pnum;
double my_value;
}U1;
int a=3;

U1.my_value=125.5;

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

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

return 0;
}
ivandark 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
联合是指他们都是用同一段内存.
于是,改变其中一个,几乎就改变了其他所有使用同一联合的.

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

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

那么再对指针指向的内容进行访问,U1.(*pnum).那么就和
int *p;
*p形式差不多了..错误是必然的
[/Quote]
如果我交换一下赋值顺序呢?
其实我就是想知道怎么在联合之外输出指针所指向的变量的值。。。语法应该是什么样的。。
ivandark 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
一、联合使用在一些有不同类型要求的地方。比如一个符号处理系统的单元,单元里存储的可能是指针、整数、浮点数或者文字符号等等,但同一时间里存储的只是其中之一,而不是所有。如果每一种类型都给定义一个成员的话占用的空间就太大了,而定义成联合则可以大大节约空间。

二、,U1.(*pnum)是语法错误,没有这样的语法。另外,你在前面的赋值过程里最终给U1的值是个浮点数,那么你想要把它看作是个指针就是个错……
[/Quote]
那如果我要在联合中声明一个指针,然后在主程序输出它应该怎么做呢?(如果我在联合中声明的都是整形,再把U1.pnum=&a;
U1.deval=1000.5;
交换个顺序。。。。。
evencoming 2012-04-27
  • 打赏
  • 举报
回复
联合是指他们都是用同一段内存.
于是,改变其中一个,几乎就改变了其他所有使用同一联合的.

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

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

那么再对指针指向的内容进行访问,U1.(*pnum).那么就和
int *p;
*p形式差不多了..错误是必然的
muyi66 2012-04-27
  • 打赏
  • 举报
回复
一、联合使用在一些有不同类型要求的地方。比如一个符号处理系统的单元,单元里存储的可能是指针、整数、浮点数或者文字符号等等,但同一时间里存储的只是其中之一,而不是所有。如果每一种类型都给定义一个成员的话占用的空间就太大了,而定义成联合则可以大大节约空间。

二、,U1.(*pnum)是语法错误,没有这样的语法。另外,你在前面的赋值过程里最终给U1的值是个浮点数,那么你想要把它看作是个指针就是个错误——因为里面存储的不是指针。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧