经典入门:Hello, World!
这是每个程序员学习的第一段代码,用于验证开发环境是否配置成功。

(图片来源网络,侵删)
源代码 (hello.c)
#include <stdio.h> // 引入标准输入输出库,提供 printf 函数
int main() {
// printf 函数用于在控制台打印文本
// \n 是一个转义字符,表示换行
printf("Hello, World!\n");
// main 函数的返回值,0 表示程序正常退出
return 0;
}
如何编译和运行:
- 保存文件为
hello.c。 - 打开终端或命令提示符。
- 使用 GCC 编译器进行编译:
gcc hello.c -o hello - 运行生成的可执行文件:
./hello(在 Linux/macOS) 或hello.exe(在 Windows)。
输出:
Hello, World!
基础语法:变量、数据类型与运算
这个示例展示了 C 语言的基本数据类型、变量声明和算术运算。

(图片来源网络,侵删)
源代码 (basics.c)
#include <stdio.h>
int main() {
// 1. 变量声明与初始化
int integer_num = 10;
float float_num = 3.14f;
double double_num = 3.14159265359;
char character = 'A';
// 2. 算术运算
int a = 5, b = 2;
int sum = a + b;
int difference = a - b;
int product = a * b;
int quotient = a / b; // 整数除法,结果为 2
int remainder = a % b; // 取模运算,结果为 1
// 3. 输出结果
printf("数据类型示例:\n");
printf("整数: %d\n", integer_num);
printf("单精度浮点数: %f\n", float_num);
printf("双精度浮点数: %lf\n", double_num); // lf 用于 double
printf("字符: %c\n", character);
printf("\n算术运算示例:\n");
printf("a = %d, b = %d\n", a, b);
printf("和: %d\n", sum);
printf("差: %d\n", difference);
printf("积: %d\n", product);
printf("商: %d\n", quotient);
printf("余数: %d\n", remainder);
return 0;
}
输出:
数据类型示例:
整数: 10
单精度浮点数: 3.140000
双精度浮点数: 3.141593
字符: A
算术运算示例:
a = 5, b = 2
和: 7
差: 3
积: 10
商: 2
余数: 1
流程控制:if-else 与 for 循环
这个示例演示了条件判断和循环结构,是程序逻辑的核心。
源代码 (control_flow.c)

(图片来源网络,侵删)
#include <stdio.h>
int main() {
// 1. if-else 条件判断
int age = 18;
printf("if-else 示例:\n");
if (age >= 18) {
printf("你已成年,\n");
} else {
printf("你未成年,\n");
}
// 2. for 循环
printf("\nfor 循环示例 (打印 1 到 5):\n");
for (int i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
// 3. while 循环
printf("\nwhile 循环示例 (打印 5 到 1):\n");
int j = 5;
while (j > 0) {
printf("%d ", j);
j--;
}
printf("\n");
return 0;
}
输出:
if-else 示例:
你已成年。
for 循环示例 (打印 1 到 5):
1 2 3 4 5
while 循环示例 (打印 5 到 1):
5 4 3 2 1
函数:代码的模块化
这个示例展示了如何定义和调用函数,以实现代码复用和模块化设计。
源代码 (functions.c)
#include <stdio.h>
// 函数声明:计算两个整数的和
int add(int a, int b);
// 函数声明:打印一个字符 n 次
void print_char(char ch, int n);
int main() {
int num1 = 10, num2 = 20;
int result = add(num1, num2); // 调用 add 函数
printf("add 函数调用结果: %d + %d = %d\n", num1, num2, result);
print_char('*', 5); // 调用 print_char 函数
printf("\n");
return 0;
}
// 函数定义:计算两个整数的和
int add(int a, int b) {
return a + b;
}
// 函数定义:打印一个字符 n 次
void print_char(char ch, int n) {
for (int i = 0; i < n; i++) {
printf("%c", ch);
}
}
输出:
add 函数调用结果: 10 + 20 = 30
*****
核心概念:数组与指针
这是 C 语言最强大也最容易出错的部分,这个示例将数组与指针联系起来,展示它们之间的密切关系。
源代码 (array_pointer.c)
#include <stdio.h>
int main() {
// 1. 数组
int numbers[5] = {10, 20, 30, 40, 50};
printf("数组元素:\n");
for (int i = 0; i < 5; i++) {
printf("numbers[%d] = %d\n", i, numbers[i]);
}
// 2. 指针
int *ptr; // 声明一个整型指针
ptr = numbers; // 数组名 `numbers` 会“衰变”为其首元素的地址
printf("\n使用指针遍历数组:\n");
// 指针解引用 *ptr 获取指针指向的值
// 指针算术 ptr + i 获取第 i 个元素的地址
for (int i = 0; i < 5; i++) {
printf("*(ptr + %d) = %d\n", i, *(ptr + i));
}
// 3. 指针与数组的关系
printf("\n指针与数组的关系:\n");
printf("numbers 的地址: %p\n", (void*)numbers);
printf("ptr 的地址: %p\n", (void*)ptr);
printf("numbers[0] 的地址: %p\n", (void*)&numbers[0]);
printf("&numbers[0] 的地址: %p\n", (void*)&numbers[0]);
return 0;
}
输出 (地址值会不同):
数组元素:
numbers[0] = 10
numbers[1] = 20
numbers[2] = 30
numbers[3] = 40
numbers[4] = 50
使用指针遍历数组:
*(ptr + 0) = 10
*(ptr + 1) = 20
*(ptr + 2) = 30
*(ptr + 3) = 40
*(ptr + 4) = 50
指针与数组的关系:
numbers 的地址: 0x7ffc.......
ptr 的地址: 0x7ffc.......
numbers[0] 的地址: 0x7ffc.......
&numbers[0] 的地址: 0x7ffc.......
(注意:%p 用于打印指针地址,& 是取地址运算符)
复杂数据结构:结构体
结构体允许你将不同类型的数据组合成一个单一的、自定义的类型。
源代码 (struct_example.c)
#include <stdio.h>
#include <string.h> // 用于 strcpy 函数
// 定义一个结构体类型 Student
struct Student {
int id;
char name[50];
float gpa;
};
int main() {
// 声明一个结构体变量并初始化
struct Student student1;
student1.id = 101;
strcpy(student1.name, "张三"); // 字符串不能直接赋值,需要用 strcpy
student1.gpa = 3.8;
// 声明并初始化另一个结构体变量
struct Student student2 = {102, "李四", 3.9};
// 访问结构体成员
printf("学生信息 1:\n");
printf("学号: %d, 姓名: %s, GPA: %.2f\n", student1.id, student1.name, student1.gpa);
printf("\n学生信息 2:\n");
printf("学号: %d, 姓名: %s, GPA: %.2f\n", student2.id, student2.name, student2.gpa);
return 0;
}
输出:
学生信息 1:
学号: 101, 姓名: 张三, GPA: 3.80
学生信息 2:
学号: 102, 姓名: 李四, GPA: 3.90
动态内存管理:malloc 与 free
C 语言允许在程序运行时动态地分配和释放内存,这对于处理不确定大小的数据至关重要。
源代码 (dynamic_memory.c)
#include <stdio.h>
#include <stdlib.h> // 包含 malloc 和 free 的头文件
int main() {
int n;
int *ptr; // 声明一个整型指针
printf("请输入要存储的整数数量: ");
scanf("%d", &n);
// 1. 动态分配内存
// malloc 分配 n 个 int 大小的内存块,并返回指向该内存块首地址的指针
ptr = (int*)malloc(n * sizeof(int));
// 检查内存是否分配成功
if (ptr == NULL) {
printf("内存分配失败!\n");
return 1; // 异常退出
}
printf("已成功为 %d 个整数分配内存,\n", n);
// 2. 使用动态分配的内存
for (int i = 0; i < n; i++) {
ptr[i] = i + 1; // 像使用普通数组一样使用指针
}
printf("存储的整数为: ");
for (int i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 3. 释放内存
// 当不再需要动态内存时,必须使用 free 将其归还给系统
free(ptr);
printf("内存已释放,\n");
// 释放后,ptr 成为一个“悬空指针”,建议将其设为 NULL
ptr = NULL;
return 0;
}
示例运行:
请输入要存储的整数数量: 5
已成功为 5 个整数分配内存。
存储的整数为: 1 2 3 4 5
内存已释放。
总结与学习建议
这些示例涵盖了 C 语言的核心概念,学习 C 语言源代码的建议路径是:
- 掌握基础:从
Hello, World!开始,确保你的编译环境没问题。 - 理解语法:学习变量、数据类型、运算符。
- 练习控制流:熟练使用
if-else、for、while来构建逻辑。 - 拥抱函数:学会将代码分解成小的、可重用的函数。
- 攻克指针:这是 C 语言的精髓和难点,一定要动手写代码,理解指针、地址和数组之间的关系。
- 学习结构体:掌握如何组织复杂数据。
- 实践内存管理:理解
malloc和free的重要性,避免内存泄漏。
通过阅读、模仿和修改这些示例,你可以逐步建立起对 C 语言程序设计的深刻理解。
