C &引用;错误:下标值既不是数组,也不是指针,也不是向量;,但是为什么呢?

C &引用;错误:下标值既不是数组,也不是指针,也不是向量;,但是为什么呢?,c,arrays,function,pointers,C,Arrays,Function,Pointers,我正在编写一个Tic-Tac-Toe程序,并为玩家的回合编写一个函数。我正在以指针b的形式传递Tic-Tac趾板(一个3x3数组)。唯一的问题是,在最后一行我得到了标题中的错误 下标值既不是数组,也不是指针或向量:b[PlayerCoordsX][PlayerCoordsY]=“x” 为了测试,我尝试了多个不同的=值。字符和数值都不能解决此问题 以下是缩写代码(我希望是)相关位: void PlayerTurn(int *b); ... int main(void) { int Bo

我正在编写一个Tic-Tac-Toe程序,并为玩家的回合编写一个函数。我正在以指针
b
的形式传递Tic-Tac趾板(一个3x3数组)。唯一的问题是,在最后一行我得到了标题中的错误

下标值既不是数组,也不是指针或向量:
b[PlayerCoordsX][PlayerCoordsY]=“x”

为了测试,我尝试了多个不同的
=
值。字符和数值都不能解决此问题

以下是缩写代码(我希望是)相关位:

void PlayerTurn(int *b);

...

int main(void)
{
    int Board[2][2];
    int (*b)[2][2];
    b = &Board;

    ...

    void PlayerTurn(int *b);

    ...

return 0;
}

void PlayerTurn(int *b)
{
    int PlayerCoordsX, PlayerCoordsY;

    while ((PlayerCoordsX != 1 || PlayerCoordsX != 2 || PlayerCoordsX != 3) && (PlayerCoordsY != 1 || PlayerCoordsY != 2 || PlayerCoordsY != 3))
    {
        printf("Enter the X coordinate you would like to use:");
        scanf("%i", &PlayerCoordsX);
        PlayerCoordsX = PlayerCoordsX - 1;

        printf("Enter the Y coordinate you would like to use:");
        scanf("%i", &PlayerCoordsY);
        PlayerCoordsX = PlayerCoordsY - 1;
    }

    b[PlayerCoordsX][PlayerCoordsY] = "x";
}

您的参数
b
是指向整数的指针。这意味着
b[PlayerCoordsX]
是一个整数,因此
b[PlayerCoordsX][PlayerCoordsY]
基本上是尝试使用
int
(“下标值”)作为数组

将2D数组传递给函数时,编译器需要知道数组中的列数。这是因为数组是空的,编译器需要计算该线性数组中的索引

所以你需要通过考试

void PlayerTurn(int b[][2])
{
}

但最好定义大小,而不是使用“神奇”值
2

,因为
b
是指向int的指针

b[PlayerCoordsX]
是整数,不能下标
b[PlayerCoordsX]
。您需要一个指向int的指针:

int **b;
然后你可以做双重间接。或者,如果使用平面数组,请计算索引而不是使用双索引:

b[PlayerCoordsY * numCols + PlayerCoordsX] = "x";
如果您像您这样定义板:

int board[3][3];
然后,您可以将函数签名更改为:

void PlayerTurn(int b[][3])

像这样声明void player turn(int**b)b应该是双指针为什么要将3x3数组声明为
板[2][2]
?这仅仅是2x2。你不能像现在这样调用main函数doing@Chinna谢谢,这解决了问题。Barmar我相信它是3x3,因为它从0开始计数。。。但我也是个笨蛋。我只是想把它编译好,这样我就可以测试所有东西了。Alexis我真的不知道你的意思,但我想我会知道什么时候我能最终编译它。按照你的建议,当传递
int**b
时,编译器如何计算2D数组中的索引?你需要分别分配每一行来做到这一点,对于您的情况,您可以使用此答案中的方法:@perreal这意味着您的答案不正确,因为@JoeP有一个
int板[2][2]
@perreal您确实非常清楚地解释了错误:-)但您还说“使用
**b
可以进行双重间接寻址”;但事实并非如此,因为用
**b
替换
*b
不足以实现双间接寻址。但是嘿,祝你今天愉快!