将数据成员数组传递给递归过程时,是否在每个堆栈帧中创建了该数组的新副本?

When passing an data member array into a recursive procedure, is a new copy of that array created in each stack frame?

我遇到的问题是在递归调用的每个堆栈帧中都没有创建二维数组的副本。我正在做间接递归。

我也试过从 main() 函数调用函数发送我的数据,但没有复制。每次递归调用都使用相同的地址。

class board
{


public:

    int board_arr[8][8];

public:
    board()
    {

    }

    void player1Turn()
    {

        for (int i = 0; i < rowCount; i++)
        {
            for(int j = 0; j < rowCount; j ++ )
            {
                if (board_arr[i][j] == 1)
                {
                    //checking if the pawn can move anywhere
                    if (i + 1 <=7 && j - 1 >= 0 && board_arr[i + 1][j - 1] == 0 )
                    {
                        board_arr[i][j] = 0;
                        board_arr[i + 1][j - 1] = 1;

                        player2Turn();

                    }
                    if (i + 1 <=7 && j + 1 <= 7 && board_arr[i + 1][j + 1] == 0)
                    {
                        board_arr[i][j] = 0;
                        board_arr[i + 1][j + 1] = 1;


                        player2Turn();

                    }
                    //opponent infront 
                    //killing
                    //if opponent is infront and checking if you can kill it or not
                    if (i + 2 <= 7
                        && i + 1 <= 7 
                        && j - 2 >=0 

                        && j - 1 >= 0 
                        && board_arr[i + 1][j - 1] == 2
                        && (board_arr[i + 2][j - 2]==0)) 
                    {
                            board_arr[i][j] = 0;
                            board_arr[i + 2][j - 2] = 1;
                            board_arr[i + 1][j - 1] = 0;

                            cout << endl << "kill by p1 " << endl;


                            player2Turn();

                    }
                    if (i + 2 <= 7 
                        && i + 1 <= 7 
                        && j + 2 <= 7

                        && j + 1 <=7 
                        && board_arr[i + 1][j + 1] == 2 
                        && (board_arr[i + 2][j + 2]==0))
                    {
                        board_arr[i][j] = 0;
                        board_arr[i + 1][j + 1] = 0;
                        board_arr[i + 2][j + 2] = 1;


                        cout << endl << "kill by p1 " << endl;

                        player2Turn();

                    }
                }

            }

        }

    }
    void player2Turn()
    {

        for (int i = rowCount-1; i >= 0; i--)
        {
            for (int j = rowCount-1; j >= 0; j--)
            {
                if (board_arr[i][j] == 2)
                {
                    //checking if the pawn can move anywhere
                    if (i - 1 >= 0 && j - 1 >= 0 && board_arr[i - 1][j - 1] == 0)
                    {
                        board_arr[i][j] = 0;
                        board_arr[i - 1][j - 1] = 2;


                        player1Turn();

                    }
                    if (i - 1 >= 0 && j + 1 <=7 && board_arr[i - 1][j + 1] == 0)
                    {
                        board_arr[i][j] = 0;
                        board_arr[i - 1][j + 1] = 2;


                        player1Turn();

                    }
                    //opponent infront 
                    //killing
                    //if opponent is infront and checking if you can kill it or not
                     if (i - 2 >= 0
                        && i - 1 >= 0
                        && j - 2 >= 0

                        && j - 1 >= 0
                        && board_arr[i - 1][j - 1] == 1
                        && (board_arr[i - 2][j - 2] ==0))
                    {
                        board_arr[i][j] = 0;
                        board_arr[i - 2][j - 2] = 2;
                        board_arr[i - 1][j - 1] = 0;

                        cout << endl << "kill by p2 " << endl;

                        player1Turn();



                    }
                    if (i + 2 <= 7
                        && i - 1 >= 0
                        && j + 2 <=7

                        && j + 1 <= 7
                        && board_arr[i - 1][j + 1] == 1
                        && (board_arr[i - 2][j + 2] ==0))
                    {
                        board_arr[i][j] = 0;
                        board_arr[i - 2][j + 2] = 1;
                        board_arr[i - 1][j + 1] = 0;

                        cout << endl << "kill by p1 " << endl;

                        player1Turn();

                    }
                }

            }

        }
    }

};

每次调用都使用了 board_arr 的相同副本。

您不会将数组从一个函数传递到另一个函数,但即使您这样做了,数组也是(简化的)指针,因此即使手动将它们从一个函数传递到另一个函数也不会创建副本。

使用std::vector<>std::array<>

您没有将 board_arr 传递给递归方法,即那些方法的参数中没有该数组。所以 board_arr 没有被复制。

因为这些方法是 board class 的实例方法,每个方法调用中传递的所有内容都是 this 指向 board.[=15 实例的指针=]