【嵌入式开发学习路线1】基础必备知识模块系列——C语言的常用数据类型
如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。——David Leinweber

想要学好嵌入式开发,打好基础是最关键的一步。基础必备知识部分将会从C语言、硬件基础知识、数据结构、计算机组成原理、操作系统这5个部分进行知识点分享。
目录
首先,对于这5个部分呢,这边就是简单的找一些关键的内容进行分享。其结构大纲如下:
C语言
- 常用数据类型;
- 函数;
- 结构体;
- 指针;
- 文件操作。
硬件基础知识
- 模拟电子技术;
- 数字电子技术;
- 常用电子元器件。
数据结构
- 数组;
- 队列;
- 链表;
- 堆栈;
- 图。
计算机组成原理
- 数据表示和运算;
- 存储系统;
- 指令系统;
- 总线系统;
- 中央处理器;
- 输入输出系统。
操作系统
- 进程管理;
- 内存管理;
- 文件管理;
- 输入输出管理。
这篇文章主要是对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 = # // 指针声明和初始化
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 = # // 指向常量的指针
// *ptr = 60; // 错误:不能通过指针修改值
num = 60; // 正确:可以直接修改变量
int *const const_ptr = # // 常量指针
*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*)#
printf("整数的字节表示: ");
for(int j = 0; j < sizeof(int); j++) {
printf("%02x ", (unsigned char)byte_ptr[j]);
}
printf("\n");
return 0;
}
6. 总结
C语言的数据类型系统提供了丰富的数据表示能力:
基本类型:整型、浮点型、字符型构成程序的基础;
派生类型:数组、指针、结构体、联合体提供复杂数据组织方式;
类型限定符:const、volatile等增强类型安全性;
类型转换:隐式和显式转换提供灵活性;
正确理解和使用数据类型是编写高效、可靠C程序的基础。选择合适的数据类型不仅可以提高程序性能,还能避免许多常见的编程错误。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)