-1

我在处理一些 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; .:这条线是什么意思?

4

3 回答 3

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 表示i矩阵 omegaFlag 的第 th 行中的第二个值。赋值给那个元素赋值,然后推进 Flag 指向下一个元素,该元素将在循环的下一次迭代中赋值。

于 2012-09-15T15:14:23.023 回答
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。

于 2012-09-15T15:14:34.503 回答
1
  1. 参数声明建议该函数将接收给定维度的 Int16 数组......更具体地说,是一个数组数组。

  2. * 符号表示指针或内存中的位置。*Flag的意思是“Flag的内容所指向的位置”,赋值的意思是“把这个值放到那个位置”。++ 表示 Flag 指向的位置在使用后应该加一,例如如果它指向内存位置 12345,那么它将指向位置 12346。数组可以通过这种方式通过指针引用,所以入站数组正在被这种语法修改......虽然它可能难以阅读:)

希望有帮助。

于 2012-09-15T15:16:24.550 回答