汉扬编程 C语言入门 C语言关键字union的使用

C语言关键字union的使用

在C语言中关键字union和struct用法是一样的,而且在项目中struct随处可见。在我的专栏"嵌入式入门——C语言入门到深入"中我详细的讲解了它们的异同。很多人编码了多年也许会认为有struct就够了,要union干嘛,感觉union的存在有些鸡肋,但是事实真的是这样吗?下面让我来告诉你哪些应用场景union是不能被struct替代的,而且使用union也是唯一能够很好的解决问题的。

C语言关键字union的使用

我在专栏里第十五章 C语言位操作里介绍过位域这个知识点,里面我也书写了个非常经典的例程。经常和微控制芯片(MCU)打交道的嵌入式工程师对位操作一定不陌生,也经常接触各类的中断(中断是指在程序运行的过程中,出现一些"异常"情况,需要MCU干预并转入中断处理情况,处理完后重新运行原程序的过程。计算机的运行就是靠中断来维持的,键盘中断,鼠标中断,屏幕显示中断,扬声器中断等等)。现在我使用联合和位域相结合的办法可以很好的表示它们。比如我定义如下联合体:

C语言关键字union的使用

C语言关键字union的使用

当我们要去使用各个中断的时候,直接使用uint8_t类型的数据很不直观,但是使用里面的位域却可以很好的表达。此时只能使用联合体而不能使用结构体。

C语言关键字union的使用

现在让我们来看看怎么使用它。我先定义两个开关中断的宏,定义如下:

C语言关键字union的使用

C语言关键字union的使用

使用如下:

从上图可以看出,位域结合联合使用是非常好表达的,在代码里能很直观的表达我们自己的意图。下面附上示例的完整代码:

我当前使用的是deepin操作系统,程序运行结果显示为"Interrupts: 0xC0.",至于数据存储模式大小端的知识我在专栏里也介绍过,在此不再赘述。

顺便说下,有人可能会认为在消息队列使用时,由于发送的各个消息各不相同,同一时刻只能发送一个消息,因此可以使用联合来节省空间,这么一看貌似也对,的确可以如此。

但是你想过没有,现在的计算机不差你那点存储空间,可以大胆的去使用结构体也是可以的。如果我使用通用指针是不是是最佳的方案呢?定义如下:

通用指针怎么用,有什么妙用?我在专栏里讲解过该知识点后使用了比较多的示例去使用它,要多用多体会通用指针的妙用才好。

通过这一篇文章,希望你可以对联合有了一个更加深刻的认识,知道什么场景才是最适合它的。

const在C语言中有哪些用法?

  const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C 、PHP5、C#。
  net、HC08 C。
  (1)可以定义const常量,具有不可变性。
  例如:const int Max=100; Max 会产生错误;
  (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
  
  例如: void f(const int i) { 。。。。。。。。。} 编译器就会知道i是一个常量,不允许修改;
  (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
  如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可!
  (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
   还是上面的例子,如果在函数体内修改了i,编译器就会报错;
  例如: void f(const int i) { i=10;//error! }。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6118.html

请问,C语言的&运算符取的是逻辑地址还是物理地址?

《零基础看得懂的C语言入门教程》——(七)循环分分钟上手

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部