1. C语言基础练习(12)实战解析
作为一名从学生时代就开始接触C语言的程序员,我至今记得第一次用指针时那种既兴奋又恐惧的感觉。今天我们就来拆解一组典型的C语言基础练习题,这些题目看似简单,却藏着许多初学者容易踩的坑。让我们从最基础的开始,逐步深入到一些有趣的技巧。
1.1 变量类型转换的陷阱
在最近辅导新人时,我发现80%的初学者都会在这个问题上栽跟头。让我们看一个典型例子:
c复制int main() {
float f = 3.14;
int i = f; // 这里会发生什么?
printf("%d", i);
}
这里的关键在于理解隐式类型转换的规则:
- 浮点数转整数时直接截断小数部分(不是四舍五入!)
- 当超过int范围时行为是未定义的(UB)
- 在不同架构下可能有不同的结果
实际经验:在嵌入式开发中,我遇到过因为这种隐式转换导致传感器数据解析错误的情况。建议总是显式转换:(int)roundf(f)
1.2 指针运算的魔法
指针是C语言的灵魂,也是新手的地狱。让我们通过一个实际案例来理解:
c复制int arr[5] = {1,2,3,4,5};
int *p = arr;
printf("%d", *(p + 2)); // 输出什么?
这里有几个关键知识点:
- 指针加减是基于类型大小的(int通常是4字节)
- arr[i] 完全等价于 *(arr + i)
- 但 &arr 和 arr 的类型是不同的(试试 printf("%p %p", &arr, arr))
我在开发网络协议栈时,就曾利用指针运算高效处理了数据包的分片重组。
1.3 文件IO的实用技巧
很多教材只教fopen/fclose,但实际开发中这些远远不够。来看一个实用的文件拷贝示例:
c复制#define BUF_SIZE 4096 // 为什么是这个大小?
void file_copy(const char *src, const char *dst) {
FILE *in = fopen(src, "rb"); // 注意b模式
FILE *out = fopen(dst, "wb");
char buff
