【C语言】基础知识框架补充

发布于:2025-06-14 ⋅ 阅读:(21) ⋅ 点赞:(0)

前文主要介绍了C语言从零开始学习的基本框架与基础知识导览,本文主要补充此前未提及的学习内容,给有意精进C语言者指明一条可供参考的学习路径。

补充一:动态内存管理

  1. 核心函数(需#include <stdlib.h>):

    • malloc(size):申请size字节的连续内存,返回首地址(类型为void*)。

    • calloc(n, size):申请n*size字节内存,并初始化为0。

    • realloc(ptr, new_size):调整已分配内存块大小。

    • free(ptr):释放内存,防止内存泄漏。

  2. 示例

    int *arr = (int*)malloc(5 * sizeof(int)); // 动态数组
    if (arr == NULL) exit(1);                // 检查分配成功
    arr[0] = 10;
    free(arr);                               // 释放内存

补充二:枚举类型(enum)

  1. 定义与使用

    enum Weekday {Sun=7, Mon=1, Tue, Wed}; // Tue自动=2
    enum Weekday day = Mon;                 // day值为1
    • 用途:提高代码可读性,限定变量取值范围。


补充三:类型定义(typedef)

  1. 作用:为现有类型创建别名。

    typedef int Integer;       // Integer 是 int 别名
    typedef struct Node {      // 简化结构体声明
        int data;
        struct Node *next;
    } Node;
    Node n;                    // 直接使用别名

补充四:位运算

  1. 运算符

    • &(按位与)、|(按位或)、^(按位异或)

    • ~(按位取反)、<<(左移)、>>(右移)

  2. 应用场景

    • 硬件控制:PORT |= 0x01;(设置最低位为1)

    • 数据压缩:用位存储多个布尔值。

    • 示例:a = b << 2; → b左移2位(等价于b*4)。


补充五:命令行参数

  1. main函数参数

    int main(int argc, char *argv[]) {
        // argc: 参数个数(至少为1,程序名本身)
        // argv: 参数字符串数组
        printf("程序名: %s\n", argv[0]);
        if (argc > 1) printf("第一个参数: %s\n", argv[1]);
    }
    • 执行:

      ./program arg1 arg2 → argc=3, argv[1]="arg1"。

补充六:const关键字

  1. 作用

    • 定义常量:const int MAX=100;(值不可修改)

    • 保护指针:

      const int *p = &a;  // *p只读(指向的值不可改)
      int *const p = &a;  // p只读(指向不可改)

补充七:预处理器高级用法

  1. 条件编译

    #ifdef DEBUG            // 若定义了DEBUG宏
        printf("调试信息");
    #endif
  2. 预定义宏

    • __LINE__:当前行号

    • __FILE__:当前文件名

    • __DATE__:编译日期


补充八:联合体(union)

  1. 特点:所有成员共享同一内存空间(大小为最大成员的大小)。

  2. 应用:节省内存,同一时间只存储一个成员值。

    union Data {
        int i;
        float f;
        char str[20];
    };
    union Data d;
    d.i = 10;               // 此时d.f和d.str无意义

补充九:文件定位函数

  1. 核心函数

    • fseek(fp, offset, whence):移动文件指针。

      • whenceSEEK_SET(文件头)、SEEK_CUR(当前位置)、SEEK_END(文件尾)。

    • ftell(fp):返回当前文件指针位置。

    • rewind(fp):重置指针到文件头。

  2. 示例

    fseek(fp, 10, SEEK_SET); // 定位到文件头后第10字节
    long pos = ftell(fp);    // 获取当前位置

关键总结

  1. 动态内存管理是C语言核心难点,需严格配对malloc/free

  2. 位运算在嵌入式开发中至关重要。

  3. const和typedef提升代码健壮性和可读性。

  4. 联合体在协议解析、类型转换中高效实用。

  5. 文件定位实现随机读写,突破顺序访问限制。