C语言中关于联合体中成员变量的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中关于联合体中成员变量的问题相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
typedef union xunlian

int p;
int q;
exer ;
void main()

exer ex;
ex.p = 3;
// ex.q = 10;
printf("%d\n",ex.q);

我想问一下 联合体中两个相同类型变量的值的取值问题。我知道联合体是共用一段内存。那么当给联合体变量p赋值,变量q会取到q的值吗?联合体中个变量之间有什么关系 谢谢

1.同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。
2.共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
3.共用体变量的地址和它的各成员的地址都是同一地址。
4.不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。

所以,你对p赋值,q就失去作用, 对q赋值,p就失去作用。

联合体中各个变量没有关系。无法相互使用。你可以理解为他们是互斥的。
参考技术A 会的, 验证系统是大端格式还是小端格式时用过
所有成员使用同一块内存,彼此重叠存放
提供了一种对数据的不同视角
exp:
exer.p = 'A';
exer.q = 10;
参考技术B 会取到q,两者是联系到一起的

联合变量宏-C语言

在C语言中,联合有以下特性:

  • 存储方面:所有的成员共享一个空间
  • 同一时间只有一个成员是有效的
  • union的大小是其最大的成员
  • 初始化:对第一个成员做初始化

静态本地变量:

  • 在本地变量定义时加上static修饰符就成为静态本地变量
  • 当函数离开的时候,静态本地变量会继续存在并保持其值
  • 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
  • 静态本地变量实际上是特殊的全局变量
  • 它们位于相同的内存区域
  • 静态本地变量具有全局的生存期,函数内的局部作用域
  • static在这里的意思是局部作用域(本地可访问)

*返回指针的函数:

  • 返回本地变量的地址是危险的
  • 返回全局变量或静态变量的地址是安全的
  • 返回在函数内malloc的内存是安全的,但是容易造成问题
  • 最好的做法是返回传入的指针

变量注意:

  • 不要使用全局变量来在函数间传递参数和结果
  • 尽量避免使用全局变量
  • *使用全局变量和静态本地变量的函数是线程不安全的

编译预处理指令:

  • #开头的是编译预处理指令
  • 他们不是C语言成分,但是C离不开它
  • #define用来定义一个宏
  • #define PI 3.14159,#define <名字> <值>
  • 注意没有结尾的分号,因为不是C的语句
  • 名字必须是一个单词,值可以是各种东西
  • 在C语言的编译器开始编译之前,编译预处理程序(cpp)会把程序的名字换成值
  • 完全的文本替换

宏:

  • 如果一个宏的值中有其他的宏的名字,也是会被替换的
  • 如果一个宏的值超过一行,最后一行之前的行末需要加\\
  • 宏的值后面出现的注释不会被当作宏的值的一部分
  • #define_DEBUG,没有值的宏
  • 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了
  • 预定义的宏:
  • _LINE_,_FILE_,_DATE_,_TIME_
  • 带参数的宏:
  • 举例:#define cube(x) ((x)*(x)*(x))
  • 宏可以带参数,其原则如下:
  • 一切都要括号
  • 整个值要括号
  • 参数出现的每个地方都要括号
  • 举例:#define RADTODEG(x) ((x)*57.29)
  • 宏可以带多个参数
  • #define MIN(a,b) ((a)>(b)?(b):(a))
  • 也可以组合(嵌套)使用其他宏

以上是关于C语言中关于联合体中成员变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言中uint是啥意思

联合变量宏-C语言

关于c语言结构体变量成员引用的问题

关于c语言结构体变量成员引用的问题

C语言联合体

关于一个C语言共用体赋值问题