**编程基础学习(二)-C语言变量、控制结构和函数

一、环境配置与第一个程序

  • 安装编译器

    Ubuntu/Debian

    sudo apt-get install gcc

    CentOS/RHEL

    sudo yum install gcc

    macOS

    brew install gcc

    Windows

    安装MinGW或使用Visual Studio

  • 第一个C程序

    #include <stdio.h>

    int main() {
    printf("Hello, World!\n");
    return 0;
    }

  • 编译和运行

    gcc hello.c -o hello
    ./hello

二、基本语法

  • 注释

    // 单行注释

    /*
    多行注释
    可以跨越多行
    */

  • 变量声明

    #include <stdio.h>

    int main() {
    int age = 25; // 整型变量
    float salary = 5000.50; // 浮点型变量
    char grade = 'A'; // 字符型变量

    复制代码
      printf("Age: %d\n", age);
      printf("Salary: %.2f\n", salary);
      printf("Grade: %c\n", grade);
      
      return 0;

    }

三、数据类型

  • 基本数据类型

    #include <stdio.h>
    #include <limits.h>

    int main() {
    // 整型
    int integer = 100;
    short short_int = 32767;
    long long_int = 100000L;

    复制代码
      // 浮点型
      float float_num = 3.14159f;
      double double_num = 3.1415926535;
      
      // 字符型
      char character = 'C';
      
      // 布尔型 (C99标准)
      #include <stdbool.h>
      bool is_true = true;
      
      printf("Integer: %d\n", integer);
      printf("Float: %.5f\n", float_num);
      printf("Double: %.10f\n", double_num);
      printf("Character: %c\n", character);
      printf("Boolean: %d\n", is_true);
      
      return 0;

    }

  • 类型转换

    #include <stdio.h>

    int main() {
    // 隐式类型转换
    int a = 10;
    float b = 3.5;
    float result = a + b; // a被转换为float

    复制代码
      // 显式类型转换
      float pi = 3.14159;
      int integer_pi = (int)pi;
      
      printf("Result: %.2f\n", result);
      printf("Integer PI: %d\n", integer_pi);
      
      return 0;

    }

四、运算符

  • 算术运算符

    #include <stdio.h>

    int main() {
    int a = 10, b = 3;

    复制代码
      printf("a + b = %d\n", a + b);  // 加法
      printf("a - b = %d\n", a - b);  // 减法
      printf("a * b = %d\n", a * b);  // 乘法
      printf("a / b = %d\n", a / b);  // 除法
      printf("a %% b = %d\n", a % b); // 取模
      
      // 自增自减
      int x = 5;
      printf("x++: %d\n", x++);  // 后置自增
      printf("++x: %d\n", ++x);  // 前置自增
      
      return 0;

    }

  • 关系运算符

    #include <stdio.h>

    int main() {
    int a = 10, b = 20;

    复制代码
      printf("a == b: %d\n", a == b);  // 等于
      printf("a != b: %d\n", a != b);  // 不等于
      printf("a > b: %d\n", a > b);    // 大于
      printf("a < b: %d\n", a < b);    // 小于
      printf("a >= b: %d\n", a >= b);  // 大于等于
      printf("a <= b: %d\n", a <= b);  // 小于等于
      
      return 0;

    }

  • 逻辑运算符

    #include <stdio.h>

    int main() {
    int a = 1, b = 0;

    复制代码
      printf("a && b: %d\n", a && b);  // 逻辑与
      printf("a || b: %d\n", a || b);  // 逻辑或
      printf("!a: %d\n", !a);          // 逻辑非
      
      return 0;

    }

五、控制结构

  • 条件语句

    #include <stdio.h>

    int main() {
    int score = 85;

    复制代码
      // if-else语句
      if (score >= 90) {
          printf("Grade: A\n");
      } else if (score >= 80) {
          printf("Grade: B\n");
      } else if (score >= 70) {
          printf("Grade: C\n");
      } else {
          printf("Grade: F\n");
      }
      
      // switch语句
      char grade = 'B';
      switch (grade) {
          case 'A':
              printf("Excellent!\n");
              break;
          case 'B':
              printf("Good!\n");
              break;
          case 'C':
              printf("Average!\n");
              break;
          default:
              printf("Need improvement!\n");
      }
      
      return 0;

    }

  • 循环语句

    #include <stdio.h>

    int main() {
    int i;

    复制代码
      // for循环
      printf("For loop: ");
      for (i = 0; i < 5; i++) {
          printf("%d ", i);
      }
      printf("\n");
      
      // while循环
      printf("While loop: ");
      i = 0;
      while (i < 5) {
          printf("%d ", i);
          i++;
      }
      printf("\n");
      
      // do-while循环
      printf("Do-while loop: ");
      i = 0;
      do {
          printf("%d ", i);
          i++;
      } while (i < 5);
      printf("\n");
      
      // break和continue
      printf("Break example: ");
      for (i = 0; i < 10; i++) {
          if (i == 5) break;
          printf("%d ", i);
      }
      printf("\n");
      
      printf("Continue example: ");
      for (i = 0; i < 5; i++) {
          if (i == 2) continue;
          printf("%d ", i);
      }
      printf("\n");
      
      return 0;

    }

六、函数

  • 函数定义和调用

    #include <stdio.h>

    // 函数声明
    int add(int a, int b);
    void print_message();

    // 主函数
    int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);

    复制代码
      print_message();
      return 0;

    }

    // 函数定义
    int add(int a, int b) {
    return a + b;
    }

    void print_message() {
    printf("Hello from function!\n");
    }

  • 递归函数

    #include <stdio.h>

    // 递归计算阶乘
    int factorial(int n) {
    if (n <= 1) {
    return 1;
    }
    return n * factorial(n - 1);
    }

    int main() {
    int num = 5;
    printf("Factorial of %d is %d\n", num, factorial(num));
    return 0;
    }

七、数组

  • 一维数组

    #include <stdio.h>

    int main() {
    // 数组声明和初始化
    int numbers[5] = {1, 2, 3, 4, 5};
    float grades[3] = {85.5, 90.0, 78.5};

    复制代码
      // 访问数组元素
      printf("First number: %d\n", numbers[0]);
      printf("Third grade: %.1f\n", grades[2]);
      
      // 遍历数组
      printf("All numbers: ");
      for (int i = 0; i < 5; i++) {
          printf("%d ", numbers[i]);
      }
      printf("\n");
      
      return 0;

    }

  • 多维数组

    #include <stdio.h>

    int main() {
    // 二维数组
    int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
    };

    复制代码
      // 访问二维数组
      printf("Element at [1][2]: %d\n", matrix[1][2]);
      
      // 遍历二维数组
      printf("Matrix:\n");
      for (int i = 0; i < 2; i++) {
          for (int j = 0; j < 3; j++) {
              printf("%d ", matrix[i][j]);
          }
          printf("\n");
      }
      
      return 0;

    }

八、指针

  • 基本指针操作

    #include <stdio.h>

    int main() {
    int number = 100;
    int *ptr = &number; // 指针指向number的地址

    复制代码
      printf("Value of number: %d\n", number);
      printf("Address of number: %p\n", &number);
      printf("Value of pointer: %p\n", ptr);
      printf("Value pointed by pointer: %d\n", *ptr);
      
      // 通过指针修改变量值
      *ptr = 200;
      printf("New value of number: %d\n", number);
      
      return 0;

    }

  • 指针与数组

    #include <stdio.h>

    int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr; // 指向数组首元素

    复制代码
      printf("Array elements using pointer:\n");
      for (int i = 0; i < 5; i++) {
          printf("arr[%d] = %d\n", i, *(ptr + i));
      }
      
      return 0;

    }

  • 指针与函数

    #include <stdio.h>

    // 通过指针交换两个变量的值
    void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
    }

    int main() {
    int x = 10, y = 20;

    复制代码
      printf("Before swap: x = %d, y = %d\n", x, y);
      swap(&x, &y);
      printf("After swap: x = %d, y = %d\n", x, y);
      
      return 0;

    }

九、结构体

  • 结构体定义和使用

    #include <stdio.h>
    #include <string.h>

    // 定义结构体
    struct Student {
    char name[50];
    int age;
    float grade;
    };

    int main() {
    // 声明结构体变量
    struct Student student1;

    复制代码
      // 初始化结构体成员
      strcpy(student1.name, "张三");
      student1.age = 20;
      student1.grade = 88.5;
      
      // 访问结构体成员
      printf("Student Name: %s\n", student1.name);
      printf("Student Age: %d\n", student1.age);
      printf("Student Grade: %.1f\n", student1.grade);
      
      // 结构体数组
      struct Student students[3] = {
          {"李四", 21, 92.0},
          {"王五", 19, 85.5},
          {"赵六", 22, 78.0}
      };
      
      printf("\nAll students:\n");
      for (int i = 0; i < 3; i++) {
          printf("%s, %d, %.1f\n", 
                 students[i].name, 
                 students[i].age, 
                 students[i].grade);
      }
      
      return 0;

    }

  • 结构体与指针

    #include <stdio.h>

    struct Point {
    int x;
    int y;
    };

    int main() {
    struct Point p1 = {10, 20};
    struct Point *ptr = &p1;

    复制代码
      // 通过指针访问结构体成员
      printf("Point coordinates: (%d, %d)\n", ptr->x, ptr->y);
      
      // 修改结构体成员
      ptr->x = 30;
      ptr->y = 40;
      printf("New coordinates: (%d, %d)\n", p1.x, p1.y);
      
      return 0;

    }

十、文件操作

  • 文件读写

    #include <stdio.h>

    int main() {
    FILE *file;
    char text[100];

    复制代码
      // 写入文件
      file = fopen("example.txt", "w");
      if (file == NULL) {
          printf("Error opening file for writing!\n");
          return 1;
      }
      fprintf(file, "Hello, File!\n");
      fprintf(file, "This is a test file.\n");
      fclose(file);
      
      // 读取文件
      file = fopen("example.txt", "r");
      if (file == NULL) {
          printf("Error opening file for reading!\n");
          return 1;
      }
      
      printf("File contents:\n");
      while (fgets(text, sizeof(text), file) != NULL) {
          printf("%s", text);
      }
      fclose(file);
      
      return 0;

    }

  • 二进制文件操作

    #include <stdio.h>

    struct Data {
    int id;
    float value;
    };

    int main() {
    FILE *file;
    struct Data data;

    复制代码
      // 写入二进制数据
      file = fopen("data.bin", "wb");
      if (file == NULL) {
          printf("Error opening binary file for writing!\n");
          return 1;
      }
      
      struct Data write_data = {1, 3.14};
      fwrite(&write_data, sizeof(struct Data), 1, file);
      fclose(file);
      
      // 读取二进制数据
      file = fopen("data.bin", "rb");
      if (file == NULL) {
          printf("Error opening binary file for reading!\n");
          return 1;
      }
      
      fread(&data, sizeof(struct Data), 1, file);
      printf("Read data: id=%d, value=%.2f\n", data.id, data.value);
      fclose(file);
      
      return 0;

    }

十一、内存管理

  • 动态内存分配

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

    int main() {
    int *arr;
    int n;

    复制代码
      printf("Enter the size of array: ");
      scanf("%d", &n);
      
      // 动态分配内存
      arr = (int*)malloc(n * sizeof(int));
      
      if (arr == NULL) {
          printf("Memory allocation failed!\n");
          return 1;
      }
      
      // 使用动态数组
      printf("Enter %d integers:\n", n);
      for (int i = 0; i < n; i++) {
          scanf("%d", &arr[i]);
      }
      
      printf("You entered: ");
      for (int i = 0; i < n; i++) {
          printf("%d ", arr[i]);
      }
      printf("\n");
      
      // 释放内存
      free(arr);
      
      return 0;

    }

  • 其他内存函数

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

    int main() {
    // malloc - 分配未初始化的内存
    int ptr1 = (int)malloc(5 * sizeof(int));

    复制代码
      // calloc - 分配并初始化为0的内存
      int *ptr2 = (int*)calloc(5, sizeof(int));
      
      // realloc - 重新分配内存
      ptr1 = (int*)realloc(ptr1, 10 * sizeof(int));
      
      printf("calloc initialized to zeros:\n");
      for (int i = 0; i < 5; i++) {
          printf("%d ", ptr2[i]);
      }
      printf("\n");
      
      // 释放内存
      free(ptr1);
      free(ptr2);
      
      return 0;

    }

十二、编译和调试技巧

  • 常用编译选项

    基本编译

    gcc program.c -o program

    显示所有警告

    gcc -Wall program.c -o program

    调试信息

    gcc -g program.c -o program

    优化级别

    gcc -O2 program.c -o program

    指定标准

    gcc -std=c99 program.c -o program

  • 预处理指令

    #include <stdio.h>
    #define PI 3.14159
    #define MAX(a, b) ((a) > (b) ? (a) : (b))

    int main() {
    printf("PI = %.5f\n", PI);
    printf("MAX(10, 20) = %d\n", MAX(10, 20));

    复制代码
      #ifdef DEBUG
          printf("Debug mode enabled\n");
      #endif
      
      return 0;

    }

总结:这份C语言基础指南涵盖了从基本语法到高级特性的核心概念,包括变量、控制结构、函数、指针、结构体、文件操作和内存管理。掌握这些基础知识是学习更高级C语言编程和系统开发的必要条件。

相关推荐
金水谣3 小时前
10.12考研笔记
笔记
fanged3 小时前
HarvardX TinyML小笔记3(番外6:视觉探测)(TODO)
笔记
摇滚侠3 小时前
Spring Boot 3零基础教程,Spring Boot 特性介绍,笔记02
java·spring boot·笔记
武清伯MVP3 小时前
阮一峰《TypeScript 教程》学习笔记——基本用法
笔记·学习·typescript
要做朋鱼燕3 小时前
STM32与W25Q64 SPI通信全解析
笔记·嵌入式·hal·spi
轻赚时代3 小时前
新手做国风视频难?AI + 敦煌美学高效出片教程
人工智能·经验分享·笔记·创业创新·课程设计·学习方法
我的xiaodoujiao3 小时前
从 0 到 1 搭建完整 Python 语言 Web UI自动化测试学习系列 17--测试框架Pytest基础 1--介绍使用
python·学习·测试工具·pytest
霖003 小时前
ZYNQ裸机开发指南笔记
人工智能·经验分享·笔记·matlab·fpga开发·信号处理
Dream Algorithm4 小时前
物联网卡的TAC
笔记