是否允许变量数组参数作为函数外的索引变量?
Are variable array parameters allowed to have as index variables outside the function?
我的书说:"The expression used to specify the length of" 一个变量数组 "could refer to variables outside the function"。
我想这就是这本书的意思:
int main(void)
{
int xternal = 3;
int variable_array[xternal];
function(variable_array);
}
void function(int variable_array[xternal])
{
...
}
我明白函数外的变量对它是不可见的。我错了吗?
您可以在函数外引用变量,但不能在其他函数内引用变量
int xternal = 3;
int main(void)
{
int variable_array[xternal];
function(variable_array);
}
void function(int variable_array[xternal])
{
...
}
我假设你指的是 C99 的可变长度数组参数。
我认为您的教科书试图说明您不仅可以将函数的其他参数用作长度说明符,例如:
void f(int array_len, char array[array_len]);
但是在外面但仍然可见的东西,比如全局变量:
int some_value;
void f(char array[some_vaue]);
请记住 - 这并不一定意味着编译器会为您进行数组边界检查。当您使用多维数组在内部维度上导航时,这很有用。
所以不用这个代码:
int *arr = malloc(sizeof(int)*NROWS*NCOLS);
void f(int *a)
{
int row, int column;
...calculate row, column
int value = a[row*NCOLS+column];
...
}
你会写:
int arr[NROWS][NCOLS];
int get_array_cols()
{
return NCOLS;
}
int array_rows=NROWS;//or calculate...
void f(int a[array_rows][get_array_cols()])
{
int row, int column;
...calculate row, column
int value=a[row][column];
...
}
如你所见,那里可能有任何东西。
基本上,当编译器知道如何获取维度的值时,它可以自动准备这个表达式:a[row*NCOLS+column];
(row*NCOLS)。例如在我的最后一个案例中,有维度提示,它会自动将 a[row][col]
编译成:a[row*get_array_cols()+col]
.
我的书说:"The expression used to specify the length of" 一个变量数组 "could refer to variables outside the function"。 我想这就是这本书的意思:
int main(void)
{
int xternal = 3;
int variable_array[xternal];
function(variable_array);
}
void function(int variable_array[xternal])
{
...
}
我明白函数外的变量对它是不可见的。我错了吗?
您可以在函数外引用变量,但不能在其他函数内引用变量
int xternal = 3;
int main(void)
{
int variable_array[xternal];
function(variable_array);
}
void function(int variable_array[xternal])
{
...
}
我假设你指的是 C99 的可变长度数组参数。
我认为您的教科书试图说明您不仅可以将函数的其他参数用作长度说明符,例如:
void f(int array_len, char array[array_len]);
但是在外面但仍然可见的东西,比如全局变量:
int some_value;
void f(char array[some_vaue]);
请记住 - 这并不一定意味着编译器会为您进行数组边界检查。当您使用多维数组在内部维度上导航时,这很有用。
所以不用这个代码:
int *arr = malloc(sizeof(int)*NROWS*NCOLS);
void f(int *a)
{
int row, int column;
...calculate row, column
int value = a[row*NCOLS+column];
...
}
你会写:
int arr[NROWS][NCOLS];
int get_array_cols()
{
return NCOLS;
}
int array_rows=NROWS;//or calculate...
void f(int a[array_rows][get_array_cols()])
{
int row, int column;
...calculate row, column
int value=a[row][column];
...
}
如你所见,那里可能有任何东西。
基本上,当编译器知道如何获取维度的值时,它可以自动准备这个表达式:a[row*NCOLS+column];
(row*NCOLS)。例如在我的最后一个案例中,有维度提示,它会自动将 a[row][col]
编译成:a[row*get_array_cols()+col]
.