更改指向结构的指针,通过引用传递

时间:2011-08-17 09:54:32

标签: c struct

我对名为'PlayBoard.c'的文件进行了调用:

MoveSucc = putBoardSquare(theBoard, getX, getY, nextTurn);

'theBoard'是指向struct Board的指针。在函数内部,我通过引用指向另一个更大的板结构的指针来改变电路板的尺寸。它会改变调用MoveSucc的'PlayBoard.c'上的'theBoard'吗?

编辑:putBoardSquare在另一个源文件中定义

编辑:我添加了相关功能

Boolean putBoardSquare(BoardP theBoard, int X, int Y, char val)
{
    if (val != 'X' && val != 'O')
    {
        reportError(BAD_VAL);
        return FALSE;
    }

    if (X<0 || Y<0)
    {
        reportError(OUT_OF_BOUND);
        return FALSE;
    }

    if (X>theBoard->height || Y>theBoard->width)
    {
        theBoard = expandBoard(theBoard, X,Y);
    }

    printf("BOARD SIZE IS %d*%d\n",theBoard->height,theBoard->width);

    if (theBoard->board[X][Y] == 'X' || theBoard->board[X][Y] == 'Y' )
    {
        reportError(SQUARE_FULL);
        return FALSE;
    }

    if (val != turn)
    {
        reportError(WRONG_TURN);
        return FALSE;
    }

    theBoard->board[X][Y] = val;
    printf("PUT %c\n",theBoard->board[X][Y]);
    changeTurn(val);

    return TRUE;
}

static BoardP expandBoard(ConstBoardP theBoard, int X, int Y)
{
    int newWidth = theBoard->width;
    int newHeight = theBoard->height;
    if (X>theBoard->height)
    {
        newHeight = (newHeight+1) * 2;
    }

    if (Y>theBoard->width)
    {
        newWidth = (newWidth+1) * 2;
    }

    BoardP newBoard = createNewBoard(newWidth,newHeight);
    copyBoard(theBoard,newBoard);
    printf("RETUNRNING NEW BOARD OF SIZE %d*%d\n",newHeight,newWidth);
    return newBoard;
}

正如您所看到的,当用户尝试在板外放置“X”或“O”时,需要对其进行扩展(我知道因为我在expandBoard()和putBoardSquare中打印了新板的大小())。但是'PlayBoard.c'中的指针似乎并没有改变......

我的问题:如何将作为参数传递的结构的指针更改为另一个函数?在'PlayBoard.c'中,我传递一个结构作为参数,我希望putBoardSquare将它引用到另一个结构,该结构也将在PlayBoard.c中生效。

我清楚了吗?

2 个答案:

答案 0 :(得分:2)

修改

theBoard = expandBoard(theBoard, X,Y);

此分配仅更改局部变量。您必须添加一个间接级别,如:

MoveSucc = putBoardSquare(&theBoard, getX, getY, nextTurn);

Boolean putBoardSquare(BoardP *theBoard, int X, int Y, char val)
{
    /* ... */
    *theBoard = expandBoard(theBoard, X,Y);
    /* ... */
}

您的问题令人困惑(也许您应该发布您拥有的代码),但您所遇到的错误仅仅是因为PlayBoard.c中没有结构的定义。例如,如果你只有

struct foo;
void foo(struct foo *foov) { ... }

没有可用的foo定义,如

struct foo { int a; ... }

然后您将无法访问结构的成员(请参阅“opaque类型”)。

答案 1 :(得分:0)

如果我理解正确并且您想要更改theBoard指向的位置,则需要将其定义为指针指针,而不是指针。

MoveSucc = putBoardSquare(&theBoard, getX, getY, nextTurn);

并将putBoardSquare()中的参数更改为**,并在设置指针时执行(假设x是指针):

*theBoard = x;