在C语言中如何通过引用传递多维数组

4
#include <stdio.h>

void f(int *app[][20]) {
    int i, j;
    for (i =0; i< 20; i++){
        for (j=0; j<20; j++){
            *app[i][j] = i;
        }
    }
}

int main() {
  int app[20][20];
  int i, j;
  f(&app);
    for (i =0; i< 20; i++){
        for (j=0; j<20; j++){
            printf("i %d, j%d  val= %d\n", i, j, app[i][j]);
        }
    }

  return 0;
}

我到底在这里做错了什么?我没有收到任何错误信息,但是出现了分段错误,我不知道原因。

te.c:15:5: warning: passing argument 1 of ‘f’ from incompatible pointer type
   f(&app);
     ^
te.c:3:6: note: expected ‘int * (*)[20]’ but argument is of type ‘int (*)[20][20]’
 void f(int *app[][20]) {

你为什么要运行不能干净编译的代码? - user3629249
我忽略了它,因为那只是一个警告,然后尝试运行程序。由于这是一个指针错误,所以必然会导致段错误。这就是我提出这个问题的原因。谢谢! - tandem
3个回答

6
void f(int *app[][20]) { /* a 2d array of pointers to int */

应该是

void f(int app[][20]) { /* a pointer to an array of 20 int's */

或者

void f(int (*app)[20]) { /* a pointer to an array of 20 int's */

*app[i][j] = i;

应该是

app[i][j] = i; /* you don't need to dereference */

f(&app);

应该是

f(app);

好奇问题:当将一个值作为指针传递给函数时,我们使用 f(&i) 并将其用作 void f(int *i)。这里为什么不这样做呢? - tandem
当你使用 int i; f(i); 将一个 int 传递给函数时,你传递的是值;当你使用 int i; f(&i); 时,你传递的是变量的引用。 - David Ranieri
为什么我们不能在这里通过引用传递? - tandem
1
因为当数组传递给函数时,它会衰变成一个指针,换句话说:int a[][20]; 衰变成 int (*a)[20];(一个指向包含20个整数的数组的指针)。 - David Ranieri

2
void f(int *app[][20])

应该是

void f(int app[][20])

调用应该像这样

f(app);

在函数f()中所做的更改会在main()中可见。 您可以像这样在函数f()中访问数组app[i][j]


@user694733 谢谢 :) - Gopi

0

以下代码正确实现了将指向'app[][]'数组的指针定义和传递给函数'f'

请注意用#define定义值替换'magic'数字

请注意原型的正确使用。
随着项目变得更大并由多个文件组成,这将变得非常重要。虽然当项目变成多个文件时,每个源文件都应该有自己的头文件,其中包含该源文件的原型

代码编译干净,运行正确

#include <stdio.h>

#define ROWS (20)
#define COLS (20)

void f(int app[][COLS]) ;


int main( void ) 
{
    int app[ROWS][COLS];
    int i, j;

    f(app);

    for (i =0; i< ROWS; i++)
    {
        for (j=0; j<COLS; j++)
        {
            printf("i %d, j%d  val= %d\n", i, j, app[i][j]);
        }
    }

  return 0;
}

void f(int app[][COLS]) 
{
    int i, j;
    for (i =0; i< ROWS; i++)
    {
        for (j=0; j<COLS; j++)
        {
            app[i][j] = i;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接