在 C 中通过引用传递多维数组

问题描述 投票:0回答:3
#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]) {
c pointers
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);

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

应该是

void f(int app[][20])

通话应该是这样的

f(app);

函数

f()
中所做的更改在
main()
中可见 您可以在函数
f()
中访问数组,如
app[i][j]


0
投票

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

注意“魔法”数字的替换 带有#define'd值

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

代码干净地编译并正确运行

#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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.