有没有人能给我解释一下For Loop?

struct {
  int lock;   // not used in Lab
  struct proc proc[NPROC];
} ptable;

void scheduler(void){
struct proc *p;

  acquire(&ptable.lock);
  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
    if(p == curr_proc || p->state != RUNNABLE)
      continue;

    // Switch to chosen process.
    curr_proc = p;
    p->state = RUNNING;
    break;
  }
  release(&ptable.lock);

}

我主要询问的是for循环的情况

  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){

将指针p赋给pable.proc有什么作用?以及如何访问 struct 过程的成员/变量?

推荐答案

我主要询问的是for循环的情况

for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
p = ptable.proc

这里,数组ptable.proc衰变成指向数组中第一个元素的指针,并且将该指针分配给p.这和做p = &ptable.proc[0]次是一样的.

p < &ptable.proc[NPROC]

这里将p与数组边界外(边界外)一个元素的地址进行比较.ptable.proc[NPROC - 1]是边界内的最后一个元素.

p++

这会使指针指向struct proc数组中的下一个struct proc.

因此,作为一个整体,for循环从数组中第一个struct proc处的p点开始,迭代数组中的所有元素,直到数组外的p点,然后结束循环.

下面是一个具有相同结果的替代循环,用于可视化正在发生的事情:

// for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
for(int idx = 0; idx < NPROC; idx++) {
    p = &ptable.proc[idx];   // or:   p = ptable.proc + idx;

    // the rest of the loop body goes here ...
}

以及如何访问 struct 过程的成员/变量?

您使用->操作符取消对指针p的引用,以访问元素p所指向的成员.p->state访问p当前所指向的struct proc中的state个成员.

C++相关问答推荐

无效使用未定义类型'structsquare'?

在C中使用动态内存分配找到最小的负数

为什么双重打印与C中的float具有不同的大小时具有相同的值?

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

为什么GCC C23中的关键字FALSE不是整数常量表达式?

C在声明带有值的数组时,声明大小有用吗?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

这个计算C中阶乘的函数正确吗?

在txt文件中找到指定的字符串,并从数字中减go 相同的值

获取前2个连续1比特的索引的有效方法

如何在C中用bool进行文件I/O?

如何使用空元素块声明指针数组

基于蝶数恰好有8个除数的事实的代码

将char*数组深度复制到 struct 中?

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

如何使crc32的结果与cksum匹配?

将char*铸造为空**

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

Makefile - 将 .o 文件放入子文件夹中

Clang 是否为内联汇编生成了错误的代码?