戏说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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return