[英]C pointer to 2d array
所以我正在創建一個循環,它可以通過將 [3][3] 數組的元素設置為枚舉 EMPTY 來創建一個 3x3 板。 在調試時,我可以看到程序在得到 memory 訪問沖突錯誤之前正確設置了數組的前三個元素,所以我知道這是數組第二行的地址有問題(當 'i' 變量從 0 變為 1)。 我該如何解決這個問題? 指針對我來說仍然有點混亂。
int main(void)
{
int board[3][3] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int* p = &board;
create_board(p);
print_board(p);
return 0;
}
void create_board(int *board)
{
for (int i = 0; i < 3; ++i)
{
for (int k = 0; k < 3; ++k)
{
(&board)[i][k] = EMPTY;
}
}
return;
}
您的代碼有很多問題。 C 中的 Arrays 不包含有關其尺寸的任何信息。
最簡單的方法是使用指向數組的指針:
void create_board(size_t rows, size_t cols, int (*board)[rows])
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t k = 0; k < cols; ++k)
{
board[i][k] = EMPTY;
}
}
}
和主要
int main(void)
{
int board[3][3];
create_board(3,3, board);
print_board(3,3,board);
return 0;
}
類似的方式你可以寫print_board
function:
void print_board(size_t rows, size_t cols, int (*board)[rows])
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t k = 0; k < cols; ++k)
{
printf("[%zu][%zu] = %d\t", i, k, board[i][k]);
}
printf("\n");
}
}
您的代碼無效。 編譯器應該發出一條消息,說明此聲明中使用了不兼容的指針類型
int* p = &board;
初始化表達式的類型為int ( * )[3][3]
而初始化的 object 的類型為int *
。
function 可以聲明為
void create_board( int ( *board )[3], size_t n )
{
for (size_t i = 0; i < n; ++i)
{
for (size_t k = 0; k < 3; ++k)
{
board[i][k] = EMPTY;
}
}
}
並稱為
int ( *p )[3] = board;
create_board( p, 3 );
或者,如果您的編譯器支持可變長度 arrays 那么就像
void create_board( size_t m, size_t n, int ( *board )[n] )
{
for (size_t i = 0; i < m; ++i)
{
for (size_t k = 0; k < n; ++k)
{
board[i][k] = EMPTY;
}
}
}
並稱為
int ( *p )[3] = board;
create_board( 3, 3, p );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.