c语⾔函数调⽤矩阵,如何在C中的函数中传递⼆维数组(矩
阵)?
C实际上没有多维数组,但是有⼏种⽅法来模拟它们.将这些数组传递给函数的⽅式取决于⽤于模拟多维的⽅式:
1)使⽤数组。这只能在您的数组边界在编译时完全确定或编译器⽀持的情况下才能使⽤。
VLA‘s:#define ROWS 4#define COLS 5void func(int array[ROWS][COLS]){
int i, j;
for (i=0; i
{
for (j=0; j
{
array[i][j] = i*j;
}
}}void func_vla(int rows, int cols, int array[rows][cols]){
int i, j;
for (i=0; i
{
for (j=0; j
{
array[i][j] = i*j;
}
}}int main(){
int x[ROWS][COLS];
func(x);
func_vla(ROWS, COLS, x);}
2)使⽤指向(动态分配)数组的指针数组。这主要是在运⾏时才知道数组边界时使⽤的。void func(int** array, int rows, int cols){
int i, j;
for (i=0; i
{
for (j=0; j
{
array[i][j] = i*j;
}
}}int main(){
int rows, cols, i;
int **x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * sizeof *x);
for (i=0; i
{
x[i] = malloc(cols * sizeof *x[i]);
}
/* use the array */
func(x, rows, cols);
/
* deallocate the array */
for (i=0; i
{
free(x[i]);
}
free(x);}
(3)使⽤⼀维数组,并固定索引。这可以⽤于静态分配(固定⼤⼩)和动态分配的数组:void func(int* array, int rows, int cols){ int i, j;
for (i=0; i
{
for (j=0; j
{
array[i*cols+j]=i*j;
}
}}int main(){
int rows, cols;
int *x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * cols * sizeof *x);
/* use the array */
func(x, rows, cols);
/* deallocate the array */
free(x);}
4)使⽤动态分配的VLA。与选项2相⽐,它的⼀个优点是只有⼀个内存分配;另⼀个优点是不需要指针数组,因此需要更少的内存。
#include #include #include extern void func_vla(int rows, int cols, int array[rows]
[cols]);extern void get_rows_cols(int *rows, int *cols);extern void dump_array(const char *tag, int rows, int cols, int array[rows] [cols]);void func_vla(int rows, int cols, int array[rows][cols]){
for (int i = 0; i
{
for (int j = 0; j
{
array[i][j] = (i + 1) * (j + 1);
}
}}int main(void){
int rows, cols;
get_rows_cols(&rows, &cols);
int (*array)[cols] = malloc(rows * cols * sizeof(array[0][0]));
/* error check omitted */
func_vla(rows, cols, array);
dump_array("After initialization", rows, cols, array);
free(array);
return 0;}void dump_array(const char *tag, int rows, int cols, int array[rows][cols]){
printf("%s (%dx%d):\n", tag, rows, cols);
for (int i = 0; i
{
for (int j = 0; j
textarea中cols表示printf("%4d", array[i][j]);
putchar('\n');
}}void get_rows_cols(int *rows, int *cols){
srand(time(0)); // Only acceptable because it is called once
*rows = 5 + rand() % 10;
*cols = 3 + rand() % 12;}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论