C 语言简介

C 是一种:

  • 面向过程(Procedure-Oriented)
  • 编译型(Compiled)
  • 静态类型(Static Typed)
  • 接近底层(Low-level)
  • 高性能

的编程语言。

由 Dennis Ritchie 在贝尔实验室开发。

现代操作系统、数据库、嵌入式系统、大量编程语言(如 C++、Java、Go、Rust)都深受 C 影响。


1. Hello World

#include <stdio.h>

int main() {
    printf("Hello World\n");
    return 0;
}

2. 变量与赋值

基本变量

int age = 18;
float price = 9.9;
char grade = 'A';

变量修改

int x = 10;
x = 20;

常量

const int MAX = 100;

3. 数据类型

数字类型

类⁠型说⁠明
int整⁠数
float单⁠精⁠度⁠浮⁠点
double双⁠精⁠度⁠浮⁠点
char字⁠符
long长⁠整⁠数

示例

int a = 10;
double pi = 3.14159;
char c = 'H';

4. 算数运算

int a = 10;
int b = 3;

printf("%d\n", a + b); // 加
printf("%d\n", a - b); // 减
printf("%d\n", a * b); // 乘
printf("%d\n", a / b); // 除
printf("%d\n", a % b); // 取余

5. 逻辑运算

运⁠算⁠符含⁠义
&&与
!非

示例

int age = 20;

if (age > 18 && age < 30) {
    printf("青年\n");
}

6. 比较运算

运⁠算⁠符含⁠义
==等⁠于
!=不⁠等⁠于
>大⁠于
<小⁠于
>=大⁠于⁠等⁠于
<=小⁠于⁠等⁠于

7. if 判断

int score = 85;

if (score >= 90) {
    printf("优秀\n");
} else if (score >= 60) {
    printf("及格\n");
} else {
    printf("不及格\n");
}

8. switch 分支

int day = 2;

switch(day) {
    case 1:
        printf("星期一");
        break;

    case 2:
        printf("星期二");
        break;

    default:
        printf("未知");
}

9. for 循环

for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
}

10. while 循环

int i = 0;

while (i < 5) {
    printf("%d\n", i);
    i++;
}

11. 数组(C 的“列表”)

C 没有真正的 List。

通常用:

  • 数组(Array)
  • 链表(Linked List)

代替。


数组

int nums[5] = {1,2,3,4,5};

printf("%d\n", nums[0]);

遍历数组

for (int i = 0; i < 5; i++) {
    printf("%d\n", nums[i]);
}

12. 字符串

C 没有真正的字符串类型。

本质是:

char str[] = "hello";

实际上是:

['h','e','l','l','o','\0']

\0 表示字符串结束。


13. 结构体(Struct)

C 没有 class。

通常使用 struct。

struct Person {
    char name[20];
    int age;
};

使用结构体

struct Person p;

p.age = 18;

14. 函数

定义函数

int add(int a, int b) {
    return a + b;
}

调用函数

int result = add(3, 5);

15. 指针(C 最核心特性)

https://images.openai.com/static-rsc-4/S11cSqsanF6ZgyWj7_0nQpHoalv3BsNHa5gT1mW4S7dBFmypIl1R0lj7brR5R7U7zuiw3Y-Jsn1DMgfmJkq-Pgb0J7PZrpaV4IEt5n5gCBtNGOzIZT3ti0zAV5qmg1_82iQSJ8gtHTKBR6aUmrZPz4zU4YWfLaYAJNhr-QX46NCHzuoS62h4BDv10Htw0OU2?purpose=fullsize
https://images.openai.com/static-rsc-4/8VbFVk5qT0k6KOB-d65cMmhKK8G_7NcxxyVHSuzlvIL6Xs54qKN2IEZr-qxRCM2TOfHbamVtmxkQwzkbN2JJWUy8IO2Usigqhqd7-KIy5-nd4X459AahiXg3HNb528t9l-qJh66VdUApL07XnkmwJe9T_fxzaS5sP8f1AqPucGxLK_AGMzTBOou_ItCPcCaK?purpose=fullsize
https://images.openai.com/static-rsc-4/_G3q-0EI5CNLSnNzFpo8C_ftbRKHicG-_wTGw8hd51FZTNM98t7LaD3p8OlS9x423uYMWUygAjLd3ArV9qMANhmPbppX2-8wApLcgMzd3tmW4vqQz2wgG0wRG2oBRWG-F2WdWAEmcu2HP9R9dx-1vfGZXnVwHsbuSt6gOouWQDxDdhdPKNyKTaFreqTshwBM?purpose=fullsize
6

指针是 C 最重要、最底层的概念。


地址

int a = 10;

printf("%p", &a);

&a 表示变量地址。


指针变量

int *p = &a;

含义:

p 保存 a 的内存地址

通过指针修改变量

*p = 20;

等于:

a = 20;

16. 指针为什么重要

因为:

  • 数组
  • 字符串
  • 函数参数
  • 动态内存
  • 文件系统
  • 操作系统

本质都依赖指针。


17. 动态内存 malloc/free

#include <stdlib.h>

int *arr = malloc(5 * sizeof(int));

free(arr);

含义

malloc:
    在堆内存申请空间

free:
    手动释放内存

18. C 的“集合”和“Map”

C 标准库没有:

  • Set
  • Map
  • Dictionary

通常需要:

  • 自己实现
  • 使用第三方库

常见替代方案

需⁠求C中⁠的⁠实⁠现
List数⁠组 / 链⁠表
Set哈⁠希⁠表
Map哈⁠希⁠表
Queue队⁠列⁠结⁠构
Tree二⁠叉⁠树

19. 文件操作

FILE *fp = fopen("test.txt", "r");

fclose(fp);

20. 异常处理

C 没有:

try / catch

常见方式

返回错误码

int divide(int a, int b) {
    if (b == 0) {
        return -1;
    }

    return a / b;
}

使用 errno

#include <errno.h>

21. typedef(类型别名)

typedef unsigned long ulong;

22. enum 枚举

enum Color {
    RED,
    GREEN,
    BLUE
};

23. 宏 define

#define PI 3.14

宏函数

#define SQUARE(x) ((x) * (x))

24. 头文件

#include <stdio.h>

作用:

导入函数声明

类似:

  • Java import
  • Python import

25. C 的编译过程

https://images.openai.com/static-rsc-4/pMPg1p-4R4n9QI1SJYR6uq0ktLtvoW2k8vQvtL3e3j7yjgl3Kgu7ktv3JaT7j_-mtzYTtssQSfyKQJjCVzUgXgtbVRrqoyGuCa39UikswzDFa9bYfxAi8eXsKqNS9W_XiNqI9QnvPYSOaMiNV_HFyS2a_i-aRkaxM_tCSda4ehqElRBkYecSlDg2afsJZvL0?purpose=fullsize
https://images.openai.com/static-rsc-4/Mz5sAdWBaQAiJagtKD8wD1zryzu5BCy8QmsjVZe3YdBpBL-jewqCoXPYNDZ760CtEYLHe2NsOsJOrNGWeu4vLqAphj1Wv4c_2NygiZwTlJphIURwXucTme3LjC3BSMc2dcgx2M0mFYDSOzmtKw6ohU3QX79iSaRgM9Pg4bRdvHORBRrCSCCSlRLeoBKc_7og?purpose=fullsize
https://images.openai.com/static-rsc-4/jkD7BNcBoyq68AGFrQlPXQcIvoIoW8BNFO7wE6Vv9na4jYohWVQxwRWSfAsnfK8UF59lrmhCcGV_aR9txdQVLaBzdUmlnzkOk7fEx685wXAqXYnLl6OFoe2lkQqQDaqXTl9AiLiZn0I9DKo4XutvVrXuc77fPaivuhnskPjie9a4tlpkyOzPM8m5w2CkcegF?purpose=fullsize
6

.c源文件
   ↓

预处理
   ↓

编译
   ↓

汇编
   ↓

链接
   ↓

可执行文件

26. GCC 编译

Linux/macOS

gcc main.c -o app

运行:

./app

Windows(MinGW)

gcc main.c -o app.exe

27. C 最特殊的地方(重点)

① 指针

这是 C 的灵魂。

int *p;

很多现代语言都把这个东西隐藏了。


② 手动内存管理

malloc()
free()

程序员自己管理内存。

优点:

  • 极致性能
  • 极致控制

缺点:

  • 容易内存泄漏
  • 容易崩溃

③ 非常接近硬件

C 可以:

  • 操作内存
  • 操作寄存器
  • 操作CPU
  • 写驱动
  • 写操作系统

④ 没有真正的“高级特性”

C 没有:

  • 类
  • 泛型
  • 反射
  • GC垃圾回收
  • async/await

因此:

简单
但底层

28. C 与其它语言的关系

https://images.openai.com/static-rsc-4/LcwZJGiQXML52K6eCN424t23LVb3tmBQa3ZHCltLR1Ue2lR2KOVnRJYe-rwamyXNvG5rvg8yL4VWK33gazgaF42DG0jui95NMcbnPvJMXmalJExH1NtF_-OjqUtNm0GbN1II3U1CMzLq4uhdCSWXlL-blIEb3Y5KoJ8isgw_nPcQDbOyDQnS6k3FoJVVMKxo?purpose=fullsize
https://images.openai.com/static-rsc-4/FMvGkQ_4DySEZT3uyWbCWyTHo6IZhBWG0ChM9gr5fXu8B9gGU7LsHjYC40Fl5VzY8wQMnoCJXciOSBYVXJGJr57Wv87Q14UtwPZ-xN_PJxggVDiGpxEKZv9UfucpqFM6E2NrDoSwruR6O_JXjS80LARLnekYM-Ejt7vpFYoAd1jjVNJC1f_HWEhLOg0zm_dc?purpose=fullsize
https://images.openai.com/static-rsc-4/ZwloRtK_g_WDwdZPTw79Bfzl9X_Mm7NXLrx29_EWZ3PJ1W-NSH0imHzF06zUfdkoZhRW_3JRiic4P7lAMXxBSejouo4bnxy8QLH1J1toXf9uX0i-ok8O5ooUWqBlO5v3oEM2yalyzQWVxcDr6SmHWwuCtEfrosGYOJAOTGP61BXzXTyK56WK4xFjcqriUrSj?purpose=fullsize
5

很多语言语法都来自 C:

语⁠言与 C 的⁠关⁠系
C++C 的⁠扩⁠展
Java模⁠仿 C 语⁠法
Go简⁠化⁠版 C 风⁠格
Rust安⁠全⁠版 C
JavaScriptC 风⁠格⁠语⁠法

29. 学习 C 最重要的几个概念

建议重点掌握:

  1. 指针
  2. 内存
  3. 数组
  4. 函数
  5. struct
  6. 编译过程
  7. malloc/free

30. 一句话总结

C 语言的本质:

“用最少的抽象,
直接控制计算机硬件。”

它既是:

  • 现代编程语言之父

也是:

  • 操作系统世界的基础语言。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐