一、环境配置与第一个程序
-
安装编译器
Ubuntu/Debian
sudo apt-get install gcc
CentOS/RHEL
sudo yum install gcc
macOS
brew install gcc
Windows
安装MinGW或使用Visual Studio
-
第一个C程序
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
} -
编译和运行
gcc hello.c -o hello
./hello
二、基本语法
-
注释
// 单行注释
/*
多行注释
可以跨越多行
*/ -
变量声明
#include <stdio.h>
int main() {
int age = 25; // 整型变量
float salary = 5000.50; // 浮点型变量
char grade = 'A'; // 字符型变量printf("Age: %d\n", age); printf("Salary: %.2f\n", salary); printf("Grade: %c\n", grade); return 0;
}
三、数据类型
-
基本数据类型
#include <stdio.h>
#include <limits.h>int main() {
// 整型
int integer = 100;
short short_int = 32767;
long long_int = 100000L;// 浮点型 float float_num = 3.14159f; double double_num = 3.1415926535; // 字符型 char character = 'C'; // 布尔型 (C99标准) #include <stdbool.h> bool is_true = true; printf("Integer: %d\n", integer); printf("Float: %.5f\n", float_num); printf("Double: %.10f\n", double_num); printf("Character: %c\n", character); printf("Boolean: %d\n", is_true); return 0;
}
-
类型转换
#include <stdio.h>
int main() {
// 隐式类型转换
int a = 10;
float b = 3.5;
float result = a + b; // a被转换为float// 显式类型转换 float pi = 3.14159; int integer_pi = (int)pi; printf("Result: %.2f\n", result); printf("Integer PI: %d\n", integer_pi); return 0;
}
四、运算符
-
算术运算符
#include <stdio.h>
int main() {
int a = 10, b = 3;printf("a + b = %d\n", a + b); // 加法 printf("a - b = %d\n", a - b); // 减法 printf("a * b = %d\n", a * b); // 乘法 printf("a / b = %d\n", a / b); // 除法 printf("a %% b = %d\n", a % b); // 取模 // 自增自减 int x = 5; printf("x++: %d\n", x++); // 后置自增 printf("++x: %d\n", ++x); // 前置自增 return 0;
}
-
关系运算符
#include <stdio.h>
int main() {
int a = 10, b = 20;printf("a == b: %d\n", a == b); // 等于 printf("a != b: %d\n", a != b); // 不等于 printf("a > b: %d\n", a > b); // 大于 printf("a < b: %d\n", a < b); // 小于 printf("a >= b: %d\n", a >= b); // 大于等于 printf("a <= b: %d\n", a <= b); // 小于等于 return 0;
}
-
逻辑运算符
#include <stdio.h>
int main() {
int a = 1, b = 0;printf("a && b: %d\n", a && b); // 逻辑与 printf("a || b: %d\n", a || b); // 逻辑或 printf("!a: %d\n", !a); // 逻辑非 return 0;
}
五、控制结构
-
条件语句
#include <stdio.h>
int main() {
int score = 85;// if-else语句 if (score >= 90) { printf("Grade: A\n"); } else if (score >= 80) { printf("Grade: B\n"); } else if (score >= 70) { printf("Grade: C\n"); } else { printf("Grade: F\n"); } // switch语句 char grade = 'B'; switch (grade) { case 'A': printf("Excellent!\n"); break; case 'B': printf("Good!\n"); break; case 'C': printf("Average!\n"); break; default: printf("Need improvement!\n"); } return 0;
}
-
循环语句
#include <stdio.h>
int main() {
int i;// for循环 printf("For loop: "); for (i = 0; i < 5; i++) { printf("%d ", i); } printf("\n"); // while循环 printf("While loop: "); i = 0; while (i < 5) { printf("%d ", i); i++; } printf("\n"); // do-while循环 printf("Do-while loop: "); i = 0; do { printf("%d ", i); i++; } while (i < 5); printf("\n"); // break和continue printf("Break example: "); for (i = 0; i < 10; i++) { if (i == 5) break; printf("%d ", i); } printf("\n"); printf("Continue example: "); for (i = 0; i < 5; i++) { if (i == 2) continue; printf("%d ", i); } printf("\n"); return 0;
}
六、函数
-
函数定义和调用
#include <stdio.h>
// 函数声明
int add(int a, int b);
void print_message();// 主函数
int main() {
int result = add(5, 3);
printf("5 + 3 = %d\n", result);print_message(); return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}void print_message() {
printf("Hello from function!\n");
} -
递归函数
#include <stdio.h>
// 递归计算阶乘
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}int main() {
int num = 5;
printf("Factorial of %d is %d\n", num, factorial(num));
return 0;
}
七、数组
-
一维数组
#include <stdio.h>
int main() {
// 数组声明和初始化
int numbers[5] = {1, 2, 3, 4, 5};
float grades[3] = {85.5, 90.0, 78.5};// 访问数组元素 printf("First number: %d\n", numbers[0]); printf("Third grade: %.1f\n", grades[2]); // 遍历数组 printf("All numbers: "); for (int i = 0; i < 5; i++) { printf("%d ", numbers[i]); } printf("\n"); return 0;
}
-
多维数组
#include <stdio.h>
int main() {
// 二维数组
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};// 访问二维数组 printf("Element at [1][2]: %d\n", matrix[1][2]); // 遍历二维数组 printf("Matrix:\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } return 0;
}
八、指针
-
基本指针操作
#include <stdio.h>
int main() {
int number = 100;
int *ptr = &number; // 指针指向number的地址printf("Value of number: %d\n", number); printf("Address of number: %p\n", &number); printf("Value of pointer: %p\n", ptr); printf("Value pointed by pointer: %d\n", *ptr); // 通过指针修改变量值 *ptr = 200; printf("New value of number: %d\n", number); return 0;
}
-
指针与数组
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr; // 指向数组首元素printf("Array elements using pointer:\n"); for (int i = 0; i < 5; i++) { printf("arr[%d] = %d\n", i, *(ptr + i)); } return 0;
}
-
指针与函数
#include <stdio.h>
// 通过指针交换两个变量的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}int main() {
int x = 10, y = 20;printf("Before swap: x = %d, y = %d\n", x, y); swap(&x, &y); printf("After swap: x = %d, y = %d\n", x, y); return 0;
}
九、结构体
-
结构体定义和使用
#include <stdio.h>
#include <string.h>// 定义结构体
struct Student {
char name[50];
int age;
float grade;
};int main() {
// 声明结构体变量
struct Student student1;// 初始化结构体成员 strcpy(student1.name, "张三"); student1.age = 20; student1.grade = 88.5; // 访问结构体成员 printf("Student Name: %s\n", student1.name); printf("Student Age: %d\n", student1.age); printf("Student Grade: %.1f\n", student1.grade); // 结构体数组 struct Student students[3] = { {"李四", 21, 92.0}, {"王五", 19, 85.5}, {"赵六", 22, 78.0} }; printf("\nAll students:\n"); for (int i = 0; i < 3; i++) { printf("%s, %d, %.1f\n", students[i].name, students[i].age, students[i].grade); } return 0;
}
-
结构体与指针
#include <stdio.h>
struct Point {
int x;
int y;
};int main() {
struct Point p1 = {10, 20};
struct Point *ptr = &p1;// 通过指针访问结构体成员 printf("Point coordinates: (%d, %d)\n", ptr->x, ptr->y); // 修改结构体成员 ptr->x = 30; ptr->y = 40; printf("New coordinates: (%d, %d)\n", p1.x, p1.y); return 0;
}
十、文件操作
-
文件读写
#include <stdio.h>
int main() {
FILE *file;
char text[100];// 写入文件 file = fopen("example.txt", "w"); if (file == NULL) { printf("Error opening file for writing!\n"); return 1; } fprintf(file, "Hello, File!\n"); fprintf(file, "This is a test file.\n"); fclose(file); // 读取文件 file = fopen("example.txt", "r"); if (file == NULL) { printf("Error opening file for reading!\n"); return 1; } printf("File contents:\n"); while (fgets(text, sizeof(text), file) != NULL) { printf("%s", text); } fclose(file); return 0;
}
-
二进制文件操作
#include <stdio.h>
struct Data {
int id;
float value;
};int main() {
FILE *file;
struct Data data;// 写入二进制数据 file = fopen("data.bin", "wb"); if (file == NULL) { printf("Error opening binary file for writing!\n"); return 1; } struct Data write_data = {1, 3.14}; fwrite(&write_data, sizeof(struct Data), 1, file); fclose(file); // 读取二进制数据 file = fopen("data.bin", "rb"); if (file == NULL) { printf("Error opening binary file for reading!\n"); return 1; } fread(&data, sizeof(struct Data), 1, file); printf("Read data: id=%d, value=%.2f\n", data.id, data.value); fclose(file); return 0;
}
十一、内存管理
-
动态内存分配
#include <stdio.h>
#include <stdlib.h>int main() {
int *arr;
int n;printf("Enter the size of array: "); scanf("%d", &n); // 动态分配内存 arr = (int*)malloc(n * sizeof(int)); if (arr == NULL) { printf("Memory allocation failed!\n"); return 1; } // 使用动态数组 printf("Enter %d integers:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("You entered: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放内存 free(arr); return 0;
}
-
其他内存函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {
// malloc - 分配未初始化的内存
int ptr1 = (int)malloc(5 * sizeof(int));// calloc - 分配并初始化为0的内存 int *ptr2 = (int*)calloc(5, sizeof(int)); // realloc - 重新分配内存 ptr1 = (int*)realloc(ptr1, 10 * sizeof(int)); printf("calloc initialized to zeros:\n"); for (int i = 0; i < 5; i++) { printf("%d ", ptr2[i]); } printf("\n"); // 释放内存 free(ptr1); free(ptr2); return 0;
}
十二、编译和调试技巧
-
常用编译选项
基本编译
gcc program.c -o program
显示所有警告
gcc -Wall program.c -o program
调试信息
gcc -g program.c -o program
优化级别
gcc -O2 program.c -o program
指定标准
gcc -std=c99 program.c -o program
-
预处理指令
#include <stdio.h>
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {
printf("PI = %.5f\n", PI);
printf("MAX(10, 20) = %d\n", MAX(10, 20));#ifdef DEBUG printf("Debug mode enabled\n"); #endif return 0;
}
总结:这份C语言基础指南涵盖了从基本语法到高级特性的核心概念,包括变量、控制结构、函数、指针、结构体、文件操作和内存管理。掌握这些基础知识是学习更高级C语言编程和系统开发的必要条件。