C语言程序设计细节解析 + 数据类型全家福
(2026 年视角 · 面试 + 嵌入式 + 竞赛三栖通用版,细节拉满,小白也能看懂)
一、C语言程序的基本结构(必须死记的模板)
#include <stdio.h> // 预处理指令(头文件)
#include <stdlib.h>
// 宏定义(可选)
#define PI 3.14159
#define MAX(a,b) ((a)>(b)?(a):(b))
// 全局变量(尽量少用)
int global_count = 0;
// 函数原型声明(可选,但推荐)
void say_hello(void);
// main 是程序入口(必须有且只有一个)
int main(void) // 推荐写法:明确 void
{
// 局部变量声明必须在代码最前面(C89标准)
// C99 以后可以混写
int a = 10;
char c = 'A';
printf("Hello C 2026!\n");
say_hello();
return 0; // 0 表示成功,非0表示异常
}
// 自定义函数定义
void say_hello(void)
{
printf("你好,C语言!\n");
}
二、C语言所有数据类型完整表格(带内存大小 + 取值范围 + printf格式)
| 类型类别 | 类型名称 | 字节数(32/64位通用) | 取值范围 | printf 格式化 | scanf 格式化 | 备注 |
|---|---|---|---|---|---|---|
| 整数类型 | char | 1 | -128 ~ 127(有符号)或 0~255(无符号) | %c | %c | 字符型,本质是小整数 |
| unsigned char | 1 | 0 ~ 255 | %c / %hhu | %hhu | ||
| signed char | 1 | -128 ~ 127 | %hhd | %hhd | 很少用 | |
| short int | 2 | -32768 ~ 32767 | %hd | %hd | ||
| unsigned short | 2 | 0 ~ 65535 | %hu | %hu | ||
| int | 4 | -2^31 ~ 2^31-1 | %d | %d | 最常用整数 | |
| unsigned int | 4 | 0 ~ 4e9+ | %u | %u | ||
| long | 4 或 8(Windows 4,Linux 64位是8) | 取决于系统 | %ld | %ld | 注意平台差异 | |
| unsigned long | 4 或 8 | %lu | %lu | |||
| long long | 8 | -2^63 ~ 2^63-1 | %lld | %lld | C99 引入,必背 | |
| unsigned long long | 8 | 0 ~ 2^64-1 | %llu | %llu | ||
| 浮点类型 | float | 4 | ±3.4E38(7位有效数字) | %f | %f | 默认输出6位小数 |
| double | 8 | ±1.7E308(15位有效数字) | %lf | %lf | printf 用 %lf,scanf 必须 %lf | |
| long double | 12 或 16 | 更大精度 | %Lf | %Lf | 嵌入式基本不用 | |
| 布尔类型 | _Bool(C99) | 1 | 0 或 1 | %d | %d | 需要 #include 才能用 bool |
| bool() | 1 | false / true | ||||
| 指针类型 | 任意类型* | 4 或 8(32/64位) | 内存地址 | %p | %p | 打印要加 void* 转换 |
| void 类型 | void | 无大小 | 无值 | — | — | 用于函数无返回、无参数 |
终极记忆口诀:
char short int long long double → 1 2 4 4/8 8 8
三、关键细节解析(面试 + 实际开发必考)
| 细节点 | 正确写法 / 常见错误 | 解释 / 建议 |
|---|---|---|
| main 函数写法 | int main(void) 或 int main(int argc, char *argv[]) | 明确写 void 最规范 |
| printf 打印 long long | %lld(Linux) vs %I64d(旧 Windows) | 推荐统一用 %PRId64(需 #include ) |
| 打印指针 | printf("%p\n", (void*)ptr); | 必须强制转 void* |
| 常量定义 | const int MAX = 100; 或 #define MAX 100 | const 有类型检查,更安全 |
| 字符与整数 | 'A' + 1 == 66 | ‘A’ 的 ASCII 是 65 |
| char 有符号还是无符号? | 取决于编译器!(gcc 默认 signed) | 跨平台建议显式写 signed char / unsigned char |
| float 精度陷阱 | 0.1 + 0.2 != 0.3 | 浮点数是近似值,钱用整数分表示 |
| sizeof 和 strlen 区别 | sizeof 包含 ‘\0’,strlen 不包含 | char str[100] → sizeof=100,strlen 取决于内容 |
| 数组名就是指针? | 大部分情况下是,但不是完全等价 | 数组名在表达式中会退化为指针,但 sizeof(数组) 是总大小 |
四、实战代码示例(建议直接敲)
#include <stdio.h>
#include <stdint.h> // 推荐!固定宽度整数
#include <inttypes.h> // PRId64 等宏
#include <stdbool.h>
int main(void)
{
// 固定宽度类型(嵌入式/跨平台必备)
int8_t a = -128;
uint8_t b = 255;
int64_t big = 9223372036854775807LL; // 注意加 LL
printf("int64_t 最大值: %" PRId64 "\n", big);
printf("指针地址: %p\n", (void*)&a);
// 浮点数精度演示
float f = 0.1f;
double d = 0.1;
if (f + f + f == 0.3f) {
printf("相等\n"); // 不会打印!
} else {
printf("不相等!浮点数有精度误差\n");
}
return 0;
}
五、总结速记表(贴在显示器旁边)
| 你想存什么? | 推荐类型 | 理由 |
|---|---|---|
| 单个字符 | char | 最省空间 |
| 布尔值 | bool(#include ) | 可读性好 |
| 计数器/循环变量 | int 或 unsigned int | 够用 |
| 大整数(>20亿) | long long / int64_t | 安全 |
| 钱(精确小数) | int(存分) | 避免浮点误差 |
| 高精度计算 | double | 比 float 精度高一倍 |
| 跨平台固定宽度 | int32_t、uint64_t 等 | #include |
| 地址/指针 | void* 或 uintptr_t | 通用 |
掌握上面这些,你写 C 程序就不会再踩数据类型和格式化输出这些低级坑了!
你现在最想深入的是哪一块?
- 指针和地址的细节?
- 结构体、共用体、位段?
- 预处理、宏、条件编译?
- 还是嵌入式常见的 volatile、const、restrict?
告诉我,我接着给你出下一份超详细笔记~