戏说c语言: 阶段性总结二

2024-02-29 21:36
文章标签 语言 总结 阶段性 戏说

本文主要是介绍戏说c语言: 阶段性总结二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

师弟:“师兄,我终于和我喜欢的女生在一起了。感谢师兄呀。”
我:“恭喜啊,师弟!”
师弟:“这要全靠这段学习c的缘分了啊,两个人没事交流c语言,一起去上课,共同成长。”
我:“这叫缘分天注定。看你成为了笑道最后的人了吧。”

c语言的学习也是一样的,需要持续性的学习和投入。不断地去试错,不要因为一次bug,而望而却步。

总结

经过几番努力,终于完成了一个初版的学生成绩管理系统。这个只是一个系统初版模型,还有很多提高和优化的地方。但是这个系统,基本上将学习到的最基本的c的知识应用其中。现在我们来回顾总结一下。

学生成绩管理系统
有人说指针是c语言中最难学习的部分,要说指针难吧,也难,要说不难,也不难,正如彭端淑所说:“天下事,难易乎,为之,则难者亦易矣。”就看你有没有去学习的心态。现我们也将指针的一些典型用法做如下的总结。
指针一些典型用法主要有:
1. 访问数组元素:指针可以遍历数组元素。如学生系统中的students的访问,代码片段如下:

Student *students; // 学生数组指针for(i = 0; i < student_count; i++) {if(students[i].id == id) {students[i].score = score;printf("Score added successfully!\n");return;}
}

2. 动态内存分配:指针用于动态分配内存,通过malloc、calloc、realloc和free等函数。如学生系统的代码片段:

Student *stu_sys;
stu_sys = malloc(num * sizeof(Student));

3. 函数参数的传递:使用指针可以传递函数参数的引用,使得函数能够修改实参的值。如学生系统的代码片段:

void swap(Student *a, Student *b)
{Student tmp = *a;*a = *b;*b = tmp;
}

4. 指向指针的指针(二级指针或多级指针):动态分配二维数组或处理指针数组等。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int i;// 动态分配一个字符串数组char **str_array = (char **)malloc(3 * sizeof(char *));str_array[0] = (char *)malloc(20 * sizeof(char));str_array[1] = (char *)malloc(20 * sizeof(char));str_array[2] = (char *)malloc(20 * sizeof(char));strcpy(str_array[0], "Hello,");strcpy(str_array[1], "World!");strcpy(str_array[2], "Greetings!");for (i = 0; i < 3; i++) {printf("%s ", str_array[i]);free(str_array[i]); // 释放每个字符串的内存}printf("\n");free(str_array); // 释放字符串数组的内存return 0;
}

5. 操作字符串:字符串是通过字符数组实现的,用字符指针可以操作字符串。

#include <stdio.h>int main() {char str[] = "Hello, World!";char *ptr = str; // ptr 指向 str 的第一个字符// 当没有到达字符串的结束符 '\0' 时循环while(*ptr != '\0') {printf("%c", *ptr); // 输出当前字符ptr++; // 移动指针到下一个字符}printf("\n");return 0;
}

6. 函数指针:函数指针指向函数,可以用来实现回调函数和函数的多态调用。在dpdk调用驱动的时候,使用的比较多,这样对于不同的驱动,接口名都是一个。

#include <stdio.h>// 几个简单的数学函数
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int divi(int a, int b) { return b != 0 ? a / b : 0; }int main()
{// 定义一个函数指针数组并初始化int (*operations[4])(int, int) = {add, sub, mul, divi};// 使用函数指针数组来执行操作int i;int a = 10, b = 5;char *names[] = {"Addition", "Subtraction", "Multiplication", "Division"};for (i = 0; i < 4; i++) {printf("%s: %d\n", names[i], operations[i](a, b));}return 0;
}// 输出:
// Addition: 15
// Subtraction: 5
// Multiplication: 50
// Division: 2

7. 在数据结构中的应用:使用指针可以构造链表、树和图等复杂的动态数据结构。如学生系统中结构体的定义:

typedef struct student {int id; // 学号char name[MAX_NAME_LEN]; // 姓名float score; // 成绩struct student *next;
} Student;

8. IO操作:文件IO(fread、fwrite等)通常使用指针来指向数据缓冲区。如学生系统中的写文件操作:

int write_student_info(Student *s)
{FILE *fp = fopen(STUDENT_SYSTEM, "a");if (fp == NULL) {printf("fopen student_system failed!\n");return 1;}fprintf(fp, "%-4d %-10s %-.2f\n", s->id, s->name, s->score);fclose(fp);return 0;
}

自此,我们迈入了c语言的大门。后面能够走多远,就看做了多少的练习。

《C专家编程》
《C陷阱和缺陷》
《深入理解操作系统》

这篇关于戏说c语言: 阶段性总结二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760166

相关文章

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1