以下是一个简要而全面的C语言教程,旨在帮助你快速复习或掌握C语言的核心概念。内容涵盖基本语法、数据类型、控制结构、函数、数组、指针、结构体、文件操作等关键知识点,结构清晰,适合快速浏览。


1. C语言简介

C语言是一种通用的、结构化的编程语言,由Dennis Ritchie在20世纪70年代开发,广泛用于系统编程、嵌入式开发和应用软件开发。C语言以高效、灵活和底层操作能力著称。

2. 基本程序结构

一个简单的C程序结构如下:

#include <stdio.h> // 包含标准输入输出库
int main() {       // 主函数,程序入口
    printf("Hello, World!\n"); // 打印输出
    return 0;      // 返回0表示程序正常结束
}
  • #include:引入头文件,如<stdio.h>用于输入输出。
  • main函数:程序的入口点,必须返回int类型。
  • 注释
    • 单行:// 注释内容
    • 多行:/* 注释内容 */

3. 数据类型

C语言支持以下基本数据类型:

  • 基本类型
    • int:整数(如int x = 10;
    • float:单精度浮点数(如float y = 3.14;
    • double:双精度浮点数(如double z = 3.14159;
    • char:字符(如char c = 'A';
  • 修饰符
    • signed/unsigned:有符号/无符号(如unsigned int
    • short/long:短整型/长整型(如long int
  • 其他
    • void:表示无类型,常用于函数无返回值或指针。
    • 枚举:enum color {RED, GREEN, BLUE};
    • 派生类型:数组、指针、结构体(见后文)。

4. 变量与常量

  • 变量声明type variable_name = value;(如int x = 5;
  • 常量
    • 字面常量:如42"hello"
    • 使用const关键字:const float PI = 3.14159;
    • 宏定义:#define PI 3.14159
  • 作用域
    • 局部变量:函数内部定义,仅在函数内有效。
    • 全局变量:定义在函数外部,整个程序有效。

5. 输入与输出

使用<stdio.h>提供的函数:

  • 输出
    • printf("格式化字符串", 变量);(如printf("x = %d", x);
    • 格式说明符:%d(整数)、%f(浮点数)、%c(字符)、%s(字符串)。
  • 输入
    • scanf("%d", &x);(读取整数,注意&取地址)。
    • 示例:
      int x;
      printf("Enter a number: ");
      scanf("%d", &x);
      printf("You entered: %d\n", x);
      

6. 运算符

  • 算术+, -, *, /, %(取模)
  • 关系==, !=, >, <, >=, <=
  • 逻辑&&(与)、||(或)、!(非)
  • 位运算&(按位与)、|(按位或)、^(异或)、~(取反)、<<(左移)、>>(右移)
  • 赋值=, +=, -=, *=, /=, %=
  • 其他
    • 自增/自减:++, --
    • 条件运算符:条件 ? 表达式1 : 表达式2

7. 控制结构

  • 条件语句
    if (条件) {
        // 代码
    } else if (条件) {
        // 代码
    } else {
        // 代码
    }
    
    • 三元运算符:x > y ? x : y
  • 开关语句
    switch (变量) {
        case 1:
            // 代码
            break;
        case 2:
            // 代码
            break;
        default:
            // 默认代码
    }
    
  • 循环
    • forfor (初始化; 条件; 更新) { 代码 }
    • whilewhile (条件) { 代码 }
    • do-whiledo { 代码 } while (条件);
    • 控制:break(跳出循环)、continue(跳到下一次循环)。

8. 函数

函数用于模块化代码:

  • 定义
    返回类型 函数名(参数类型 参数) {
        // 代码
        return ; // 如果返回类型不是void
    }
    
    • 示例:
      int add(int a, int b) {
          return a + b;
      }
      
  • 调用int sum = add(3, 4);
  • 函数声明:在调用前声明函数原型,如int add(int, int);
  • 递归:函数调用自身,如计算阶乘:
    int factorial(int n) {
        if (n <= 1) return 1;
        return n * factorial(n - 1);
    }
    

9. 数组

数组存储相同类型的元素:

  • 声明type array_name[大小];(如int arr[5];
  • 初始化int arr[5] = {1, 2, 3, 4, 5};
  • 访问arr[索引](索引从0开始)
  • 多维数组:如int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
  • 遍历
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    

10. 指针

指针存储变量的内存地址:

  • 声明type *pointer_name;(如int *p;
  • 赋值p = &x;&取地址)
  • 解引用*p访问指针指向的值
  • 指针与数组
    • 数组名是首元素地址:int *p = arr;
    • 指针运算:p + 1指向下一个元素。
  • 动态内存分配(需要<stdlib.h>):
    • 分配:int *p = malloc(sizeof(int) * n);
    • 释放:free(p);
    • 重新分配:p = realloc(p, 新大小);

11. 字符串

C中字符串是字符数组,以空字符'\0'结尾:

  • 声明char str[10] = "hello";
  • 操作(需要<string.h>):
    • 复制:strcpy(dest, src);
    • 连接:strcat(dest, src);
    • 比较:strcmp(str1, str2);
    • 长度:strlen(str);
  • 输入输出
    • 输出:printf("%s", str);
    • 输入:scanf("%s", str);(不读空格)或fgets(str, sizeof(str), stdin);

12. 结构体

结构体用于存储不同类型的数据:

  • 定义
    struct Point {
        int x;
        int y;
    };
    
  • 声明与访问
    struct Point p = {3, 4};
    printf("x: %d, y: %d\n", p.x, p.y);
    
  • 指针访问struct Point *ptr = &p; ptr->x;
  • typedef:简化定义,如typedef struct Point Point;

13. 文件操作

使用<stdio.h>进行文件读写:

  • 打开文件FILE *fp = fopen("file.txt", "r");(模式:r读、w写、a追加)
  • 读写
    • 读字符:fgetc(fp);
    • 写字符:fputc('A', fp);
    • 读字符串:fgets(str, sizeof(str), fp);
    • 写字符串:fputs(str, fp);
    • 格式化读写:fscanf(fp, "%d", &x);, fprintf(fp, "%d", x);
  • 关闭文件fclose(fp);
  • 检查文件结束feof(fp)

14. 预处理器

  • 宏定义#define NAME value
  • 条件编译
    #ifdef DEBUG
        printf("Debug mode\n");
    #endif
    
  • 头文件包含#include <file.h>#include "file.h"

15. 常见库函数

  • <stdlib.h>malloc, free, rand, atoi
  • <math.h>sqrt, pow, sin, cos
  • <time.h>time, clock
  • <ctype.h>isalpha, isdigit, toupper

16. 示例程序

计算数组平均值:

#include <stdio.h>
float average(int arr[], int size) {
    float sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum / size;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    printf("Average: %.2f\n", average(arr, size));
    return 0;
}

17. 调试与错误处理

  • 常见错误
    • 空指针:访问未初始化的指针。
    • 数组越界:访问非法索引。
    • 内存泄漏:未释放动态分配的内存。
  • 调试工具:使用gdb或IDE调试器。
  • 错误检查:检查函数返回值(如fopen返回NULL)。

18. 学习建议

  • 实践:编写小项目,如计算器、学生管理系统。
  • 调试:熟练使用printf调试或调试工具。
  • 资源:参考《C Primer Plus》或在线教程(如Learn-C.org)。
  • 练习:尝试解决LeetCode的C语言题目。

这个教程涵盖了C语言的核心内容,适合快速复习。如果需要深入某个部分或代码示例,请告诉我!