| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 786 人关注过本帖
标题:矩阵转置的问题
只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
收藏
已结贴  问题点数:20 回复次数:9 
矩阵转置的问题
定义的动态数组。输出结果是正确。的有些情况程序就崩了!**P这种动态申请二维数组懂了,就是*p malloc m*n*这种还不是很懂。是代码的问题码?还是不能像数组p[i][j]这样操作
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

#include "stdio.h"
#include "stdlib.h"
int main()
{
    int m,n,i,j;
    int *a;

    scanf("%d",&m);
    scanf("%d",&n);

    a = (int *)malloc((m + n) * sizeof(int));
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", (a + i * n) + j);
        }
    }
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", *((a + j * m)+i));
        }
        printf("\n");
    }
    system("pause");
}
搜索更多相关主题的帖子: include 动态 
2017-03-27 15:07
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
类二维数组不是你这样建的。

首先,建立一个指针数组,然后让每一个指针指向一个数组(动态分配),然后你就能实现类二维数组了,也能用[n][m]这样的形式去操作了。
之所以是类二维数组,只是因为它们看起来像,但存储方式和二维数组截然不同,二维数组是连续的,但这种方式建立的二维数组是不连续的。
真正的动态二维数组也可以这样建立( int (*)[n] )malloc( n * m * sizeof(int) );

PS:这种写法在VS上通不过编译,因为VS不支持变长数组。


二维数组的类型不是指针的指针。

你之所以能见到这样的写法,是因为字符串常量。但字符串常量很特殊,有别于二维数组。

[此贴子已经被作者于2017-3-27 15:42编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 15:15
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 2楼 renkejun1942
https://bbs.bccn.net/thread-475423-1-1.html
你看这个帖子就知道为啥我会这么去想了。反正蒙蔽了。malloc(m* n
*)这种形式是用在什么情况下呢?
2017-03-27 17:05
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 3楼 Emotiona
你需要恶补一下字符串和字符串常量。

我估计那个人也是一个受害者,估计是看到了main()函数的参数,以为二维数组可以那样写。

main()的参数有两种写法,效果是一样的,如下:

main( int avgc, char *avgr[] );
main( int avgc, char **avgr );//这样写,只适用于字符串常量。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:10
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
以下是引用Emotiona在2017-3-27 15:07:46的发言:

定义的动态数组。输出结果是正确。的有些情况程序就崩了!**P这种动态申请二维数组懂了,就是*p malloc m*n*这种还不是很懂。是代码的问题码?还是不能像数组p[j]这样操作
 
 
#include "stdio.h"
#include "stdlib.h"
int main()
{
    int m,n,i,j;
    int *a;
 
    scanf("%d",&m);
    scanf("%d",&n);
 
    a = (int *)malloc((m + n) * sizeof(int));
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", (a + i * n) + j);
        }
    }
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", *((a + j * m)+i));
        }
        printf("\n");
    }
    system("pause");
}
你这个代码在申请内存那里 把m+n 修改成m*n  即可

然后行列转换你自己再好好研究一下  看看是不是你所需要的

这个不过是一维数组和二维数组行列坐标的转换

DO IT YOURSELF !
2017-03-27 17:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
另外,二维数组的应用有一个非法写法,但可以通过编译,并且可以正常使用。

例如你要想一个函数传递一个二维数组,你可以这样写函数的声明

int array( int *a, int size )//这里必须传递数组中元素的个数。

然后调用的时候,传递数组0号元素的地址过去,假设二维数组是a[5][5], 你可以这样调用 array( a[0], 5 * 5 )
这种方法有个学名,叫压扁数组,如果你清楚数组在内存中的存储,那么这个名字会很形象。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:13
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 4楼 renkejun1942
你的意思是杨辉三角那题不能用**p来实现传参?这个**p只适用于字符串是常量的情况。如果是二维数组也不能用**p传参,那只能用数组传?但是你是动态定义的数组,传参的时候不知道数组大小啊。
2017-03-27 17:33
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 7楼 Emotiona
我二楼不是告诉你了,怎么建立动态的二维数组了吗?
另外,我并不知道你那题能不能怎么做,我对算法一点兴趣都没有,至少目前没有。我回答的只是你这个帖子里的问题。

[此贴子已经被作者于2017-3-27 17:37编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:34
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 5楼 wp231957
直接改了。可以用不出错。(m+n)*  !=m* n* 吗?  前者是网上看到的。还想问下传递动态二维数组是不是这两种方式都可以
2017-03-27 17:38
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
没学过数学吗  m+n 能和m*n 划等号吗  除了2 2 之外

DO IT YOURSELF !
2017-03-27 17:43
快速回复:矩阵转置的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031148 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved