共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
共用体提供了一种使用相同的内存位置的有效方式。

union 语句的格式如下:
union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one&nbs***bsp;more union variables];
例如:
union Data
{
   int i;
   float f;
   char  str[20];
} data;
Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。

访问共用体成员
访问共用体的成员,使用成员访问运算符(.)可以使用 union 关键字来定义共用体类型的变量。
实例
#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        
 
   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");
 
   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);
 
   return 0;
}
代码被编译和执行时,它会产生下列结果:
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
可以看到共用体的 if 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因。

使用共用体的作用就是节省内存空间
😮当数据项使用2种或者多种格式但又不会同时使用时,使用共用体可以节省内存空间。
例如:假设管理一些商品目录,其中一些商品的ID是整数,二另一些商品的ID是字符串。在这种情况下,可以这样做:
struct widget

{
	char brand[20];

	int type;

	union id //声明共用体id

	{

		long id_num;

		char id_cahr[20];

	}id_val; //创建共用体变量id_val作为结构体的数据成员
};

C++用于嵌入式系统编程,例如控制冰箱、音乐播放器、可穿戴设备等,对这些系统来说,内存可能非常宝贵,这个时候就可以体现共用体的价值。另外,共用体常用于操作系统数据结构和硬件数据结构。



C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。

实例
为单字节数字定义了一个术语 BYTE
typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;
 
int main( )
{
   Book book;

😮typedef vs #define
  • typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
  • typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。



 输入 & 输出

当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。

当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。


😮C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。

以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
标准文件 文件指针 设备
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 您的屏幕

文件指针是访问文件的方式。


C 语言中的 I/O (输入/输出) 通常使用 printf() scanf() 两个函数。

scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。

实例解析:

  • 所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
  • printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。
  • stdio.h 是一个头文件 (标准输入输出头文件) and #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
  • return 0; 语句用于表示退出程序。
%d 格式化输出整数
%f 格式化输出浮点型数据
#include <stdio.h>
int main()
{
    int testInteger = 5;
    float f;
// %f 匹配浮点型数据
			
    scanf("%f",&f);
    printf("Value = %f", f);
    printf("Number = %d", testInteger);     return 0; }
在 printf() 函数的引号中使用 "%d" (整型) 来匹配整型变量 testInteger ,“%f“匹配浮点型变量f 并输出到屏幕。



getchar() & putchar() 函数

int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

gets() & puts() 函数

char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。

int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout

scanf() 和 printf() 函数

int scanf(const char *format, ...) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。

int printf(const char *format, ...) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。          
 format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用。
例如
   char str[100];
   int i;
 
   printf( "Enter a value :");
   scanf("%s %d", str, &i);
 
   printf( "\nYou entered: %s %d ", str, i)
scanf() 期待输入的格式与您给出的 %s 火 %d 相同,这意味着您必须提供有效的输入;另外,在读取字符串时,只要遇到一个空格,scanf() 就会停止读取,所以 "this is test" 对 scanf() 来说是三个字符串。