我需要旋转矩阵并在不使用[]
的情况下调用函数,
我什至想不出解决方案。
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;
}
}
}
我不知道如何在矩阵中插入值或如何交换
答案 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;
您必须启用所有编译器警告。它们非常有帮助,可以帮助您解决上述大多数问题