旋转不带[]的矩阵

时间:2018-11-10 11:39:19

标签: c arrays pointers

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

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;
        }
    }
}

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

2 个答案:

答案 0 :(得分:1)

要解决此问题,您需要了解数组如何在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);

答案 1 :(得分:1)

您正在将指针和取消引用的值混合在3行中

在第一行df1 <- data.frame(a=1:3,b=4:6,c=7:9) stack(df1) # values ind # 1 1 a # 2 2 a # 3 3 a # 4 4 b # 5 5 b # 6 6 b # 7 7 c # 8 8 c # 9 9 c 中,您将指针值分配给temp,而不是指针所指向的值。同样,您也将指针值分配给内存位置,例如temp = (int)(pS);,这没有任何意义。

然后最后一行*((int*)((pS + i) + j)) = (int*)((pS + j) + i);无效,因为您是地址值而不是内存位置

请记住使用(int*)((pS + j) + i) = temp;取消引用指针以获取变量,即指针指向的内存位置。在C中,*等效于a[b],因此只需替换所有出现的情况即可。我不知道您为什么要*(a + b)“正确”地执行此操作,却没有将其应用于其他人

即使那样,您也会错误地计算索引。 *((int*)((pS + i) + j))只是pS [i + j],这不是您想要的正确项目。如果将2D数组作为1D数组传递,则需要像这样*((int*)((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;

您必须启用所有编译器警告。它们非常有帮助,可以帮助您解决上述大多数问题