• 戏说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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    Student *stu_sys;
    stu_sys = malloc(num * sizeof(Student));
    
    • 1
    • 2

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

    void swap(Student *a, Student *b)
    {
        Student tmp = *a;
        *a = *b;
        *b = tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    #include 
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    #include 
    
    int main() {
        char str[] = "Hello, World!";
        char *ptr = str; // ptr 指向 str 的第一个字符
    
        // 当没有到达字符串的结束符 '\0' 时循环
        while(*ptr != '\0') {
            printf("%c", *ptr); // 输出当前字符
            ptr++; // 移动指针到下一个字符
        }
        printf("\n");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    #include 
    
    // 几个简单的数学函数
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

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

    typedef struct student {
        int id; // 学号
        char name[MAX_NAME_LEN]; // 姓名
        float score; // 成绩
        struct student *next;
    } Student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

  • 相关阅读:
    Linux文件实时监控工具inotify-tools的安装和使用
    Java 第一阶段建立编程思想 【面向对象编程(高级部分)】
    高级管理学:大题
    证券行业超融合架构方案设计
    处理vue直接引入图片地址时显示不出来的问题 src=“[object Module]“
    python后端,一个账户,多设备登录管理
    Java中stream是什么?有什么作用?如何使用?
    肠道菌群失调与炎症性肠病的关联
    手把手改进yolo训练自己的数据(坑洼路面识别)
    QGIS制作精美地图
  • 原文地址:https://blog.csdn.net/heu123456/article/details/136359041