| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1589 人关注过本帖
标题:传递动态二维数组的问题
取消只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
收藏
已结贴  问题点数:14 回复次数:7 
传递动态二维数组的问题
代码可以运行,被警告了,怎么修改
图片附件: 游客没有浏览图片的权限,请 登录注册

#include<stdio.h>
#include<stdlib.h>
int n;
void Tri(int (*p)[30])
{
    int i,j;
    for(i=0;i<n;i++)
    {
        p[i][i]=1;
        p[i][0]=1;
    }
    for(i=2;i<n;i++)
    for(j=1;j<=i-1;j++)

    {
        p[i][j]=p[i-1][j-1]+p[i-1][j];
    }
    for(i=0;i<n;i++)
    {
    for(j=0;j<=i;j++)
    printf("%-4d ",p[i][j]);
    printf("\n");
    }

}
int main()
{
    int **p, i;
    while(1)
    {
        printf("输入杨辉三角的N行,打印出杨辉三角\n");
        scanf("%d",&n);
        p=(int **)malloc(n *sizeof(int *));
        for(i=0;i<n;i++)
        *(p+i)=(int *)malloc(n *sizeof(int));
        Tri(p);
    }
}
搜索更多相关主题的帖子: include 动态 
2017-03-23 17:10
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 2楼 吹水佬
不懂、
2017-03-23 18:18
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 5楼 吹水佬
你这个分配的是一维指针吧。
void _input(int *a, int m, int n)
{
    int i, j, *p;
    for (i=0; i<m; i++)
    {
        p = a+i*n;                你这里是什么意思呢。和p=a;有什么区别值都一样
        for (j=0; j<n; j++)
           {

           *(p+j) = i+j;
            printf("%d ",*(p+j));
           }
    }
}
2017-03-24 13:24
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
以下是引用吹水佬在2017-3-24 13:56:54的发言:

指针表达的只是一个地址,没什么一维二维。
p = a+i*n; 这时的p指针是相对二维数组来说的,表达的是第i行的首地址。
*(p+j)就好理解,就是第i行j列元素值,也可以写成p[j]好理解点,甚至还可以写成是j[p],是不是有点神,C的数组就是这怪样,hehe...


p=a+i 才是i行首地址啊。
p=a+i*n   p=a+0*6等价于p=a; p=a+1*6不等价于p=a+1...不明在这里。有点蒙蔽
2017-03-24 15:20
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 7楼 吹水佬
以下是引用吹水佬在2017-3-24 13:56:54的发言:

指针表达的只是一个地址,没什么一维二维。
p = a+i*n; 这时的p指针是相对二维数组来说的,表达的是第i行的首地址。
*(p+j)就好理解,就是第i行j列元素值,也可以写成p[j]好理解点,甚至还可以写成是j[p],是不是有点神,C的数组就是这怪样,hehe...


p=a+i 才是i行首地址啊。
p=a+i*n   p=a+0*6等价于p=a; p=a+1*6不等价于p=a+1...不明在这里。有点蒙蔽
2017-03-24 15:26
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 10楼 吹水佬
   p = (int**)malloc(sizeof(int*)*M);
    for (i=0; i<M; i++)
        p[i] = (int*)malloc(sizeof(int)*N);

我还想知道。这种和你那种申请动态空间有什么区别。这种的话可以直接访问p[i][j],用你的那种方法的是不能像数组这样直接访问。直接*[p+j]这种的话就像访问一个一维数组一样。那你这种方式假如访问[2][3]的地址的值,就要定义一个指针?int *a;p=a+2*n;*(p+j)//*(a+2*n,j);这样才能访问吗?
2017-03-24 17:25
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 12楼 吹水佬
假如我定义一个指针数组**p,大小是由键盘输入行M列N。然后用malloc为开辟M个空间,再为每行开辟N列元素空间。函数 void fun(int **p)来接受指针数组的首地址。
这样再函数里面使用就可以直接用数组的形式表示, 使用很方便。
你说的这种开辟一个M*N的空间,void fun(*p,M,N)是能用指针这种形式运用。使用的话就不能像数组这样用起来方便,但是开辟和释放空间就方便了。
我想问这两种在二维数组下用有没有什么区别?或者还有没有其它优势
2017-03-27 18:02
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 14楼 吹水佬
好的。谢谢你的耐心解答
2017-03-28 10:01
快速回复:传递动态二维数组的问题
数据加载中...
 
   



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

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