实例1:变量与数据类型
在C语言编程中,变量是用来存储数据的容器,而数据类型决定了变量的存储方式和表示范围。以下是一些基本的变量和数据类型的实例:
#include <stdio.h>
int main() {
int age = 20; // 整数类型
float salary = 5000.75; // 单精度浮点数类型
char gender = 'M'; // 字符类型
printf("Age: %d\n", age);
printf("Salary: %.2f\n", salary);
printf("Gender: %c\n", gender);
return 0;
}
在这个例子中,我们定义了三个变量:age、salary和gender,分别存储了年龄、薪资和性别信息。
实例2:运算符与表达式
C语言中的运算符用于对变量进行运算,表达式则是由运算符和变量组成的计算式。以下是一些常见的运算符和表达式的实例:
#include <stdio.h>
int main() {
int a = 10, b = 5;
int sum = a + b; // 加法
int difference = a - b; // 减法
int product = a * b; // 乘法
int quotient = a / b; // 除法
int modulus = a % b; // 取模
printf("Sum: %d\n", sum);
printf("Difference: %d\n", difference);
printf("Product: %d\n", product);
printf("Quotient: %d\n", quotient);
printf("Modulus: %d\n", modulus);
return 0;
}
在这个例子中,我们对两个整数进行了加、减、乘、除和取模运算。
实例3:控制语句
控制语句用于控制程序的执行流程,包括条件语句和循环语句。以下是一些常见的控制语句实例:
#include <stdio.h>
int main() {
int number = 10;
// 条件语句
if (number > 0) {
printf("Number is positive\n");
} else if (number < 0) {
printf("Number is negative\n");
} else {
printf("Number is zero\n");
}
// 循环语句
for (int i = 0; i < 5; i++) {
printf("Loop: %d\n", i);
}
return 0;
}
在这个例子中,我们使用条件语句来判断数字的正负,并使用循环语句打印出从0到4的数字。
实例4:函数
函数是C语言中的核心概念之一,用于将程序分解成可重用的模块。以下是一个简单的函数实例:
#include <stdio.h>
void printMessage() {
printf("Hello, World!\n");
}
int main() {
printMessage(); // 调用函数
return 0;
}
在这个例子中,我们定义了一个名为printMessage的函数,用于打印“Hello, World!”信息,并在main函数中调用它。
实例5:数组
数组是C语言中的一种数据结构,用于存储相同类型的数据序列。以下是一个简单的数组实例:
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("Number %d: %d\n", i, numbers[i]);
}
return 0;
}
在这个例子中,我们定义了一个整型数组numbers,并初始化了5个元素,然后通过循环遍历并打印出每个元素的值。
实例6:指针
指针是C语言中的一种特殊的数据类型,用于存储变量的内存地址。以下是一个简单的指针实例:
#include <stdio.h>
int main() {
int a = 10;
int *ptr = &a; // 指针指向变量a的地址
printf("Value of a: %d\n", a);
printf("Address of a: %p\n", (void *)&a);
printf("Value of ptr: %p\n", (void *)ptr);
printf("Value of *ptr: %d\n", *ptr);
return 0;
}
在这个例子中,我们定义了一个名为ptr的指针,它指向变量a的地址,并打印出a的值、地址、指针的值和指针指向的值。
实例7:结构体
结构体是C语言中的一种自定义数据类型,用于组合多个不同类型的数据。以下是一个简单的结构体实例:
#include <stdio.h>
typedef struct {
int id;
float score;
char name[50];
} Student;
int main() {
Student student1;
student1.id = 1;
student1.score = 90.5;
strcpy(student1.name, "John Doe");
printf("Student ID: %d\n", student1.id);
printf("Student Score: %.1f\n", student1.score);
printf("Student Name: %s\n", student1.name);
return 0;
}
在这个例子中,我们定义了一个名为Student的结构体,用于存储学生的ID、成绩和姓名,并创建了一个student1变量来存储一个学生的信息。
实例8:函数指针
函数指针是指向函数的指针,可以用于存储函数的地址。以下是一个简单的函数指针实例:
#include <stdio.h>
void printMessage() {
printf("Hello, World!\n");
}
int main() {
void (*funcPtr)(void) = printMessage; // 函数指针指向printMessage函数
funcPtr(); // 调用函数指针
return 0;
}
在这个例子中,我们定义了一个名为funcPtr的函数指针,它指向了printMessage函数,并使用函数指针调用了该函数。
实例9:文件操作
文件操作是C语言中的一种常见操作,用于处理文件。以下是一个简单的文件操作实例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w"); // 打开文件进行写入
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
fprintf(file, "Hello, World!\n"); // 写入数据到文件
fclose(file); // 关闭文件
file = fopen("example.txt", "r"); // 打开文件进行读取
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
char buffer[100];
fgets(buffer, sizeof(buffer), file); // 读取数据到缓冲区
printf("File content: %s\n", buffer);
fclose(file); // 关闭文件
return 0;
}
在这个例子中,我们使用fopen函数打开一个名为example.txt的文件进行写入和读取操作,并使用fprintf和fgets函数分别写入和读取数据。
实例10:字符串处理
字符串处理是C语言中的一种常见操作,用于处理字符串。以下是一些简单的字符串处理实例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[100] = "Hello, World!";
char str2[100] = "Hello";
char str3[100];
// 字符串连接
strcpy(str3, str1);
strcat(str3, str2);
printf("Concatenated string: %s\n", str3);
// 字符串比较
int result = strcmp(str1, str2);
if (result == 0) {
printf("Strings are equal\n");
} else if (result > 0) {
printf("str1 is greater than str2\n");
} else {
printf("str1 is less than str2\n");
}
return 0;
}
在这个例子中,我们使用strcpy和strcat函数进行字符串连接,使用strcmp函数比较两个字符串的大小。
实例11:结构体数组
结构体数组是C语言中的一种数据结构,用于存储多个结构体对象。以下是一个简单的结构体数组实例:
#include <stdio.h>
typedef struct {
int id;
float score;
char name[50];
} Student;
int main() {
Student students[3] = {
{1, 90.5, "John Doe"},
{2, 85.0, "Jane Smith"},
{3, 92.0, "Alice Johnson"}
};
for (int i = 0; i < 3; i++) {
printf("Student ID: %d\n", students[i].id);
printf("Student Score: %.1f\n", students[i].score);
printf("Student Name: %s\n", students[i].name);
}
return 0;
}
在这个例子中,我们定义了一个名为students的结构体数组,并初始化了3个学生的信息。
实例12:结构体指针
结构体指针是指向结构体的指针,用于访问结构体成员。以下是一个简单的结构体指针实例:
#include <stdio.h>
typedef struct {
int id;
float score;
char name[50];
} Student;
int main() {
Student student1 = {1, 90.5, "John Doe"};
Student *ptr = &student1;
printf("Student ID: %d\n", ptr->id);
printf("Student Score: %.1f\n", ptr->score);
printf("Student Name: %s\n", ptr->name);
return 0;
}
在这个例子中,我们定义了一个名为ptr的结构体指针,它指向了student1变量,并使用指针访问结构体成员。
实例13:动态内存分配
动态内存分配是C语言中的一种内存管理技术,用于在运行时分配和释放内存。以下是一个简单的动态内存分配实例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numbers = (int *)malloc(5 * sizeof(int)); // 分配内存
if (numbers == NULL) {
printf("Memory allocation failed\n");
return 1;
}
for (int i = 0; i < 5; i++) {
numbers[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
printf("Number %d: %d\n", i, numbers[i]);
}
free(numbers); // 释放内存
return 0;
}
在这个例子中,我们使用malloc函数动态分配了一个整型数组numbers的内存,并初始化了数组元素,然后打印出数组元素,最后使用free函数释放了内存。
实例14:位操作
位操作是C语言中的一种操作,用于直接对二进制位进行操作。以下是一些常见的位操作实例:
#include <stdio.h>
int main() {
int a = 5; // 二进制表示:0000 0101
int b = 3; // 二进制表示:0000 0011
// 按位或
int result_or = a | b; // 二进制表示:0000 0111
printf("a | b: %d\n", result_or);
// 按位与
int result_and = a & b; // 二进制表示:0000 0001
printf("a & b: %d\n", result_and);
// 按位异或
int result_xor = a ^ b; // 二进制表示:0000 0100
printf("a ^ b: %d\n", result_xor);
// 按位取反
int result_not = ~a; // 二进制表示:1111 1010
printf("~a: %d\n", result_not);
return 0;
}
在这个例子中,我们对两个整数a和b进行了按位或、按位与、按位异或和按位取反操作,并打印出操作结果。
实例15:指针数组
指针数组是C语言中的一种数据结构,用于存储多个指针。以下是一个简单的指针数组实例:
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
int *ptrs[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++) {
printf("Value at address %p: %d\n", (void *)ptrs[i], *ptrs[i]);
}
return 0;
}
在这个例子中,我们定义了一个名为ptrs的指针数组,并存储了三个整数的地址,然后通过循环遍历并打印出每个指针指向的值。
实例16:函数指针数组
函数指针数组是C语言中的一种数据结构,用于存储多个函数指针。以下是一个简单的函数指针数组实例:
#include <stdio.h>
void printMessage() {
printf("Hello, World!\n");
}
void printNumber(int number) {
printf("Number: %d\n", number);
}
int main() {
void (*funcPtrs[2])(void) = {printMessage, printNumber};
funcPtrs[0](); // 调用第一个函数指针
funcPtrs[1](5); // 调用第二个函数指针
return 0;
}
在这个例子中,我们定义了一个名为funcPtrs的函数指针数组,并存储了两个函数的地址,然后通过数组索引调用这两个函数。
实例17:结构体指针数组
结构体指针数组是C语言中的一种数据结构,用于存储多个结构体指针。以下是一个简单的结构体指针数组实例:
#include <stdio.h>
typedef struct {
int id;
float score;
char name[50];
} Student;
int main() {
Student student1 = {1, 90.5, "John Doe"};
Student student2 = {2, 85.0, "Jane Smith"};
Student *ptrs[2] = {&student1, &student2};
for (int i = 0; i < 2; i++) {
printf("Student ID: %d\n", ptrs[i]->id);
printf("Student Score: %.1f\n", ptrs[i]->score);
printf("Student Name: %s\n", ptrs[i]->name);
}
return 0;
}
在这个例子中,我们定义了一个名为ptrs的结构体指针数组,并存储了两个学生的地址,然后通过循环遍历并打印出每个指针指向的结构体成员。
实例18:递归函数
递归函数是C语言中的一种函数,它调用自身来解决问题。以下是一个简单的递归函数实例:
#include <stdio.h>
int factorial(int n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int number = 5;
printf("Factorial of %d: %d\n", number, factorial(number));
return 0;
}
在这个例子中,我们定义了一个名为factorial的递归函数,用于计算给定数字的阶乘,并使用该函数计算数字5的阶乘。
实例19:链表
链表是C语言中的一种常见数据结构,用于动态存储数据序列。以下是一个简单的单向链表实例:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void insertAtBeginning(Node **head, int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
int main() {
Node *head = NULL;
insertAtBeginning(&head, 3);
insertAtBeginning(&head, 2);
insertAtBeginning(&head, 1);
printList(head);
return 0;
}
在这个例子中,我们定义了一个名为Node的结构体,用于表示链表节点,并实现了两个函数:insertAtBeginning用于在链表头部插入新节点,printList用于打印链表中的元素。
实例20:二叉树
二叉树是C语言中的一种常见数据结构,用于存储有序数据序列。以下是一个简单的二叉树实例:
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode *createNode(int data) {
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void insertNode(TreeNode **root, int data) {
if (*root == NULL) {
*root = createNode(data);
} else if (data < (*root)->data) {
insertNode(&((*root)->left), data);
} else {
insertNode(&((*root)->right), data);
}
}
void printInOrder(TreeNode *root) {
if (root != NULL) {
printInOrder(root->left);
printf("%d ", root->data);
printInOrder(root->right);
}
}
int main() {
TreeNode *root = NULL;
insertNode(&root, 5);
insertNode(&root, 3);
insertNode(&root, 7);
insertNode(&root, 2);
insertNode(&root, 4);
insertNode(&root, 6);
insertNode(&root, 8);
printf("In-order traversal: ");
printInOrder(root);
printf("\n");
return 0;
}
在这个例子中,我们定义了一个名为TreeNode的结构体,用于表示二叉树节点,并实现了三个函数:createNode用于创建新节点,`insertNode
