c语言将一个字符串转置,将一个3*3矩阵转置

将一个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]

----------------解决方案--------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值