使用双指针指向2D数组

时间:2017-02-03 16:16:52

标签: c pointers

以下是代码:

void nextGeneration(int **board) {

int editBoard[row][col];
    ...
    displayBoard(editBoard);
}

void displayBoard(int **board) {
    ...
}

我收到此错误消息:

  

GOL.c:在函数'nextGeneration'中:GOL.c:64:警告:传递   来自不兼容指针类型GOL.c的'displayBoard'的参数1:28:   注意:预期'int **'但参数的类型为'int(*)[(long   unsigned int)(col)]'

我只是不知道如何指定将被接受的2D数组以使displayBoard(int ** board)函数无效。

我该怎么做?

非常感谢

3 个答案:

答案 0 :(得分:2)

传递给函数的数组被隐式转换为指向其第一个元素的指针。

所以如果像

这样的数组
int editBoard[row][col];

作为参数传递给函数,并将其转换为int ( * )[col]类型。类型int( * )[col]int **是两种不兼容的不同类型。

如果编译器支持可变长度数组,那么您可以将函数声明为

void nextGeneration( size_t row, size_t col, int board[row][col] );

void nextGeneration( size_t row, size_t col, int board[][col] );

void nextGeneration( size_t row, size_t col, int ( *board )[col] );

这三个声明声明了同一个函数。

如果编译器不支持VLA但值col被定义为常量(使用#define或枚举器),那么您可以再次使用这些声明。

另一种方法是将用作参数的数组解释为一维数组。在这种情况下,您可以声明像

这样的函数
void nextGeneration( int *board, size_t row, size_t col );

并传递数组

nextGeneration( ( int * )editBoard, row, col );

答案 1 :(得分:1)

双指针不是2D数组,但您可以使用单个指针

来完成
#include <stdio.h>

#define COL_WIDTH 2

int displayBoard(int *board, int row, int col)
{
    // editBoard[row][col]
    return board[(COL_WIDTH*row)+col];
}

int main(void)
{
    int board[2][COL_WIDTH] = { {1,2}, {3,4} };

    printf("%d\n", displayBoard((int *)(board), 1, 1));
    printf("%d\n", displayBoard((int *)(board), 0, 1));
}

答案 2 :(得分:-1)

喜欢这个

void nextGeneration(int **board) {

int editBoard[row][col];
    ...
    displayBoard(editBoard);
}

void displayBoard(int board[][col]) {
      ...
}