-2

我需要在不使用的情况下旋转矩阵并调用[]函数,我什至想不出一个解决方案。

void _90DegClockwise(int *pS, int row, int col) {
    for (int i = 0; i < row; ++i)
    {
        for (int j = i + 1; j < col; j++) {
            int temp;
            temp = (int)(pS);
            *((int*)((pS + i) + j)) = (int*)((pS + j) + i);
           (int*)((pS + j) + i) = temp;
        }
    }
}

我不知道如何向矩阵插入值或如何交换

4

2 回答 2

2

要解决这个问题,您需要了解数组在 C 中是如何工作的。

假设您有一个 3 * 3 矩阵,声明如下:

int matrix[3][3];

当你想象这是一个像这样的正方形时:

+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+

对于计算机来说,它是内存中的连续“行”,如下所示:

+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
^
|____matrix

变量matrix保存第一个单元格的地址

因此,如果您想在不使用[]运算符的情况下访问任何单元格,则需要计算该单元格的地址。

让我们为中间单元格执行此操作:

matrix[1][1];

这是第二行的第二个单元格,因此您需要将第一行的宽度添加到矩阵的开头,然后从第二行的开头再添加一个单元格。并且您想取消引用地址以获取如下值:

*(matrix + (3 * 1) + 1);

如果我们想要第三行的中间单元格怎么办?同样的事情,但添加两行的宽度:

*(matrix + (3 * 2) + 1);

总结一下:如果你想访问矩阵 y 行中的单元格 x,你可以像这样计算它的地址:

*(matrix + (with * y) + x);
于 2018-11-10T12:59:44.250 回答
1

您在 3 行中混合了指针取消引用的值

在第一行中temp = (int)(pS);,您将指针值分配给temp而不是指针指向的值。同样,您还将指针值分配给这样的内存位置,这*((int*)((pS + i) + j)) = (int*)((pS + j) + i);是没有意义的。

然后在最后一行(int*)((pS + j) + i) = temp;不起作用,因为您将值分配给地址而不是内存位置

请记住使用*取消引用指针来获取变量,即指针指向的内存位置。在 Ca[b]中相当于*(a + b)所以只需替换所有这些出现。我不知道您为什么“正确”地这样做,*((int*)((pS + i) + j))但没有将其应用于其他人

即使那样,您也错误地计算了索引。*((int*)((pS + i) + j))只是pS[i + j]这不是您想要的正确项目。如果将二维数组作为一维数组传递,则需要像这样计算真实索引pS[i + j*width]

所以要做

temp = pS[i + j*width];
pS[i + j*width] = pS[j + i*width];
pS[j + i*width] = temp;

只需将其更改为

temp = *(pS + i + j*width);
*(pS + i + j*width) = *(pS + j + i*width);
*(pS + j + i*width) = temp;

您应该启用所有编译器警告。他们非常有帮助,可以帮助您解决上述大部分问题

于 2018-11-10T13:04:27.390 回答