2024-2025-1 20241312《计算机基础与程序设计》第九周学习总结

作业信息

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)
这个作业的目标 操作系统责任
内存与进程管理
分时系统
CPU调度
文件、文件系统
文件保护
磁盘调度
作业正文 https://www.cnblogs.com/songjialinsjl/p/18565271

教材学习内容总结

  1. 操作系统责任
    操作系统(OS)是管理计算机硬件与软件资源的系统软件,它负责提供用户与计算机硬件之间的交互界面,同时负责分配和管理系统资源,如处理器时间、内存空间和文件存储。

  2. 内存与进程管理

    • 内存管理:操作系统负责内存的分配和回收,确保程序运行时有足够的内存空间,同时防止不同程序间的内存冲突。
    • 进程管理:操作系统需要创建、调度、管理和终止进程。进程是程序执行的实体,操作系统通过进程管理确保程序能够并发执行。
  3. 分时系统
    分时系统是一种操作系统,它允许多个用户同时使用计算机资源。系统将CPU时间分成短的时间段,每个用户或进程轮流使用这些时间段,从而创建了多任务处理的假象。

  4. CPU调度
    CPU调度(或称进程调度)是操作系统决定哪个进程应该获得CPU时间的技术。调度算法的目标包括公平性、响应时间、吞吐量和优先级处理等。

  5. 文件、文件系统

    • 文件:文件是数据存储的基本单位,操作系统提供创建、读取、写入和删除文件的功能。
    • 文件系统:文件系统是组织和管理文件存储和检索的方式,它包括文件的命名、存储、检索和保护。
  6. 文件保护
    文件保护确保文件只能被授权的用户访问和修改。操作系统通过权限控制和访问控制列表(ACLs)来实现文件保护。

  7. 磁盘调度
    磁盘调度是操作系统决定磁盘请求处理顺序的算法。由于磁盘I/O操作相对较慢,磁盘调度算法(如先进先出、最短寻道时间优先等)旨在减少寻道时间和旋转延迟,提高磁盘性能。

教材学习中的问题和解决过程(先问 AI)

问题一:指针怎么指向二维数组?
回答:在C语言中,二维数组可以通过指针来访问和操作。二维数组本质上是一个数组的数组,因此可以通过多种方式使用指针来指向和操作二维数组。以下是几种常见的方法:

1. 指向整个二维数组

你可以直接让指针指向二维数组的首地址:

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int (*ptr)[4] = arr; // ptr指向整个二维数组

在这里,ptr 是一个指向含有4个整数的数组的指针,即指向二维数组的第一行。

2. 指向二维数组的一行

你也可以让指针指向二维数组的某一行:

int *rowPtr = arr[0]; // rowPtr指向二维数组的第一行

在这里,rowPtr 是一个指向整型的指针,指向二维数组的第一行的第一个元素。

3. 通过指针访问二维数组元素

通过指针访问二维数组的元素,你可以使用以下方式:

// 指向整个二维数组
int (*ptr)[4] = arr;
int elem1 = ptr[1][2]; // 访问第二行第三列的元素,等同于arr[1][2]

// 指向二维数组的一行
int *rowPtr = arr[0];
int elem2 = rowPtr[3]; // 访问第一行第四个元素,等同于arr[0][3]

4. 使用指针遍历二维数组

你可以使用指针来遍历二维数组:

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int (*ptr)[4] = arr;

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf("%d ", ptr[i][j]);
    }
    printf("\n");
}

5. 动态分配二维数组

你还可以通过指针动态分配二维数组:

int rows = 3;
int cols = 4;
int (*arr)[4] = malloc(rows * sizeof(*arr)); // 分配整个数组

if (arr != NULL) {
    for (int i = 0; i < rows; i++) {
        arr[i] = malloc(cols * sizeof(int)); // 分配每一行
        if (arr[i] == NULL) {
            // 处理内存分配失败
        }
    }
}

// 使用arr...

// 释放内存
for (int i = 0; i < rows; i++) {
    free(arr[i]);
}
free(arr);

在动态分配的情况下,你需要分别分配每一行的内存,并确保最后释放每一行以及整个数组的内存。这样可以提供更大的灵活性,但也需要更多的内存管理。
问题二:p+n*i+j在二维数组中分别什么意思
回答:表达式 p + n*i + j 在二维数组的上下文中通常用于计算元素的偏移量或索引。这里,p 是基指针或起始索引,n 是数组的列数,i 是行索引,j 是列索引。这个表达式可以用来计算二维数组中特定元素的内存地址。

解释表达式 p + n*i + j

  • p:基指针或起始索引。
  • n:二维数组的列数。
  • i:行索引。
  • j:列索引。

表达式的作用:

这个表达式计算了从基指针 p 开始,到达二维数组中位置 (i, j) 的元素的偏移量。这在指针算术中非常有用,特别是当处理动态分配的二维数组或通过指针访问数组元素时。

示例:

假设我们有一个二维数组 arr,其大小为 34 列,我们想通过指针访问位置 (1, 2) 的元素。

#include <stdio.h>

int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int rows = 3, cols = 4;
    int i = 1, j = 2;
    int *ptr = &arr[0][0]; // 基指针指向数组的开始

    // 计算偏移量
    int offset = cols * i + j;
    int elem = *(ptr + offset); // 通过指针访问元素

    printf("Element at (%d, %d) is: %d\n", i, j, elem); // 应该输出7
    return 0;
}

在这个示例中,ptr 是指向数组 arr 第一个元素的指针。表达式 ptr + offset 计算了到达位置 (1, 2) 的元素的指针。通过解引用这个指针,我们得到了该位置的元素值。

总结:

表达式 p + n*i + j 是一种在二维数组中计算元素偏移量的方法,这在通过指针访问和操作数组元素时非常有用。它允许你直接跳到数组中的任何位置,而不需要逐个遍历行和列。

posted @ 2024-11-24 00:04  宋家璘  阅读(4)  评论(0编辑  收藏  举报