c程序设计语言 by K&R(三)结构

一、类型定义 typedef

typedef int Length;
typedef char* String;
typedef struct tnode* Treeptr;
typedef int (*PFI)(char*, char*);

二、联合 union

一个变量可以合法地保存多种数据类型中任何一种类型的对象。

union u_tag{
  int ival;
  float fval;
  char* sval;
}u;
  1. u变量必须能保存三种类型中最大的一种。这些类型中的任何一种对象都可以赋值给u。
  2. 读取的类型必须是最后一次存入的类型。
  3. 联合只能用其第一个类型的值进行初始化。即上面的示例中只能用int进行初始化。
  4. 访问方式:
  • 联合.成员
  • 联合指针->成员

三、位字段

  1. 什么是位字段?

在存储空间很宝贵的情况下,可能需要将多个对象保存在一个机器字中。C语言中提供了一种直接定义和访问一个字中的位字段的能力。
例如:

#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04

enum {KEYWORD = 01, EXTERNAL = 02, STATIC = 04};

可替换为

struct {
  unsigned int is_keyword : 1;
  unsigned int is_external: 1;
  unsigned int is_static: 1;
}flags;

:后的数字表示字段的宽度,用二进制表示。

  1. 引用方式:

flags.is_extern = flags.is_external = 1;

#include <stdio.h>
#include <stdlib.h>

struct {
	unsigned int a:1;
	unsigned int b:1;
	unsigned int c:1;
}flags;

int main(void) {
	flags.a = flags.b = flags.c = 1;
	printf("%d %d %d\n", flags.a, flags.b, flags.c);
	return 0;
}
1 1 1
  1. 字段不是数组,并且没有地址,不能对其使用&运算符。
原文地址:https://www.cnblogs.com/qiangz/p/15790562.html