C语言二维数组怎么转置数组?

我用的方法很笨,因为不让修改主程序的代码框架,所以有没有好的方法把我人为3*3赋值那块改成任意数组?

//阅读下面程序,完成下面三个函数,使给定的一个3×3的二维整型数组转置,即行列互换。请使用指针实现。
#include <stdio.h>
#define N 3
void inputmatrix(int *p)
{
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
		scanf("%d",&*p);
		p++;	
		}//这个指针形式的二维数组的输入可以考虑考虑成三个一维数组。 
	}
     ///程序填空,请将该函数填写完整
}
void transpose(int *p)
{
	int i,j=0;
	int t[9];
	for(i=0,j=0;i<9;i++,j++){
		t[j]=*(p+j);
	}
	*p=t[0];
	*(p+1)=t[3];
	*(p+2)=t[6];
	*(p+3)=t[1];
	*(p+4)=t[4];
	*(p+5)=t[7];
	*(p+6)=t[2];
	*(p+7)=t[5];
	*(p+8)=t[8];	
	
	/*123
	456
	789
	
	147
	258
	369*/

     ///程序填空,请将该函数填写完整
}
void printmatrix(int *p)
{
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
		printf("%d ",*p);	
		p++;
		}
	printf("\n");
	}
     ///程序填空,请将该函数填写完整
}
int main()
{
    int s[N][N], *p;
    p = &s[0][0];
    inputmatrix(p);
    transpose(p);
    printmatrix(p);
    return 0;
}

 

#include<stdio.h>
int main()
{
	int huan(int a[3][3]);
	int num[3][3],i,j;
	printf("请输入一个3*3的数组:\n");
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
			scanf("%d",&num[i][j]);	
	}
	huan(num);
	return 0;
} 
int huan(int a[3][3])//定义huan函数,含有一个数组
{
	int i,j,b[3][3];
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			b[j][i]=a[i][j];
		}
	}
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%d ",b[i][j]);
		}
		printf("\n");
	}
	return 0;
 }