将一个3*3矩阵转置
main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *p,i;
p=&a[0][0];
move(p);
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
move(int *pointer)
{
int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=*(pointer+3*i+j); //我这里看不明白。当开始第二个循环体时当j=1时,岂不是交换*(pointer+1)与*(pointer+3)
*(pointer+3*i+j)=*(pointer+3*j+i); //那这个*(pointer+3)是哪个元素?怎么用种方式表示
*(pointer+3*j+i)=t; //根据指向二维数组的指针*(pointer+i)+j表示的是指向第i行第j列的地址,那上面的*(pointer+3)岂
} //不是指向第三行第零列的地址?就是这里很模糊,请指教。THX~~
}
搜索更多相关的解决方案:
矩阵
----------------解决方案--------------------------------------------------------
根据指向二维数组的指针*(pointer+i)+j表示的是指向第i行第j列的地址,那上面的*(pointer+3)岂
int a[3][3],(*p)[4],i,j;(这时的 *(p+i)+j为i行 j列)
与
int a[3][3],*p;(这时的*(p+3*i+j)就是LZ这个程序里的.)
的区别..
个人认为是这样.我刚好学到2维数组与指针...LZ努力
共同进步呀..
呵呵
----------------解决方案--------------------------------------------------------
以下是引用C之Itachi在2006-9-19 21:57:02的发言:
根据指向二维数组的指针*(pointer+i)+j表示的是指向第i行第j列的地址,那上面的*(pointer+3)岂
int a[3][3],(*p)[4],i,j;(这时的 *(p+i)+j为i行 j列)
与
int a[3][3],*p;(这时的*(p+3*i+j)就是LZ这个程序里的.)
的区别..
个人认为是这样.我刚好学到2维数组与指针...LZ努力
共同进步呀..
呵呵
我看不懂什么意思哦
----------------解决方案--------------------------------------------------------
以下是引用forice在2006-9-19 21:18:56的发言:
main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *p,i;
p=&a[0][0];
move(p);
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
move(int *pointer)
{
int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=*(pointer+3*i+j); //我这里看不明白。当开始第二个循环体时当j=1时,岂不是交换*(pointer+1)与*(pointer+3)
*(pointer+3*i+j)=*(pointer+3*j+i); //那这个*(pointer+3)是哪个元素?怎么用种方式表示
*(pointer+3*j+i)=t; //根据指向二维数组的指针*(pointer+i)+j表示的是指向第i行第j列的地址,那上面的*(pointer+3)岂
} //不是指向第三行第零列的地址?就是这里很模糊,请指教。THX~~
}
*(pointer+3)应该是第二行的第一列吧,就是4
其实是2和4互换,3和7互换。。。。,应该是这样吧
我也是初学者,大家一起进步!
----------------解决方案--------------------------------------------------------
以下是引用Sally_SJL在2006-9-19 22:23:14的发言:
*(pointer+3)应该是第二行的第一列吧,就是4
其实是2和4互换,3和7互换。。。。,应该是这样吧
我也是初学者,大家一起进步!
嗯,我知道2,4互换。
但是我不明白*(pointer+3)为什么是指向第二行的第一列。
第二行第一列我们不是可以用*(pointer+2)+1表示吗
----------------解决方案--------------------------------------------------------
以下是引用forice在2006-9-19 22:28:10的发言:
嗯,我知道2,4互换。
但是我不明白*(pointer+3)为什么是指向第二行的第一列。
第二行第一列我们不是可以用*(pointer+2)+1表示吗
*pointer 第一行第一列,*(pointer+1)第一行第二列,*(pointer+2)第一行第三列
所以*(pointer+3)就是第二行第一列了
----------------解决方案--------------------------------------------------------
楼上说的不对
----------------解决方案--------------------------------------------------------
用数组写的,看看;
void move(int a[][3])
{
int i,j,temp;
for(i=0;i<3;i++)
for(j=0;j<=i/2;j++)
{ temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
----------------解决方案--------------------------------------------------------
pointer 被赋的是数组a的首地址 即a[0][0]
既然是地址 那么pointer+1 意思就是指向下一个地址 即&a[1][0],所以(pointer+1)+1等价于&a[1][1]
... 因为数组在内存中是连续的 所以1 2 3 4 5 6 7 8 9 所存储的位置对应pointer来讲就是pointer,poniter+2,...,pointer+8
----------------解决方案--------------------------------------------------------
[QUOTE]
a[3][3],*(pointer+i)+j这个如果表示是第i行第j列,那么指针的定义应该就是指向包含3个元素的一维数组.也就是
int (*p)[3]; 然后把p=a;[/QUOTE]
----------------解决方案--------------------------------------------------------