0%

C 语法速览

基本语法

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,值为01

示例:

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
printf("格式化字符串", 参数);

示例:

1
2
int x = 10;
printf("x的值是: %d\n", x); // %d 用于整型

输入:

1
scanf("格式化字符串", &变量);

示例:

1
2
3
4
int x;
printf("请输入一个整数: ");
scanf("%d", &x); // %d 表示输入整型,变量前需要加 &
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 (变量) {
case1:
// 代码块
break;
case2:
// 代码块
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 (初始化; 条件; 更新) {
// 循环体
}

示例:

1
2
3
for (int i = 0; i < 5; i++) {
printf("%d ", i);
}

while 循环:

1
2
3
while (条件) {
// 循环体
}

示例:

1
2
3
4
5
int i = 0;
while (i < 5) {
printf("%d ", i);
i++;
}

do-while 循环:

1
2
3
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;
}

函数的声明:

1
int add(int x, int y); // 函数声明

声明必须位于调用之前,或者放在头文件中。


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]); // 输出 6

9. 指针

指针的基本操作:

1
2
3
4
int x = 10;
int *p = &x; // 指针存储变量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); // 输出 1

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)); // 输出第二个元素 2

指针数组与数组指针

  • 指针数组:数组的元素是指针
    1
    2
    3
    int a = 10, b = 20;
    int *arr[2] = {&a, &b}; // 指针数组
    printf("%d\n", *arr[1]); // 输出 20
  • 数组指针:指向数组的指针
    1
    2
    3
    int arr[3] = {1, 2, 3};
    int (*p)[3] = &arr; // 数组指针
    printf("%d\n", (*p)[2]); // 输出 3

函数指针

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)); // 输出 7

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;  // 0101
int y = 3; // 0011
printf("%d\n", x & y); // 0001 -> 1
printf("%d\n", x | y); // 0111 -> 7
printf("%d\n", x ^ y); // 0110 -> 6

位操作应用

  • 检查某位是否为1:
    1
    if (x & (1 << n)) printf("第 %d 位是 1\n", n);
  • 设置某位为1:
    1
    x |= (1 << n);
  • 清除某位:
    1
    x &= ~(1 << n);

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); // 输出 New York, 10001

结构体指针

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); // 输出 Bob

5. 枚举

枚举是常量的集合,用于定义一组相关的命名常量。

1
2
3
enum Color { RED, GREEN, BLUE };
enum Color c = RED;
printf("%d\n", c); // 输出 0(默认从0开始编号)

可以指定值:

1
2
enum Color { RED = 1, GREEN = 3, BLUE = 5 };
printf("%d\n", GREEN); // 输出 3

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); // 输出 10

注意:更新一个成员会覆盖其他成员的值。


7. 宏与预处理器

宏定义

1
2
#define PI 3.14
printf("%.2f\n", PI);

带参数的宏

1
2
#define SQUARE(x) ((x) * (x))
printf("%d\n", SQUARE(5)); // 输出 25

条件编译

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); // 输出 12345
    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)); // 输出 6
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