C指针算术片段

Chr*_*utz 4 c pointers while-loop nested-loops

我有一个程序,我正在尝试解码.它被另一种语言翻译成C(这里没有说出其名称),并且我想了解它是如何工作的,我正在慢慢地重写代码并简化它以使用C提供的所有好的逻辑结构.

以下一点点不断出现在我的代码中,其中包含不同的值XY:

ptr[X]--;
while(ptr[X])
  {
    ptr[X]--;
    ptr += Y;
  }
Run Code Online (Sandbox Code Playgroud)

ptr是类型的char *,我无法在任何时候对数组的状态做出假设,因为它非常深入地嵌入循环并依赖于输入和输出.我可以成功地"简化"到:

for(ptr[X]--; ptr[X]; ptr[X]--, ptr += Y);
Run Code Online (Sandbox Code Playgroud)

但那太糟糕了.曾经如此稍微好一点:

for(ptr[X]--; ptr[X]; ptr += Y) ptr[X]--;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人能够更好地简化上述代码,我将不胜感激.这种情况发生在不少于五个地方,并且削弱了我简化和理解流量控制的能力,所以如果任何人都可以提供更简洁/可读的版本,那将是非常棒的.如果任何人都可以提供对该代码的任何奇特的洞察力,那将是非常棒的,虽然我基本上了解它的作用.

洞察特定的代码X和/或Y也可以提供帮助.Y往往介于-2和2之间,X通常为1,因为它的价值.

Ada*_*eld 8

ptr[X]相当于*(ptr + X),所以我们可以重写如下:

for((*(ptr + X))--; *(ptr + X); (*(ptr + X))--, ptr += Y);
Run Code Online (Sandbox Code Playgroud)

现在这里有很多冗余,所以我们可以将其简化为:

char *ptr_plus_x = ptr + X;
for((*ptr_plus_x)--; *ptr_plus_x; (*ptr_plus_x)--, ptr_plus_x += Y);
Run Code Online (Sandbox Code Playgroud)

然后我们可以ptr_plus_x完全摆脱:

ptr += X;
for((*ptr)--; *ptr; (*ptr)--, ptr += Y);
Run Code Online (Sandbox Code Playgroud)

在英语中,我们访问偏移X,X + Y,X + 2Y,X + 3Y,...的内存位置,递减每个内存位置,直到我们找到一个0的内存位置.但是,0的测试总是在减量之后发生,所以我们真的在寻找该序列中的第一个存储位置,其值为1.一旦我们找到它,我们将其减少为0并退出.

如果Y为1,那么我们递减一串连续的存储器位置向前,直到并包括第一个1.如果Y是-1,则发生相同的事情,但是从偏移X向后搜索.如果Y是0,则无限循环发生.如果Y是任何其他值,则搜索模式会跳过各种条目.

这不是一个非常直观的功能,所以我可以看出你为什么感到困惑.