C语言教程:快速入门
以下是一个简要而全面的C语言教程,旨在帮助你快速复习或掌握C语言的核心概念。内容涵盖基本语法、数据类型、控制结构、函数、数组、指针、结构体、文件操作等关键知识点,结构清晰,适合快速浏览。
1. C语言简介
C语言是一种通用的、结构化的编程语言,由Dennis Ritchie在20世纪70年代开发,广泛用于系统编程、嵌入式开发和应用软件开发。C语言以高效、灵活和底层操作能力著称。
2. 基本程序结构
一个简单的C程序结构如下:
#include <stdio.h> // 包含标准输入输出库
int main() { // 主函数,程序入口
printf("Hello, World!\n"); // 打印输出
return 0; // 返回0表示程序正常结束
}
- #include:引入头文件,如
<stdio.h>用于输入输出。 - main函数:程序的入口点,必须返回
int类型。 - 注释:
- 单行:
// 注释内容 - 多行:
/* 注释内容 */
- 单行:
3. 数据类型
C语言支持以下基本数据类型:
- 基本类型:
int:整数(如int x = 10;)float:单精度浮点数(如float y = 3.14;)double:双精度浮点数(如double z = 3.14159;)char:字符(如char c = 'A';)
- 修饰符:
signed/unsigned:有符号/无符号(如unsigned int)short/long:短整型/长整型(如long int)
- 其他:
void:表示无类型,常用于函数无返回值或指针。- 枚举:
enum color {RED, GREEN, BLUE}; - 派生类型:数组、指针、结构体(见后文)。
4. 变量与常量
- 变量声明:
type variable_name = value;(如int x = 5;) - 常量:
- 字面常量:如
42、"hello"。 - 使用
const关键字:const float PI = 3.14159; - 宏定义:
#define PI 3.14159
- 字面常量:如
- 作用域:
- 局部变量:函数内部定义,仅在函数内有效。
- 全局变量:定义在函数外部,整个程序有效。
5. 输入与输出
使用<stdio.h>提供的函数:
- 输出:
printf("格式化字符串", 变量);(如printf("x = %d", x);)- 格式说明符:
%d(整数)、%f(浮点数)、%c(字符)、%s(字符串)。
- 输入:
scanf("%d", &x);(读取整数,注意&取地址)。- 示例:
int x; printf("Enter a number: "); scanf("%d", &x); printf("You entered: %d\n", x);
6. 运算符
- 算术:
+,-,*,/,%(取模) - 关系:
==,!=,>,<,>=,<= - 逻辑:
&&(与)、||(或)、!(非) - 位运算:
&(按位与)、|(按位或)、^(异或)、~(取反)、<<(左移)、>>(右移) - 赋值:
=,+=,-=,*=,/=,%= - 其他:
- 自增/自减:
++,-- - 条件运算符:
条件 ? 表达式1 : 表达式2
- 自增/自减:
7. 控制结构
- 条件语句:
if (条件) { // 代码 } else if (条件) { // 代码 } else { // 代码 }- 三元运算符:
x > y ? x : y
- 三元运算符:
- 开关语句:
switch (变量) { case 值1: // 代码 break; case 值2: // 代码 break; default: // 默认代码 } - 循环:
for:for (初始化; 条件; 更新) { 代码 }while:while (条件) { 代码 }do-while:do { 代码 } while (条件);- 控制:
break(跳出循环)、continue(跳到下一次循环)。
8. 函数
函数用于模块化代码:
- 定义:
返回类型 函数名(参数类型 参数) { // 代码 return 值; // 如果返回类型不是void }- 示例:
int add(int a, int b) { return a + b; }
- 示例:
- 调用:
int sum = add(3, 4); - 函数声明:在调用前声明函数原型,如
int add(int, int); - 递归:函数调用自身,如计算阶乘:
int factorial(int n) { if (n <= 1) return 1; return n * factorial(n - 1); }
9. 数组
数组存储相同类型的元素:
- 声明:
type array_name[大小];(如int arr[5];) - 初始化:
int arr[5] = {1, 2, 3, 4, 5}; - 访问:
arr[索引](索引从0开始) - 多维数组:如
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; - 遍历:
for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); }
10. 指针
指针存储变量的内存地址:
- 声明:
type *pointer_name;(如int *p;) - 赋值:
p = &x;(&取地址) - 解引用:
*p访问指针指向的值 - 指针与数组:
- 数组名是首元素地址:
int *p = arr; - 指针运算:
p + 1指向下一个元素。
- 数组名是首元素地址:
- 动态内存分配(需要
<stdlib.h>):- 分配:
int *p = malloc(sizeof(int) * n); - 释放:
free(p); - 重新分配:
p = realloc(p, 新大小);
- 分配:
11. 字符串
C中字符串是字符数组,以空字符'\0'结尾:
- 声明:
char str[10] = "hello"; - 操作(需要
<string.h>):- 复制:
strcpy(dest, src); - 连接:
strcat(dest, src); - 比较:
strcmp(str1, str2); - 长度:
strlen(str);
- 复制:
- 输入输出:
- 输出:
printf("%s", str); - 输入:
scanf("%s", str);(不读空格)或fgets(str, sizeof(str), stdin);
- 输出:
12. 结构体
结构体用于存储不同类型的数据:
- 定义:
struct Point { int x; int y; }; - 声明与访问:
struct Point p = {3, 4}; printf("x: %d, y: %d\n", p.x, p.y); - 指针访问:
struct Point *ptr = &p; ptr->x; - typedef:简化定义,如
typedef struct Point Point;
13. 文件操作
使用<stdio.h>进行文件读写:
- 打开文件:
FILE *fp = fopen("file.txt", "r");(模式:r读、w写、a追加) - 读写:
- 读字符:
fgetc(fp); - 写字符:
fputc('A', fp); - 读字符串:
fgets(str, sizeof(str), fp); - 写字符串:
fputs(str, fp); - 格式化读写:
fscanf(fp, "%d", &x);,fprintf(fp, "%d", x);
- 读字符:
- 关闭文件:
fclose(fp); - 检查文件结束:
feof(fp)
14. 预处理器
- 宏定义:
#define NAME value - 条件编译:
#ifdef DEBUG printf("Debug mode\n"); #endif - 头文件包含:
#include <file.h>或#include "file.h"
15. 常见库函数
<stdlib.h>:malloc,free,rand,atoi<math.h>:sqrt,pow,sin,cos<time.h>:time,clock<ctype.h>:isalpha,isdigit,toupper
16. 示例程序
计算数组平均值:
#include <stdio.h>
float average(int arr[], int size) {
float sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum / size;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Average: %.2f\n", average(arr, size));
return 0;
}
17. 调试与错误处理
- 常见错误:
- 空指针:访问未初始化的指针。
- 数组越界:访问非法索引。
- 内存泄漏:未释放动态分配的内存。
- 调试工具:使用
gdb或IDE调试器。 - 错误检查:检查函数返回值(如
fopen返回NULL)。
18. 学习建议
- 实践:编写小项目,如计算器、学生管理系统。
- 调试:熟练使用
printf调试或调试工具。 - 资源:参考《C Primer Plus》或在线教程(如Learn-C.org)。
- 练习:尝试解决LeetCode的C语言题目。
这个教程涵盖了C语言的核心内容,适合快速复习。如果需要深入某个部分或代码示例,请告诉我!
留下评论