基本语法
1. 程序结构
C程序的基本结构:
1 2 3 4 5 6
| #include <stdio.h>
int main() { printf("Hello, World!\n"); return 0; }
|
2. 数据类型
基本数据类型:
- 整型:
int
(通常4字节)
- 浮点型:
float
, double
- 字符型:
char
(占1字节)
- 布尔型:
_Bool
(需要stdbool.h
,值为0
或1
)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h>
int main() { int age = 25; float pi = 3.14; char initial = 'A'; _Bool isTrue = 1;
printf("Age: %d\n", age); printf("Pi: %.2f\n", pi); printf("Initial: %c\n", initial); printf("Boolean: %d\n", isTrue); return 0; }
|
3. 输入输出
输出:
示例:
1 2
| int x = 10; printf("x的值是: %d\n", x);
|
输入:
示例:
1 2 3 4
| int x; printf("请输入一个整数: "); scanf("%d", &x); printf("你输入的值是: %d\n", x);
|
常见格式化符号:
%d
:整型
%f
:浮点型
%c
:字符型
%s
:字符串
4. 运算符
- 算术运算符:
+
, -
, *
, /
, %
- 比较运算符:
==
, !=
, <
, >
, <=
, >=
- 逻辑运算符:
&&
(与), ||
(或), !
(非)
- 赋值运算符:
=
, +=
, -=
, *=
, /=
, %=
- 自增/自减:
++
, --
5. 条件语句
if-else 语句:
1 2 3 4 5 6 7
| if (条件) { } else if (另一个条件) { } else { }
|
示例:
1 2 3 4 5 6 7 8
| int x = 10, y = 20; if (x > y) { printf("x 大于 y\n"); } else if (x == y) { printf("x 等于 y\n"); } else { printf("x 小于 y\n"); }
|
switch 语句:
1 2 3 4 5 6 7 8 9 10
| switch (变量) { case 值1: break; case 值2: break; default: }
|
示例:
1 2 3 4 5 6 7 8 9 10 11
| int num = 2; switch (num) { case 1: printf("One\n"); break; case 2: printf("Two\n"); break; default: printf("Other\n"); }
|
6. 循环语句
for 循环:
示例:
1 2 3
| for (int i = 0; i < 5; i++) { printf("%d ", i); }
|
while 循环:
示例:
1 2 3 4 5
| int i = 0; while (i < 5) { printf("%d ", i); i++; }
|
do-while 循环:
示例:
1 2 3 4 5
| int i = 0; do { printf("%d ", i); i++; } while (i < 5);
|
7. 函数
函数的定义和调用:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h>
int add(int x, int y) { return x + y; }
int main() { int result = add(3, 5); printf("结果是: %d\n", result); return 0; }
|
函数的声明:
声明必须位于调用之前,或者放在头文件中。
8. 数组
定义和访问数组:
1 2
| int arr[5] = {1, 2, 3, 4, 5}; printf("第一个元素是: %d\n", arr[0]);
|
多维数组:
1 2
| int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; printf("matrix[1][2]: %d\n", matrix[1][2]);
|
9. 指针
指针的基本操作:
1 2 3 4
| int x = 10; int *p = &x; printf("x的地址: %p\n", p); printf("x的值: %d\n", *p);
|
指针与数组:
1 2 3
| int arr[3] = {1, 2, 3}; int *p = arr; printf("第一个元素: %d\n", *p);
|
10. 结构体
结构体用于定义复杂的数据类型。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h>
struct Person { char name[20]; int age; };
int main() { struct Person p1 = {"Alice", 25}; printf("Name: %s, Age: %d\n", p1.name, p1.age); return 0; }
|
11. 文件操作
文件写入:
1 2 3 4 5 6 7 8
| #include <stdio.h>
int main() { FILE *file = fopen("example.txt", "w"); fprintf(file, "Hello, File!\n"); fclose(file); return 0; }
|
文件读取:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main() { FILE *file = fopen("example.txt", "r"); char buffer[100]; while (fgets(buffer, sizeof(buffer), file)) { printf("%s", buffer); } fclose(file); return 0; }
|
高级特性
以下是C语言的高级特性语法整理,适合对C语言有基础了解的用户深入学习:
1. 指针高级用法
指针与数组
1 2 3
| int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; printf("%d\n", *(p + 1));
|
指针数组与数组指针
- 指针数组:数组的元素是指针
1 2 3
| int a = 10, b = 20; int *arr[2] = {&a, &b}; printf("%d\n", *arr[1]);
|
- 数组指针:指向数组的指针
1 2 3
| int arr[3] = {1, 2, 3}; int (*p)[3] = &arr; printf("%d\n", (*p)[2]);
|
函数指针
1 2 3
| int add(int x, int y) { return x + y; } int (*func_ptr)(int, int) = add; printf("%d\n", func_ptr(3, 4));
|
2. 动态内存管理
动态内存管理使用 <stdlib.h>
提供的函数。
malloc 和 free
1 2 3 4 5 6 7
| #include <stdlib.h> int *ptr = (int *)malloc(5 * sizeof(int)); if (ptr != NULL) { for (int i = 0; i < 5; i++) ptr[i] = i; for (int i = 0; i < 5; i++) printf("%d ", ptr[i]); free(ptr); }
|
calloc 和 realloc
calloc:分配内存并初始化为0
1
| int *ptr = (int *)calloc(5, sizeof(int));
|
realloc:调整已分配内存的大小
1
| ptr = (int *)realloc(ptr, 10 * sizeof(int));
|
3. 位操作
位运算符
- 按位与:
&
- 按位或:
|
- 按位异或:
^
- 按位取反:
~
- 左移:
<<
- 右移:
>>
示例:
1 2 3 4 5
| int x = 5; int y = 3; printf("%d\n", x & y); printf("%d\n", x | y); printf("%d\n", x ^ y);
|
位操作应用
- 检查某位是否为1:
1
| if (x & (1 << n)) printf("第 %d 位是 1\n", n);
|
- 设置某位为1:
- 清除某位:
4. 结构体高级用法
结构体嵌套
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct Address { char city[20]; int zip; };
struct Person { char name[20]; int age; struct Address addr; };
struct Person p = {"Alice", 25, {"New York", 10001}}; printf("%s, %d\n", p.addr.city, p.addr.zip);
|
结构体指针
1 2 3 4 5 6 7
| struct Person { char name[20]; int age; }; struct Person p = {"Bob", 30}; struct Person *ptr = &p; printf("%s\n", ptr->name);
|
5. 枚举
枚举是常量的集合,用于定义一组相关的命名常量。
1 2 3
| enum Color { RED, GREEN, BLUE }; enum Color c = RED; printf("%d\n", c);
|
可以指定值:
1 2
| enum Color { RED = 1, GREEN = 3, BLUE = 5 }; printf("%d\n", GREEN);
|
6. 联合体(union)
联合体中的所有成员共享同一块内存,节省内存。
1 2 3 4 5 6 7 8
| union Data { int i; float f; char str[20]; }; union Data d; d.i = 10; printf("%d\n", d.i);
|
注意:更新一个成员会覆盖其他成员的值。
7. 宏与预处理器
宏定义
1 2
| #define PI 3.14 printf("%.2f\n", PI);
|
带参数的宏
1 2
| #define SQUARE(x) ((x) * (x)) printf("%d\n", SQUARE(5));
|
条件编译
1 2 3 4 5
| #ifdef DEBUG printf("Debug mode\n"); #else printf("Release mode\n"); #endif
|
8. 文件操作高级用法
二进制文件操作
写入二进制文件:
1 2 3 4
| FILE *file = fopen("data.bin", "wb"); int x = 12345; fwrite(&x, sizeof(int), 1, file); fclose(file);
|
读取二进制文件:
1 2 3 4 5
| FILE *file = fopen("data.bin", "rb"); int x; fread(&x, sizeof(int), 1, file); printf("%d\n", x); fclose(file);
|
9. 可变参数函数
使用 <stdarg.h>
定义接收可变参数的函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdarg.h> #include <stdio.h>
int sum(int count, ...) { va_list args; va_start(args, count); int result = 0; for (int i = 0; i < count; i++) { result += va_arg(args, int); } va_end(args); return result; }
int main() { printf("%d\n", sum(3, 1, 2, 3)); return 0; }
|
10. 动态库与静态库
静态库
- 创建静态库:
1 2
| gcc -c mylib.c ar rcs libmylib.a mylib.o
|
- 使用静态库:
1
| gcc main.c -L. -lmylib -o main
|
动态库
- 创建动态库:
1 2
| gcc -fPIC -c mylib.c gcc -shared -o libmylib.so mylib.o
|
- 使用动态库:
1
| gcc main.c -L. -lmylib -o main
|
11. 多线程编程
使用 pthread
库实现多线程编程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <pthread.h> #include <stdio.h>
void *print_message(void *arg) { printf("Hello from thread!\n"); return NULL; }
int main() { pthread_t thread; pthread_create(&thread, NULL, print_message, NULL); pthread_join(thread, NULL); return 0; }
|
编译时需要链接 pthread
库:
1
| gcc -pthread main.c -o main
|
12. 内存管理工具
valgrind
用于检测内存泄漏:
1
| valgrind --leak-check=full ./program
|