如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。——David Leinweber

想要学好嵌入式开发,打好基础是最关键的一步。基础必备知识部分将会从C语言、硬件基础知识、数据结构、计算机组成原理、操作系统这5个部分进行知识点分享。

目录

C语言

硬件基础知识

数据结构

计算机组成原理

操作系统

C语言常用数据类型详解

1. 数据类型概述

2. 基本数据类型

2.1 整型数据类型

2.2 浮点型数据类型

2.3 字符型

3. 派生数据类型

3.1 数组

3.2 指针

3.3 结构体

3.4 联合体

3.5 枚举

4. 类型限定符

4.1 const 限定符

4.2 volatile 限定符

5. 类型转换

5.1 隐式类型转换

5.2 显式类型转换

6. 总结


首先,对于这5个部分呢,这边就是简单的找一些关键的内容进行分享。其结构大纲如下:

C语言

  1. 常用数据类型;
  2. 函数;
  3. 结构体;
  4. 指针;
  5. 文件操作。

硬件基础知识

  1. 模拟电子技术;
  2. 数字电子技术;
  3. 常用电子元器件。

数据结构

  1. 数组;
  2. 队列;
  3. 链表;
  4. 堆栈;
  5. 图。

计算机组成原理

  1. 数据表示和运算;
  2. 存储系统;
  3. 指令系统;
  4. 总线系统;
  5. 中央处理器;
  6. 输入输出系统。

操作系统

  1. 进程管理;
  2. 内存管理;
  3. 文件管理;
  4. 输入输出管理。

这篇文章主要是对C语言的常用数据结构展开来讲解的,正文开始~

C语言常用数据类型详解

1. 数据类型概述

在C语言中,数据类型定义了变量的存储大小、取值范围以及可以执行的操作。合理选择数据类型对于编写高效、可靠的程序至关重要。

2. 基本数据类型

2.1 整型数据类型

整型用于存储整数值,分为有符号和无符号两种形式。

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

int main() {
    // 有符号整型
    char c = 65;                    // 1字节,范围:-128 到 127
    short s = 32767;                // 2字节,范围:-32768 到 32767
    int i = 2147483647;             // 4字节,范围:-2147483648 到 2147483647
    long l = 2147483647L;           // 4或8字节
    long long ll = 9223372036854775807LL; // 8字节
    
    // 无符号整型
    unsigned char uc = 255;         // 1字节,范围:0 到 255
    unsigned short us = 65535;      // 2字节,范围:0 到 65535
    unsigned int ui = 4294967295U;  // 4字节,范围:0 到 4294967295
    unsigned long ul = 4294967295UL;
    unsigned long long ull = 18446744073709551615ULL;
    
    printf("char 大小: %zu 字节\n", sizeof(char));
    printf("int 大小: %zu 字节\n", sizeof(int));
    printf("long 大小: %zu 字节\n", sizeof(long));
    
    return 0;
}

2.2 浮点型数据类型

浮点型用于存储带小数点的数值。

#include <stdio.h>
#include <float.h>

int main() {
    float f = 3.14159f;             // 4字节,单精度,约6-7位有效数字
    double d = 3.141592653589793;   // 8字节,双精度,约15-16位有效数字
    long double ld = 3.14159265358979323846L; // 10或16字节,扩展精度
    
    printf("float 大小: %zu 字节\n", sizeof(float));
    printf("double 大小: %zu 字节\n", sizeof(double));
    printf("long double 大小: %zu 字节\n", sizeof(long double));
    
    printf("float 精度: %d 位小数\n", FLT_DIG);
    printf("double 精度: %d 位小数\n", DBL_DIG);
    
    // 科学计数法表示
    float scientific = 1.23e4f;     // 1.23 × 10^4 = 12300
    printf("科学计数法: %.2f\n", scientific);
    
    return 0;
}

2.3 字符型

字符型实际上是小整型,用于存储ASCII字符。

#include <stdio.h>

int main() {
    char ch1 = 'A';                 // 字符常量用单引号
    char ch2 = 65;                  // 直接使用ASCII码
    char ch3 = '\n';                // 转义字符
    
    printf("字符: %c, ASCII码: %d\n", ch1, ch1);
    printf("字符: %c, ASCII码: %d\n", ch2, ch2);
    
    // 字符串是字符数组
    char str[] = "Hello, World!";
    printf("字符串: %s\n", str);
    
    return 0;
}

3. 派生数据类型

3.1 数组

数组是相同类型元素的集合。

#include <stdio.h>

int main() {
    // 一维数组
    int numbers[5] = {1, 2, 3, 4, 5};
    
    // 二维数组
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    // 字符数组(字符串)
    char name[] = "C Language";
    
    // 遍历数组
    printf("一维数组: ");
    for(int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
    
    printf("二维数组:\n");
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    printf("字符串: %s\n", name);
    
    return 0;
}

3.2 指针

指针存储内存地址,是C语言的强大特性。

#include <stdio.h>

int main() {
    int num = 42;
    int *ptr = &num;                // 指针声明和初始化
    
    printf("变量值: %d\n", num);
    printf("变量地址: %p\n", &num);
    printf("指针值: %p\n", ptr);
    printf("指针指向的值: %d\n", *ptr);
    
    // 通过指针修改变量值
    *ptr = 100;
    printf("修改后的变量值: %d\n", num);
    
    // 指针运算
    int arr[] = {10, 20, 30, 40, 50};
    int *arr_ptr = arr;
    
    printf("\n指针运算:\n");
    for(int i = 0; i < 5; i++) {
        printf("arr[%d] = %d, *(arr_ptr + %d) = %d\n", 
               i, arr[i], i, *(arr_ptr + i));
    }
    
    return 0;
}

3.3 结构体

结构体允许将不同类型的数据组合在一起。

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

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

int main() {
    // 结构体变量声明和初始化
    struct Student student1;
    strcpy(student1.name, "张三");
    student1.age = 20;
    student1.gpa = 3.8f;
    
    // 另一种初始化方式
    struct Student student2 = {"李四", 22, 3.9f};
    
    // 结构体指针
    struct Student *ptr = &student1;
    
    printf("学生1:\n");
    printf("姓名: %s\n", student1.name);
    printf("年龄: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);
    
    printf("\n通过指针访问:\n");
    printf("姓名: %s\n", ptr->name);    // 等价于 (*ptr).name
    printf("年龄: %d\n", ptr->age);
    
    return 0;
}

3.4 联合体

联合体所有成员共享同一块内存空间。

#include <stdio.h>

// 联合体定义
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    
    printf("联合体大小: %zu 字节\n", sizeof(union Data));
    
    data.i = 42;
    printf("data.i = %d\n", data.i);
    
    data.f = 3.14f;
    printf("data.f = %.2f\n", data.f);
    
    // 注意:此时data.i的值已被覆盖
    printf("data.i (被覆盖后) = %d\n", data.i);
    
    return 0;
}

3.5 枚举

枚举提供了一种定义命名常量集合的方式。

#include <stdio.h>

// 枚举定义
enum Weekday {
    MONDAY,     // 0
    TUESDAY,    // 1
    WEDNESDAY,  // 2
    THURSDAY,   // 3
    FRIDAY,     // 4
    SATURDAY,   // 5
    SUNDAY      // 6
};

// 可指定值的枚举
enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 4
};

int main() {
    enum Weekday today = WEDNESDAY;
    enum Color favorite = BLUE;
    
    printf("今天: %d\n", today);
    printf("喜欢的颜色: %d\n", favorite);
    
    // 枚举常用于switch语句
    switch(today) {
        case MONDAY:
        case TUESDAY:
        case WEDNESDAY:
        case THURSDAY:
        case FRIDAY:
            printf("工作日\n");
            break;
        case SATURDAY:
        case SUNDAY:
            printf("周末\n");
            break;
    }
    
    return 0;
}

4. 类型限定符

4.1 const 限定符

#include <stdio.h>

int main() {
    const int MAX_VALUE = 100;      // 常量,不可修改
    const double PI = 3.14159;
    
    // MAX_VALUE = 200;  // 错误:不能修改常量
    
    int num = 50;
    const int *ptr = &num;          // 指向常量的指针
    
    // *ptr = 60;       // 错误:不能通过指针修改值
    num = 60;           // 正确:可以直接修改变量
    
    int *const const_ptr = &num;    // 常量指针
    
    *const_ptr = 70;    // 正确:可以修改指向的值
    // const_ptr = &MAX_VALUE; // 错误:不能修改指针本身
    
    printf("MAX_VALUE: %d\n", MAX_VALUE);
    printf("num: %d\n", num);
    
    return 0;
}

4.2 volatile 限定符

#include <stdio.h>

int main() {
    volatile int sensor_value;      // 告诉编译器该变量可能被意外修改
    
    // 常用于硬件寄存器、多线程共享变量等场景
    // 防止编译器进行过度优化
    
    return 0;
}

5. 类型转换

5.1 隐式类型转换

#include <stdio.h>

int main() {
    // 自动类型提升
    char c = 'A';
    int i = c;              // char -> int
    float f = i;            // int -> float
    
    printf("char '%c' -> int %d -> float %.2f\n", c, i, f);
    
    // 表达式中的类型转换
    int a = 5;
    float b = 2.0f;
    float result = a / b;   // a被提升为float
    
    printf("5 / 2.0 = %.2f\n", result);
    
    return 0;
}

5.2 显式类型转换

#include <stdio.h>

int main() {
    float f = 3.14f;
    int i = (int)f;         // 强制类型转换
    
    printf("float %.2f -> int %d\n", f, i);
    
    // 指针类型转换
    int num = 0x12345678;
    char *byte_ptr = (char*)&num;
    
    printf("整数的字节表示: ");
    for(int j = 0; j < sizeof(int); j++) {
        printf("%02x ", (unsigned char)byte_ptr[j]);
    }
    printf("\n");
    
    return 0;
}

6. 总结

C语言的数据类型系统提供了丰富的数据表示能力:

  1. 基本类型:整型、浮点型、字符型构成程序的基础;

  2. 派生类型:数组、指针、结构体、联合体提供复杂数据组织方式;

  3. 类型限定符:const、volatile等增强类型安全性;

  4. 类型转换:隐式和显式转换提供灵活性;

正确理解和使用数据类型是编写高效、可靠C程序的基础。选择合适的数据类型不仅可以提高程序性能,还能避免许多常见的编程错误。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐