如何将多维数组作为指针传递?

时间:2016-11-18 15:21:58

标签: c arrays pointers

我有这两个函数,我需要传递table数组并修改其内容。

void play_game(int mines, int c, int r) {
    char (*table)[c][r];
    build_field(*table, c, r);
}

void build_field(char *table ,int tamanhox, int tamanhoy) {
    int i, x; 
    for(i=1;i<tamanhoy+1;i++){        
        table[tamanhoy][tamanhox] = '-';          
        for(x=0;x<tamanhox-1;x++){
            table[tamanhoy][tamanhox] = '-';
    }
}

在此代码中,table[tamanhoy][tamanhox]处出现错误。

2 个答案:

答案 0 :(得分:1)

您收到错误是因为您声明参数table是指向char的指针,而不是指向数组数组的指针。你不会让table实际指向任何地方。

这两个问题都可以通过使table成为指向数组数组的指针来解决,并通过更改顺序将参数传递给build_field函数:

char table[c][r];
build_field(c, r, table);

...

void build_field(int tamanhox, int tamanhoy, char table[][tamanhoy])
{
    // Use table like a normal array of array (i.e. table[x][y] = z)
}

您展示的代码还存在其他一些问题,例如您在table[tamanhoy][tamanhox]函数中始终使用build_field时可能意味着table[x][i]

你也在循环超出函数的范围,请记住索引是从零开始的,因此第一个“维度”的有效索引是0tamanhox - 1(包括)。

答案 1 :(得分:1)

此声明

char (*table)[c][r];

不声明数组。它声明了一个指向char[c][r]类型对象的指针。顺便说一下为什么不是?:)

char[r][c]
     ^^^^^

因此在使用此指针之前,应正确初始化。

在此功能声明中

void build_field(char *table ,int tamanhox, int tamanhoy);

第一个参数的类型为char *。类型char ( * )[c][r]和类型char *是不同的不兼容类型。

您可以编写函数声明,例如以下类型

void build_field( int tamanhox, int tamanhoy, char ( *table )[tamanhox][tamanhoy] );

但是在函数内部你必须取消引用指针。例如

( *tablw)[I][j]

确切的参数声明取决于指针的初始化方式以及您要执行的操作。也许你的意思是以下声明

char (*table)[r];

void build_field( int tamanhox, int tamanhoy, char ( *table )[tamanhoy] );

编译器发出错误,因为函数参数table的类型为char *。所以table[I]char类型的标量对象。您可能不会将table[I][x]等下标运算符应用于它。此外,这个表达

table[tamanhoy][tamanhox]
      ^^^^^^^^  ^^^^^^^^^

在任何情况下都没有意义,因为至少你应该写

table[i][x]
     ^^^^^^