簡體   English   中英

C 指向二維數組的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM