用指针操作实现一个二维数组的转置运算。

用指针操作实现一个二维数组的转置运算。
输入:输入包含m + 1行。第一行是整数m和n,两项之间用一个空格隔开(1 <= m, n <= 10)。 其中,m,n分别为数组的行数和列数。第二行到第m + 1行每行均有n个整数,相邻两项之间用一个空格隔开。
输出:包含n行,是转置后的二维数组。每行均有m个整数,相邻两项之间用一个空格隔开。
例:【输入】3 2【回车】
1 2【回车】
4 5【回车】
7 8【回车】
【输出】1 4 7【回车】
2 5 8

@ada; 解答一下

可以让一个一维int指向指向二维数组第一个int元素,然后根据二维数组之间元素的位置关系,使用int指针来输出二维数组转置后的结果。

代码如下:


#include <stdio.h>

int main(void){
    
    int m,n;
    scanf("%d%d",&m,&n);  // 获取行m,列n的值 
//    printf("m=%d,n=%d\n",m,n);
    
    int arr[m][n];  // 创建m行n列的int数组 
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&arr[i][j]);
        }
    } 
    
//    printf("读取到的数据为:\n");
//    for(int i=0;i<m;i++){
//        for(int j=0;j<n;j++){
//            printf("%d ",arr[i][j]);
//        }
//        printf("\n");
//    } 
        
    // 
    int * p = &arr[0][0]; // 让一维int指针指向二维数组第一个元素 
    int result[n][m];   // 存储转置后的二维数组
    
    // 转置二维数组 
    for(int i=0;i<n;i++){ 
        
        for(int j=0;j<m;j++){  
            
            result[i][j]=*(p+j*n+i);
            
        }
    }
    
    // 输出转置后的结果 
    for(int i=0;i<n;i++){ 
        for(int j=0;j<m;j++){  
            
            if(j!=m-1){    // 如果不是最后一个元素,则输出数字后,再输出一个空格 
        
                printf("%d ",result[i][j]);
            }else{  // 如果到数组最后一个数字,则输出数字后输出一个换行 
                printf("%d\n",result[i][j]);
            }
        }
         
        
    }

    
    return 0;
    
} 

img

供参考:

#include <stdio.h>
#define M 11   //行
#define N 11   //列
int main()
{
    int m, n, i, j, a[M][N], b[N][M], * pa = a[0], * pb = b[0];
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    for (i = 0; i < m; i++)        // 转置
        for (j = 0; j < n; j++)
            *(pb + j * M + i) = *(pa + i * N + j);
    for (i = 0; i < n; i++)       // 输出
    {
        for (j = 0; j < m; j++)
            printf(j ? " %d" : "%d", b[i][j]);
        printf("\n");
    }
    return 0;
}