1. 数据类型与变量
1.1 数据类型
在C语言中,数据类型是定义变量存储的数据种类的关键字。常见的有整型(int)、浮点型(float)、字符型(char)等。
int a = 10;
float b = 3.14;
char c = 'A';
1.2 变量
变量是内存中的一个存储位置,用于存储数据。在声明变量时,需要指定数据类型和变量名。
int a;
a = 10;
2. 运算符与表达式
2.1 运算符
C语言中的运算符用于对变量进行运算。常见的有算术运算符、关系运算符、逻辑运算符等。
int a = 5, b = 3;
int sum = a + b; // 算术运算符
int is_equal = (a == b); // 关系运算符
int is_greater = (a > b); // 关系运算符
int result = (is_equal && is_greater); // 逻辑运算符
2.2 表达式
表达式是由运算符和操作数组成的式子。C语言中的表达式可以进行计算,并返回结果。
int a = 5, b = 3;
int result = (a + b) * (a - b); // 表达式计算
3. 控制结构
3.1 顺序结构
顺序结构是程序中最基本的结构,按照代码书写的顺序依次执行。
int a = 5, b = 3;
int c = a + b;
printf("The sum of a and b is %d\n", c);
3.2 选择结构
选择结构用于根据条件判断执行不同的代码块。
int a = 5, b = 3;
if (a > b) {
printf("a is greater than b\n");
} else {
printf("a is less than or equal to b\n");
}
3.3 循环结构
循环结构用于重复执行一段代码,直到满足特定条件。
int i;
for (i = 0; i < 10; i++) {
printf("i = %d\n", i);
}
4. 函数
4.1 函数定义
函数是C语言中实现代码重用的基本单位。通过定义函数,可以将一段代码封装起来,方便在其他地方调用。
void print_message() {
printf("Hello, world!\n");
}
4.2 函数调用
函数调用是指通过函数名和参数来执行函数中的代码。
print_message(); // 调用函数
5. 数组
5.1 一维数组
一维数组用于存储一系列具有相同数据类型的元素。
int arr[5] = {1, 2, 3, 4, 5};
5.2 二维数组
二维数组用于存储具有二维结构的元素。
int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
6. 指针
6.1 指针定义
指针是存储变量地址的变量。通过指针,可以访问和修改变量的值。
int a = 5;
int *ptr = &a; // 指针指向变量a的地址
6.2 指针运算
指针运算包括指针的加减、比较等。
int a = 5;
int *ptr = &a;
printf("The value of a is %d\n", *ptr); // 输出变量a的值
7. 字符串
7.1 字符串定义
字符串是由字符组成的序列,用于存储文本数据。
char str[] = "Hello, world!";
7.2 字符串操作
C语言提供了丰富的字符串操作函数,如strlen、strcpy、strcat等。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "world!";
char str3[20];
strcpy(str3, str1); // 复制字符串
strcat(str3, str2); // 连接字符串
printf("The concatenated string is %s\n", str3);
return 0;
}
8. 文件操作
8.1 文件打开
在C语言中,使用fopen函数打开文件。
FILE *fp = fopen("example.txt", "r");
8.2 文件读取
使用fscanf、fgets等函数读取文件内容。
int num;
fscanf(fp, "%d", &num);
8.3 文件关闭
使用fclose函数关闭文件。
fclose(fp);
9. 动态内存分配
9.1 动态内存分配
使用malloc、calloc、realloc等函数动态分配内存。
int *arr = (int *)malloc(10 * sizeof(int));
9.2 动态内存释放
使用free函数释放动态分配的内存。
free(arr);
10. 结构体
10.1 结构体定义
结构体是用于组织不同类型数据的复合数据类型。
struct Student {
char name[50];
int age;
float score;
};
10.2 结构体变量
创建结构体变量并初始化。
struct Student stu1;
strcpy(stu1.name, "Alice");
stu1.age = 20;
stu1.score = 90.5;
11. 链表
11.1 链表节点定义
链表节点包含数据和指向下一个节点的指针。
struct Node {
int data;
struct Node *next;
};
11.2 链表操作
链表操作包括创建链表、插入节点、删除节点等。
struct Node *head = NULL;
struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
new_node->data = 10;
new_node->next = head;
head = new_node;
12. 线程
12.1 线程创建
在C语言中,使用pthread库创建线程。
#include <pthread.h>
void *thread_function(void *arg) {
// 线程执行代码
return NULL;
}
int main() {
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);
pthread_join(thread_id, NULL);
return 0;
}
13. 网络编程
13.1 套接字创建
在C语言中,使用socket函数创建套接字。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int sock = socket(AF_INET, SOCK_STREAM, 0);
13.2 套接字连接
使用connect函数连接服务器。
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
14. 图形编程
14.1 图形库
C语言中常用的图形库有SDL、OpenGL等。
#include <SDL.h>
SDL_Window *window = SDL_CreateWindow("Hello, world!", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
14.2 图形绘制
使用图形库提供的函数绘制图形。
SDL_RenderClear(renderer);
SDL_RenderDrawLine(renderer, 100, 100, 200, 200);
SDL_RenderPresent(renderer);
15. 数据库编程
15.1 数据库连接
在C语言中,使用数据库连接函数连接数据库。
#include <mysql.h>
MYSQL *conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "username", "password", "database", 0, NULL, 0);
15.2 数据库操作
使用数据库操作函数查询、插入、更新、删除数据。
mysql_query(conn, "SELECT * FROM table");
mysql_fetch_row(result);
16. 网络安全
16.1 加密算法
C语言中常用的加密算法有AES、RSA等。
#include <openssl/aes.h>
AES_KEY key;
AES_set_encrypt_key(key, 128, &key);
16.2 数字签名
数字签名用于验证数据的完整性和真实性。
#include <openssl/evp.h>
EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, NULL);
EVP_DigestSignUpdate(mdctx, data, data_len);
EVP_DigestSignFinal(mdctx, signature, &signature_len);
17. 算法与数据结构
17.1 排序算法
C语言中常用的排序算法有冒泡排序、选择排序、插入排序等。
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
17.2 树状结构
C语言中常用的树状结构有二叉树、平衡树等。
struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode *root = NULL;
root = create_tree_node(1);
root->left = create_tree_node(2);
root->right = create_tree_node(3);
18. 操作系统
18.1 进程管理
C语言中可以使用操作系统提供的API进行进程管理。
#include <sys/types.h>
#include <sys/wait.h>
pid_t pid = fork();
if (pid == 0) {
// 子进程
} else {
// 父进程
}
18.2 内存管理
C语言中可以使用操作系统提供的API进行内存管理。
#include <sys/mman.h>
void *memory = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
19. 网络编程实战案例
19.1 HTTP服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
void handle_request(int client_sock) {
// 处理客户端请求
}
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
server_sock = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_sock, 5);
while (1) {
client_addr_len = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_len);
handle_request(client_sock);
close(client_sock);
}
close(server_sock);
return 0;
}
19.2 FTP客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 21
void send_command(int sock, const char *command) {
// 发送命令
}
void receive_response(int sock) {
// 接收响应
}
int main() {
int sock;
struct sockaddr_in server_addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
send_command(sock, "USER username\n");
receive_response(sock);
send_command(sock, "PASS password\n");
receive_response(sock);
close(sock);
return 0;
}
20. 图形编程实战案例
20.1 SDL游戏
#include <SDL.h>
int main() {
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, 0);
while (1) {
SDL_PollEvent(&event);
if (event.type == SDL_QUIT) {
break;
}
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
// 绘制游戏画面
SDL_RenderPresent(renderer);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
20.2 OpenGL渲染
#include <GL/glut.h>
void display() {
// 渲染画面
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutCreateWindow("OpenGL Rendering");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
21. 数据库编程实战案例
21.1 MySQL查询
#include <mysql.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "username", "password", "database", 0, NULL, 0);
mysql_query(conn, "SELECT * FROM table");
res = mysql_use_result(conn);
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s\n", row[0]);
}
mysql_free_result(res);
mysql_close(conn);
return 0;
}
21.2 MongoDB操作
#include <bson-c.h>
#include <mongoc.h>
int main() {
mongoc_client_t *client;
mongoc_collection_t *collection;
bson_t *doc;
client = mongoc_client_new("mongodb://localhost:27017");
collection = mongoc_client_get_collection(client, "database", "collection");
doc = BSON_NEW();
bson_append_utf8(doc, "name", -1, "Alice");
bson_append_int32(doc, "age", -1, 20);
mongoc_collection_insert_one(collection, doc, NULL, NULL);
bson_destroy(doc);
mongoc_collection_destroy(collection);
mongoc_client_destroy(client);
return 0;
}
22. 网络安全实战案例
22.1 AES加密
#include <openssl/aes.h>
void aes_encrypt(const unsigned char *input, unsigned char *output, const unsigned char *key, const unsigned char *iv) {
AES_KEY aes_key;
AES_set_encrypt_key(key, 128, &aes_key);
AES_cbc_encrypt(input, output, AES_BLOCK_SIZE, &aes_key, iv, AES_ENCRYPT);
}
int main() {
const unsigned char input[] = "Hello, world!";
unsigned char output[AES_BLOCK_SIZE];
const unsigned char key[] = "1234567890123456";
const unsigned char iv[] = "1234567890123456";
aes_encrypt(input, output, key, iv);
printf("Encrypted: %s\n", output);
return 0;
}
22.2 RSA加密
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
void rsa_encrypt(const unsigned char *input, unsigned char *output, RSA *rsa) {
int len = RSA_size(rsa);
int ret = RSA_public_encrypt(input, output, rsa, RSA_PKCS1_PADDING, len);
if (ret < 0) {
ERR_print_errors_fp(stderr);
}
}
int main() {
FILE *pub_key_file = fopen("public.pem", "r");
RSA *rsa = PEM_read_RSAPublicKey(pub_key_file, NULL, NULL, NULL);
fclose(pub_key_file);
const unsigned char input[] = "Hello, world!";
unsigned char output[RSA_size(rsa)];
rsa_encrypt(input, output, rsa);
printf("Encrypted: %s\n", output);
RSA_free(rsa);
return 0;
}
23. 算法与数据结构实战案例
23.1 冒泡排序
”`c void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {5, 2, 8, 3, 1};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
