C中的结构和数组递增

structs and array incrementation in C

目前我正在尝试将一些代码从 C 翻译成 C#,但我 运行 遇到了一些问题。 因为我是一名 C# 程序员并且不知道 C 我必须在这里问一些问题(没有找到可以回答我的问题)。我在 C 中有以下代码:

struct item { short sectorno,sx1,sx2; } queue[MaxQueue], *head=queue, *tail=queue;
short ytop[W]={0}, ybottom[W], renderedsectors[NumSectors];

*head = (struct item) { player.sector, 0, W-1 };

if(++head == queue+MaxQueue) head = queue;

const struct item now = *tail;
    
if(++tail == queue+MaxQueue) tail = queue;
    if(renderedsectors[now.sectorno] & 0x21) continue;
    ++renderedsectors[now.sectorno];

我用 C# 写的:

        Item[] queue = new Item[MaxQueue];
        Item[] head = queue;
        Item[] tail = queue;

        int[] ytop = new int[W]; //{ 0 };
        int[] ybottom = new int[W];
        int[] renderedsectors = new int[NumSectors];

        for (int x = 0; x < W; ++x)
        {
            ybottom[x] = H - 1;
        }
        for (int n = 0; n < NumSectors; ++n)
        {
            renderedsectors[n] = 0;
        }

        head[0] = new Item { sectorno = player.sector, sx1 = 0, sx2 = W - 1 };
        if (head[1] == queue[queue.Length - 1])
        {
            head = queue;
        }

我希望到目前为止这是正确的。现在我的问题:

什么

         short ytop[W]={0} 

做什么? 这是一组短裤,对吧?这里数组的第一个位置是0赋值了吗?这就是我从调试器中得出的结论。

我无法理解以下行:

         if(++head == queue+MaxQueue) head = queue;

数组上的 ++ 是否递增数组的索引? queue+32 是否表示数组的最后一个位置? (奇怪,因为那将是位置 32,这将超出范围...)

最后一件事..那是什么意思?

         ++renderedsectors[now.sectorno];

我会说递增数组的索引,但是它存储在哪里以及如何存储?

非常感谢!我很高兴能帮助理解这段 C 代码。

short ytop[W]={0}ytop 声明为 W 类型 short 元素的数组,并将其中第一个明确初始化为零。其余元素默认初始化,这也将元素初始化为零。 (这是 C 中的一个习语,因为在函数中定义一个带有 short ytop[W]; 的数组根本不会初始化它;元素值将是不确定的。显式初始化其中一个会触发其余部分的默认初始化。)

if(++head == queue+MaxQueue) head = queue; 中,++head 做了两件事:

  • 增加head的存储值。
  • 为了计算表达式的其余部分,++head 的值是包含增量的 head 的值。

关于此的两个注意事项:

  • if(++head == queue+MaxQueue) head = queue; 与先递增 head = head + 1; 然后 if(head == queue+MaxQueue) head = queue; 大致相同。但是,C 语义中的技术细节有所不同; head 值的实际内存更新不一定与表达式的计算同步。
  • 当一个指针被添加时,结果是指向内存中下一个数组元素的指针,而不是内存中的下一个字节。指针的类型用于知道它指向什么样的元素以及该元素有多大。

queue+MaxQueue 生成一个指针,指向 MaxQueue 个超出 queue 指向的元素。如果 queue 是数组或指向数组开头的指针,并且 MaxQueue 是数组中元素的数量,则 this 指向数组最后一个元素之后的位置。没关系;这样我们就可以指向数组的“末尾”,作为结束位置的标记。

++renderedsectors[now.sectorno];中,renderedsectors[now.sectorno]renderedsectors中索引为now.sectorno的元素。 ++ 递增其存储值。