#include <stdio.h>
main(){
int A[3][2] = {0} ;
printf("A = \n");
for(int x = 0 ; x < 3 ; x++){
for (int y = 0 ; y < 2 ; y ++){
A[x][y] = (x+1)*1 + (x*1+3)*y ;
printf("A[%d][%d] = %d ", x , y ,A[x][y]);
}
printf("\n");
}
printf("\nAT = \n");
for (int p = 0 ; p < 2 ; p++){
for (int q = 0 ; q < 3 ; q++){
A[p][q] = A[q][p];
printf("A[%d][%d] = %d ", p ,q , A[p][q]);
}
printf("\n");
}
}
为什么AT [1] [0] = 2而不是4?
我已经为这个简单的问题测试了一个小时,但我不知道。
答案 0 :(得分:2)
如果转置非方矩阵,则生成矩阵的尺寸也将被转置。不仅如此,如果你要在原地进行转置,你需要交换元素对,否则你会在它们被转置之前覆盖一些元素。
因此,要解决这两个问题,您应该只使用第二个矩阵,其中包含转置结果的正确尺寸,例如
#include <stdio.h>
int main()
{
int A[3][2] = {0};
int AT[2][3] = {0}; // <<<
printf("A = \n");
for(int x = 0 ; x < 3 ; x++){
for (int y = 0 ; y < 2 ; y ++){
A[x][y] = (x+1)*1 + (x*1+3)*y ;
printf("A[%d][%d] = %d ", x, y, A[x][y]);
}
printf("\n");
}
printf("\nAT = \n");
for (int p = 0 ; p < 2 ; p++){
for (int q = 0 ; q < 3 ; q++){
AT[p][q] = A[q][p]; // <<<
printf("A[%d][%d] = %d ", p, q, AT[p][q]);
}
printf("\n");
}
return 0;
}
答案 1 :(得分:0)
当条件到来时,你正在访问数组越界,
A[0][2]=A[2][0]; // <--
此处您只能访问第一个位置。就像Paul R
所说的那样使用
转置数组时单独的数组。
例如,考虑你的数组是在内存中声明的。
Memory Address 125 126 127 128 129 130
^ ^ ^ ^ ^ ^
| | | | | |
Array accessing [0][0] [0][1] [1][0] [1][1] [2][0] [2][1]
访问[0][2]
时会发生什么。它将转到[1][0]
。