〇、先来段暴击!
“学不会C语言?不存在的!”——这是当年教我C语言的秃头教授的口头禅(现在我也开始脱发了…)。作为接触底层开发的直通车,C语言那该死的魅力在于:直接操作内存的能力(小心别把系统搞崩了)!
今天咱们不整虚的,直接上硬核知识点(附赠祖传代码片段)!
一、Hello World的暗黑真相
#include <stdio.h> // 这个头文件不写?等着报错吧!
int main() { // main函数是程序的入口,记牢了!!!
printf("Hello World!\n"); // \n是换行符(千万别写成/n)
return 0; // 返回0表示程序正常退出(返回666也行,但别被老师发现)
}
⚠️重点警报:
- 每个语句必须以
;
结尾(忘记分号?编译器分分钟教你做人) main()
函数必须存在(没有它?程序连门都找不到!)
二、变量与数据类型的生死局
2.1 基本数据类型(记不住就去面壁)
类型 | 占位符 | 内存大小(字节) |
---|---|---|
int | %d | 4 |
float | %f | 4 |
double | %lf | 8 |
char | %c | 1 |
灵魂拷问:
int a = 2147483647; // int的最大值(再加1就变成-2147483648!)
float b = 0.1; // 你以为的0.1其实是0.10000000149...
(敲黑板)内存溢出是C语言新手最常踩的坑!
2.2 变量声明骚操作
int x=5, y=x+3; // C99标准才允许!(某些老旧编译器会报错)
register int z; // 建议编译器放寄存器(然并卵,编译器可能不听你的)
三、运算符的隐藏关卡
你以为a++
和++a
一样?Too young!
int a = 5;
int b = a++ * 2; // b=10, a=6 (先取值后自增)
int c = ++a * 2; // c=14, a=7 (先自增后取值)
优先级血泪史:
*
优先级高于+
?不!++
比*
还高!(写表达式时多用括号保平安)
四、流程控制的九阴真经
4.1 if-else的魔鬼细节
if(a = 5) { // 这里其实是赋值操作!永远为真(想要判断相等要用==)
// 这段代码永远会执行!!!
}
(重要的事情说三遍)== 和 = 别搞混!别搞混!别搞混!
4.2 switch的死亡陷阱
switch(x) {
case 1: printf("一");
case 2: printf("二"); // 缺少break会继续执行下一个case!
default: printf("未知");
}
当x=1时输出:“一二未知”(惊不惊喜?)
五、函数的黑暗魔法
5.1 函数声明潜规则
void print(); // 声明不带参数(实际调用时可以传任意参数!危险!)
int main() {
print(666); // 编译通过但可能导致运行时错误
return 0;
}
void print(int x) { // 实际定义带参数(声明和定义不一致!)
printf("%d",x);
}
(血的教训)函数声明与定义必须严格一致!
六、指针与内存管理的修罗场
6.1 指针三重奏
int var = 20;
int *p = &var; // p指向var的地址
int **pp = &p; // pp指向p的地址(套娃开始...)
经典翻车现场:
int *ptr;
*ptr = 5; // ptr未初始化,这是要修改哪里的内存?(系统崩溃预警)
6.2 动态内存的生死簿
int *arr = malloc(10 * sizeof(int)); // 申请10个int的空间
if(arr == NULL) {
// 一定要检查是否申请成功!(系统可能没内存了)
}
free(arr); // 用完必须释放!
arr = NULL; // 避免野指针(重要!)
(严肃脸)忘记free会导致内存泄漏(程序运行越久越卡直到崩溃)!
七、嵌入式开发的屠龙技
在嵌入式领域,C语言就是王者!看看这段GPIO操作:
#define GPIO_PORT *(volatile uint32_t*)0x40020000 // 硬件寄存器地址
void led_init() {
GPIO_PORT |= 0x01; // 设置第一位为输出模式
}
void led_toggle() {
GPIO_PORT ^= 0x01; // 异或操作翻转状态
}
(温馨提示)volatile
关键字告诉编译器不要优化这段代码(硬件寄存器必须实时访问)!
八、给新手的保命符
- 多用
-Wall -Werror
编译选项(让编译器当你的严师) - 随身携带《C陷阱与缺陷》(程序员的护身符)
- 重要变量名加
_flag
或_cnt
后缀(比如is_valid_flag
) - 每天手写一遍指针操作(直到形成肌肉记忆)
最后の暴言
学C语言就像学骑自行车——
- 第一次接触:握草这什么反人类设计?!
- 摔了几次后:哎?好像能保持平衡了?
- 熟练之后:秋名山车神就是我!
(代码虐我千百遍,我待代码如初恋)老铁们,键盘敲起来!