我在处理一些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;
:这一行是什么意思?
答案 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)
参数声明建议函数将在给定的维度中接收Int16数组...更具体地说,是一个数组数组。
*符号表示指针或内存中的位置。 * Flag表示“Flag内容指向的位置”,赋值表示“将该值放在该位置”。 ++表示Flag指向的位置应该在使用后增加1,例如,如果它指向内存位置12345,则它将指向位置12346.数组可以通过指针以这种方式引用,所以这种语法正在修改入站数组......尽管它很难阅读:)
希望有所帮助。