无法理解令人困惑的C语法

时间:2012-09-15 15:08:25

标签: c porting

我在处理一些C代码时遇到了一些麻烦。有人可以解释这种语法:

void some_function(Int16 omegaFlag[2][8])
{
    for(i = 0; i < 2; i++)
    {
        Int16 *Flag = omegaFlag[i] + 1;
        for(j = 0; j < k; j++)
        {
            // do some stuff
            *Flag++ = some_integer_value;
        }
    }
}

1。为什么在Int16 omegaFlag[2][8]中传递的参数some_function()会声明索引值?他们如何帮助代码(一般来说,不是特定于此代码)? 2。 *Flag++ = some_integer_value;:这一行是什么意思?

3 个答案:

答案 0 :(得分:3)

omegaFlag[2][8]的第一个索引不是必需的,编译器会忽略它。然而,第二个是重要的,因为它告诉编译器这是一个二维数组,其中每行包含8个元素,因此推进指针将前进8个元素。

omegaFlag[2][8]相当于omegaFlag[][8](*omegaFlag)[8]。但是由于内存布局的原因,它与**omegaFlag不同。 **omegaFlag是一个指针数组,而omegaFlag[2][8]是一个数组数组 - 其中包含8个元素的空间,或16个元素的总空间。

*Flag++执行两项操作,它取消引用Flag,然后将其值递增1. Flag是指向Int16的指针,Int16表示矩阵的i行中的第二个值omegaFlag。赋值为该元素赋值,然后将Flag前进到指向下一个元素,该元素将在循环的下一次迭代中赋值。

答案 1 :(得分:1)

使用指针修改数组omegaFlag。当然,当你可以这样写它时,这是不必要的指针使用,这更容易阅读:

 for(i = 0; i < n; i++)
    {
        for(j = 1; j < k; j++)
        {
            // do some stuff
            OmegaFlag[i][j] = some_integer_value;
        }
    }

当然,在数组范围之外访问是未定义的行为,即n> 2或k> 7。

答案 2 :(得分:1)

  1. 参数声明建议函数将在给定的维度中接收Int16数组...更具体地说,是一个数组数组。

  2. *符号表示指针或内存中的位置。 * Flag表示“Flag内容指向的位置”,赋值表示“将该值放在该位置”。 ++表示Flag指向的位置应该在使用后增加1,例如,如果它指向内存位置12345,则它将指向位置12346.数组可以通过指针以这种方式引用,所以这种语法正在修改入站数组......尽管它很难阅读:)

  3. 希望有所帮助。