读书人

指针变量于二维数组的迷惑

发布时间: 2013-03-29 14:24:52 作者: rapoo

指针变量于二维数组的疑惑
#include<stdio.h>
void transpose_matrix(int *p,int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
t=p[i*n+j];
p[i*n+j]=p[j*n+i];
p[j*n+i]=t;
}
}
int main()
{
int i,j,a[3][3];
printf("\n input a:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
transpose_matrix(*a,3);
for(i=0;i<3;i++)
{
printf("\n");
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
}
printf("\n");
return 0;
}
如上,程序是要利用指针来转置一个3*3的方阵,上面黑体部分不明白啊,求哪位大神指教啊 c语言??指针
[解决办法]


for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
t=p[i*n+j];//假设i = 0,n = 3, j = 1时,i*n + j = 1;
p[i*n+j]=p[j*n+i];//j*n + i = 3,二维数组的内存是连续分布的,所以刚好是p[0][1]和p[1][0]进行交换
p[j*n+i]=t;
}
}

[解决办法]

t=p[i*n+j];
p[i*n+j]=p[j*n+i];
p[j*n+i]=t;

楼主可以单步调试下,看看各变量值的变化情况就容易理解了
一步一步来(第一轮for循环):
第一行,把二维数组a[0][0]的值赋值给临时变量t;
第二行,把二维数组a[2][2]的值赋给a[0][0];
第三行,把临时变量t的值赋给a[2][2],这三行就达到了a[0][0]与a[2][2]的转置

返回第二轮循环...
[解决办法]
表示一个i*j矩阵的对角交换。将第i行第j个的值,与第j行第i个的值进行交换。
如 1 2 3 1 4 7
4 5 6 ---> 2 5 8
7 8 9 3 6 9 其中j>=i+1是避免了 i=j的数据交换(如 1 5 9)
[解决办法]
引用:

t=p[i*n+j];
p[i*n+j]=p[j*n+i];
p[j*n+i]=t;

楼主可以单步调试下,看看各变量值的变化情况就容易理解了
一步一步来(第一轮for循环):
第一行,把二维数组a[0][0]的值赋值给临时变量t;
第二行,把二维数组a[2][2]的值赋给a[0][0];
第三行,把临时变量t的值赋给a[2][2],这三行就达到了a[0][0]与a[2][2]的转置

返回第二轮循环...


取个特殊值理解一下很好懂的

读书人网 >C语言

热点推荐