使用双指针指向二维数组
point to 2D array using double pointer
代码如下:
void nextGeneration(int **board) {
int editBoard[row][col];
...
displayBoard(editBoard);
}
void displayBoard(int **board) {
...
}
我收到此错误消息:
GOL.c: In function ‘nextGeneration’: GOL.c:64: warning: passing
argument 1 of ‘displayBoard’ from incompatible pointer type GOL.c:28:
note: expected ‘int **’ but argument is of type ‘int (*)[(long
unsigned int)(col)]’
我只是不知道如何指向 void displayBoard(int **board) 函数所接受的二维数组。
我该怎么做?
非常感谢
像这样
void nextGeneration(int **board) {
int editBoard[row][col];
...
displayBoard(editBoard);
}
void displayBoard(int board[][col]) {
...
}
双指针不是二维数组,但可以使用单指针
#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));
}
传递给函数的数组被隐式转换为指向其第一个元素的指针。
所以如果像这样的数组
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 );
代码如下:
void nextGeneration(int **board) {
int editBoard[row][col];
...
displayBoard(editBoard);
}
void displayBoard(int **board) {
...
}
我收到此错误消息:
GOL.c: In function ‘nextGeneration’: GOL.c:64: warning: passing argument 1 of ‘displayBoard’ from incompatible pointer type GOL.c:28: note: expected ‘int **’ but argument is of type ‘int (*)[(long unsigned int)(col)]’
我只是不知道如何指向 void displayBoard(int **board) 函数所接受的二维数组。
我该怎么做?
非常感谢
像这样
void nextGeneration(int **board) {
int editBoard[row][col];
...
displayBoard(editBoard);
}
void displayBoard(int board[][col]) {
...
}
双指针不是二维数组,但可以使用单指针
#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));
}
传递给函数的数组被隐式转换为指向其第一个元素的指针。
所以如果像这样的数组
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 );