0

我遇到了数组和指针的问题,虽然我很瘦,但我知道我做错了什么,但我无法找到一个简单的解决方案。

我有这段代码:

void faceRotateACW(char *face[CUBE_DIM][CUBE_DIM]){
    char tempFace[CUBE_DIM][CUBE_DIM];
    for (int y=0;y<CUBE_DIM;y++){
        for (int x=0;x<CUBE_DIM;x++){
            tempFace[y][CUBE_DIM-x]=face[x][y];
        }
    }
    for (int a=0;a<CUBE_DIM;a++){
        for (int b=0;b<CUBE_DIM;b++){
            face[a][b]=tempFace[a][b];
        }
    }
}

现在我知道问题在于我正在尝试将 char 指针分配给 char 并且这是不行的,但是我如何复制,然后修改数组并将其推回通过引用传递的数组?如何获取要传递给函数的数组中的值?

好的,一切顺利,至少我现在开始更好地理解这个问题(谢谢大家)。我需要提供更多信息,因为我使用此功能的方式可能也不是最好的方式,让我澄清一下。

我将数组定义为:

char *faces[NUM_FACES][CUBE_DIM][CUBE_DIM]={{{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}}}; 

但是,当我调用该函数时,我试图像这样剥离外部数组:

 faceRotateACW(faces[currentFace]);

对不起,我的第一篇文章:)

4

4 回答 4

2

让我们从顶部开始。

在您的main函数(或调用的任何人faceRotateACW)中,您有一个数组,例如

char theFace[CUBE_DIM][CUBE_DIM];

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N-element array of T”类型的表达式将被转换为/替换为/“衰减”为一个类型为“pointer to T”的表达式,其值是数组第一个元素的地址。

如果您将函数称为

rotateFaceACW(theFace);

函数调用中的表达式theFace将替换为“指向 CUBE_DIM 元素数组的指针”类型的表达式char,或者char (*)[CUBE_DIM]。因此,您的函数原型需要看起来像

void rotateFaceACW(char (*face)[CUBE_DIM]) {...}

或者

void rotateFaceACW(char face[][CUBE_DIM]) {...}

在这种情况下是一样的。您可以将其视为函数中的普通数组:

void rotateFaceACW(char (*face)[CUBE_DIM])
{
  char tempFace[CUBE_DIM][CUBE_DIM];
  ...
      tempFace[y][(CUBE_DIM-1)-x] = face[x][y];  // thanks Anthales
  ...
      face[x][y] = tempFace[x][y];

由于face是指向数组第一个元素的指针,因此在theFace中所做的任何更改都rotateFaceACW将反映在theFace.

由于看起来您总是要处理大小为常数 (CUBE_DIM) 的 NxN 矩阵,因此您可能不需要显式传递行数,但在一般情况下您需要传递。

如果您想处理任意数量的行和列的二维数组,则必须采用不同的方法,因为它似乎与您的问题无关,所以我不会在这里讨论。

于 2012-04-13T15:37:42.943 回答
1

据我了解,您尝试“以相反的列顺序”转置字符串矩阵。以下实现在 O(1) 空间和 O(CUBE_DIM^2) 时间内完成

void faceRotateACW(char* face[CUBE_DIM][CUBE_DIM])
{
    for (int i = 0;i< CUBE_DIM;++i) {
        for (int j = i; j<CUBE_DIM;++j) {
            char* tmpFace = face[i][j];
            face[i][j] = face[j][i];
            face[j][i] = tmpFace;
        }
        for (int j = 0;j < CUBE_DIM/2;++j) {
            char* tmpFace = face[i][j];
            face[i][j] = face[i][CUBE_DIM - 1 - j];
            face[i][CUBE_DIM - 1 - j] = tmpFace;
        }
    }

}
于 2012-04-13T15:29:14.727 回答
0

您应该使用指针数组。语法类似于 faceRotateACW(char *face[],int cube_dim) 然后您可以访问多维数组中的所有值,然后更改这些值。

于 2012-04-13T15:31:06.337 回答
0

正如您所定义的,您传递的是一个指向 s 的指针×矩阵,而不是一个指向s的CUBE_DIM×CUBE_DIM矩阵的指针。要解决此问题,您应该使用charCUBE_DIMCUBE_DIMchar

char (*face)[CUBE_DIM][CUBE_DIM]

表示这face是指针,而不是存储在数组中的值。完成此操作后,代码将不再编译,因为face[x][y](it is char[]) 是错误的分配类型和分配自的类型tempFace[_][_](即 a char)。

你可以这样说,因为face[x]取消引用了指针的外层face(偏移量为x),因此也有 type char[][]。现在[y]剥去一层[]所以类型face[x][y]char[]不是 char

为了解决这个问题,我们需要在开始索引之前获取指向的数组face,即我们需要取消引用face然后索引。那是:

(*face)[x][y]

所以最终的代码是:

void faceRotateACW(char (*face)[CUBE_DIM][CUBE_DIM]){
    char tempFace[CUBE_DIM][CUBE_DIM];
    for (int y=0;y<CUBE_DIM;y++){
        for (int x=0;x<CUBE_DIM;x++){
            tempFace[y][CUBE_DIM-1-x]=(*face)[x][y];
        }
    }
    for (int a=0;a<CUBE_DIM;a++){
        for (int b=0;b<CUBE_DIM;b++){
            (*face)[a][b]=tempFace[a][b];
        }
    }
}
于 2012-04-13T15:34:55.730 回答