共用体(联合体)

定义与语法
共用体是一种自定义类型,所有成员共享同一块内存空间,其大小由最大成员决定。语法如下:

union 类型名 {
    数据类型 成员1;
    数据类型 成员2;
    // ...
};

示例

union DATA {
    int a;
    char c;
    float f;
};

特性

  • 成员共享内存,修改任一成员会影响其他成员的值。
  • 大小为最大成员的大小(如 union DATA 的大小为 sizeof(float))。

应用场景

  • 大小端判断:通过共用体访问同一内存的不同类型数据。
  • 函数参数传递:如 Linux 的 epoll 事件结构体中使用共用体传递不同事件类型。

枚举类型

定义与语法
枚举用于定义一组命名的整型常量,限定变量的取值范围。语法如下:

enum 类型名 { 枚举值1, 枚举值2, ... };

示例

enum WEEK { MON=0, TUE, WED, THU=5, FRI, SAT, SUN };

特性

  • 默认从 0 开始递增,可显式赋值(如 THU=5 后 FRI 为 6)。
  • 枚举值为 int 类型,可直接用于整型表达式。

应用场景

  • 搭配 switch:提高代码可读性。
  • 状态标识:如月份、星期等有限集合。

代码示例

typedef enum { JAN, FEB, MAR, ..., JULY } MONTH;
MONTH mon = MAY;
switch (mon) {
    case JAN: printf("January\n"); break;
    // ...
}


位操作

运算符与功能

运算符功能示例
&按位与a & b(清特定位为 0)
``按位或
^按位异或a ^ b(交换两数)
~按位取反~a(所有位反转)
<<左移(低位补 0)a << 2
>>右移(逻辑/算术)a >> 2

应用场景

  • 硬件寄存器操作:如设置或清除特定位。
  • 数据交换:通过异或实现无临时变量的两数交换。

示例

int a = 20, b = 10;
a = a ^ b;  // 异或交换
b = a ^ b;
a = a ^ b;


堆内存管理

核心函数

  • malloc(size_t size):动态申请指定大小的内存。
  • free(void *ptr):释放已申请的内存。

注意事项

  • 内存泄漏:未释放不再使用的内存,导致程序最终崩溃。
  • 野指针:释放后未置空指针,可能引发非法访问。

示例

int *arr = (int *)malloc(10 * sizeof(int));
if (arr != NULL) {
    // 使用内存
    free(arr);
    arr = NULL;  // 避免野指针
}

更多推荐