C语言基础内容整理

1 阅读4分钟

1.数据类型、常量与变量

基础数据类型表

类型关键字含义通常字节取值范围/说明
int整型4字节-21亿~21亿(通常)
short短整型2字节-32768~32767
long长整形4字节或8字节依据平台而定,用于大整数
char字符型1字节有符号:-128~127,无符号:0~255,本质是ASCII码
float单精度浮点型4字节精度为6~7位小数
double双精度浮点型8字节精度为16~17位小数
void无类型用于指针或函数返回值

修饰符

  • signed / unsigned:有符号(可存负数)和无符号(只存正数)。
  • const:常量,定义后不可修改。
  • volatile:告诉编译器该变量可能被程序以外的因素修改(如硬件寄存器),每次使用都要重新读取。

变量定义与初始化

int age = 20;          // 定义整型变量并初始化
float pi = 3.14159f;   // 注意浮点数后加 f
char grade = 'A';      // 字符用单引号
const double PI = 3.14159; // 常量,不能被赋值

注意事项:

  • float 精度不够时用 <font style="color:rgb(6, 10, 38);">double</font>
  • char 存储的是 ASCII 值, 'A' == 65
  • a++ 先使用后自增,++a 先自增后使用

实际代码进阶使用

在嵌入式中,通常使用<stdint.h>中的固定宽度类型以确保跨平台兼容性。

#include <stdint.h> // 包含标准整数类型头文件
uint8_t  led_status;  // 无符号8位整数 (0-255),常用于GPIO状态
int16_t  temperature; // 有符号16位整数,常用于温度传感器读数

2.运算符与表达式

运算符是处理数据的工具。

运算符分类

• 算术运算符: +, -, *, /, %(取余)。
• 关系运算符: >, <, ==, !=
• 逻辑运算符: &&(与), ||(或), !(非)。
• 位运算符(嵌入式重点): &(按位与), |(按位或), ^(异或), ~(取反), <<(左移), >>(右移)。
• 赋值运算符: =, +=, -=, *=, /=
• 自增/自减: ++, --

注意事项:

• 类型转换: intfloat 运算时,int 会自动转为 float。强制类型转换使用 (type)value
• 运算符优先级: 算术 > 关系 > 逻辑。不确定时请加括号 ()

代码示例:

#include <stdio.h>

#define PI 3.14159

int main() {
    int age = 20;
    float height = 1.75f;
    char grade = 'A';
    const int MAX_SCORE = 100;

    printf("Age: %d, Height: %.2f, Grade: %c\n", age, height, grade);
    printf("PI: %f, Max Score: %d\n", PI, MAX_SCORE);

    int a = 5;
    printf("a++ = %d, ++a = %d\n", a++, ++a); // 注意顺序!

    return 0;
}

3.输入输出与格式化

标准输入输出

printf():格式化输出到屏幕。
scanf():格式化输入。

格式控制符

控制符说明
%d十进制整数
%u无符号十进制整数
%f浮点数
%c单个字符
%s字符串
%x十六进制整数(小写)
%p指针地址

注意事项:

  • scanf("%d", &var); 必须传地址
  • 多变量输入空格分隔
  • getchar() 读取单个字符(包括换行)
  • scanf 读字符串遇空格停止,可用 fgets 替代
  • 输入数字后按回车,残留 \n 会影响下次 getchar()
  • 解决:在 scanf 后加 getchar() 吃掉换行符
#include <stdio.h>

int main() {
    int num;
    float price;
    char name[20];

    printf("请输入姓名:");
    scanf("%s", name);  // 字符串不需要 &

    printf("请输入年龄和价格:");
    scanf("%d %f", &num, &price);

    printf("\n=== 信息汇总 ===\n");
    printf("姓名:%s\n", name);
    printf("年龄:%d\n", num);
    printf("价格:%.2f\n", price);

    return 0;
}

4.控制语句

控制程序的执行流程。

  • 条件判断:if, else if, else, switch-case
  • 循环结构:for, while, do-while
  • 跳转语句:break, continue, goto(慎用)

注意:

  • switch 只支持整型/字符型
  • case末尾通常需要 break,否则会发生“穿透”(fall-through)
  • for(初始化; 条件; 更新) 最常用
  • do-while 至少执行一次
  • break 跳出当前循环或 switch,continue 跳过本次迭代
#include <stdio.h>

int main() {
    int score = 85;

    // if-else
    if (score >= 90) {
        printf("优秀\n");
    } else if (score >= 80) {
        printf("良好\n");
    } else {
        printf("及格\n");
    }

    // switch
    char grade = 'B';
    switch (grade) {
        case 'A': printf("90-100\n"); break;
        case 'B': printf("80-89\n"); break;
        default: printf("其他\n");
    }

    // for 循环
    printf("1 到 5 的和:");
    int sum = 0;
    for (int i = 1; i <= 5; i++) {
        sum += i;
    }
    printf("%d\n", sum);

    // while 循环
    int count = 3;
    while (count > 0) {
        printf("倒计时:%d\n", count--);
    }

    // do-while
    int x = 0;
    do {
        printf("至少执行一次\n");
        x++;
    } while (x < 1);

    return 0;
}

5.数组与字符串

数组

• 一组相同类型数据的集合。
• 通过下标访问,下标从 0 开始。
• 一维数组: int arr[5] = {1, 2, 3, 4, 5};
• 多维数组: int matrix[3][3];(二维数组,常用于矩阵运算)。

字符串

  • 字符数组,并以 \0 结尾。
  • 字符串处理函数(string.h):

strlen(str):获取字符串长度。
strcpy(dest, src):字符串复制。
strcmp(str1, str2):字符串比较。
strcat(dest, src):字符串连接。

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

int main() {
    // 一维数组
    int nums[5] = {1, 2, 3, 4, 5};
    printf("数组元素:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", nums[i]);
    }
    printf("\n");

    // 二维数组
    int matrix[2][3] = {{1,2,3}, {4,5,6}};
    printf("二维数组:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 字符串
    char str1[] = "Hello";
    char str2[20];
    strcpy(str2, str1);  // 复制
    strcat(str2, " World");  // 拼接
    printf("拼接后:%s\n", str2);
    printf("长度:%zu\n", strlen(str2));  // %zu 用于 size_t

    // 比较字符串
    if (strcmp(str1, "Hello") == 0) {
        printf("str1 等于 \"Hello\"\n");
    }

    return 0;
}