| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1226 人关注过本帖
标题:创建二位数组,指点一下,感谢
只看楼主 加入收藏
塘角
Rank: 1
等 级:新手上路
帖 子:35
专家分:5
注 册:2008-12-16
结帖率:75%
收藏
 问题点数:0 回复次数:5 
创建二位数组,指点一下,感谢
三方式创建二维数组 Int a[3][4];
1.指向指针的指针 int **p;
2.指针数组 int *p[3];
3.数组指针 int (*p)[4];
1.
  **p=(int **)malloc(sizeof(int)*3);
  for(int i0;i<3;i++)
  {
    *(p+i)=(int *)malloc(sizeog(int)*4);
  }     
2.for(int i=0;i<3;i++)
 {
  *p[i]=(int *)malloc(sizeof(int)*4);
  }
3.我不知道如何创建,高手指点一下,对二位数组不是很清楚!
搜索更多相关主题的帖子: 感谢 
2009-11-05 15:37
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
对于二维数组的元素,我们有两种方法来输出其中的元素,一种就是通过对行与列的下标控制来实现,这种方法不需要用指针就可以实现!当然我想说的是通过二维数组指针来实现!

对于a[2][4];这个数组,我们可以这样来看它,就是我们可以把它当做一维数组来处理,怎么回事呢?
我们可以把它看做是由两个一维数组a[0]与a[1]组成的。其中在每一个这样的一维数组中储存了四个元素,也就是说其实在a[0],a[1]中储存了四个元素,所以我们可以通过对一维数组的操作来实现对二维数组的操作!
这又是怎么回事呢?
先讲解一下关于二维数组的指针式怎么一回事吧!
上面我们把二维数组看做是一维数组来处理,其实真正意义上的确不是的,这怎么越听越糊涂吧?呵呵!
上面的一维数组只是一个指向二维数组的指针,比如:a[0]=&a[0][0];也就是说一维数组是一个指向二维数组每一行的第一个元素的地址,同样a[1]则是指向a[1][0]的地址的指针,看到这里不知道你是否有一点“山重水复疑无路,柳暗花明又一天”的感觉?
如果还是不太明白的话,那下面的解释你应该会有点明白吧!
先看一下下面的这个程序的一部分:int a[2][4],*p;p=a;这里的p=a不是我们想像的指向a[0][0]的地址的指针,p指向的是一维数组a[0]的地址,而一维数组的指针才是指向二维数组的地址的,这个一定要搞清楚了!那么如果我那么要对p进行操作的话,比如:p+1;是什么呢?我刚才已经说了,p指向的是一维数组的地址,因此p+1当然指的是a[1]的地址呗!那么怎么才能够实现对二维数组的操作呢?别着急。。。
这就需要我们定义一个行指针来实现了!也就是改帖子里的那个(*ptr)[2]了,我已经讲过它表示的是每一个一维数组里的元素个数,比如我现在想对a[1][2]进行指针操作呢?我们这时可以这样:*(*(p+1)+2)就表示的是a[1][2]这个元素了!

好了,就讲这么多吧!打字挺累的喔!呵呵

愿用余生致力编程
2009-11-05 17:22
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 楼主 塘角
三种方式动态创建二维数组 Int a[3][4];
1.指向指针的指针 int **a;
  a=(int **)malloc(3*sizeof(int *));
  *a=(int *)malloc(3*4*sizeof(int));
  for(i=0;i<3;i++)
    a[i]=*a+i*4;
·
2.指针数组 int *b[3];
  *b=(int *)malloc(3*4*sizeof(int));
  for(i=0;i<3;i++)
    b[i]=*b+i*4;
·
3.数组指针 int (*c)[4];
  c=(int **)malloc(3*4*sizeof(int));
·
测试代码:
程序代码:
#include "stdio.h"
int main(void)
{
  int i,j,n=0,**a,*b[3],(*c)[4];

  a=(int **)malloc(3*sizeof(int *));
  *a=(int *)malloc(3*4*sizeof(int));
  for(i=0;i<3;i++)
    a[i]=*a+i*4;

  *b=(int *)malloc(3*4*sizeof(int));
  for(i=0;i<3;i++)
    b[i]=*b+i*4;

  c=(int **)malloc(3*4*sizeof(int));

  for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      {a[i][j]=++n;
       b[i][j]=n;
       c[i][j]=n;
      }


  printf("**a\n");
   for(i=0;i<3;i++)
   {
    for(j=0;j<4;j++)
      printf("%2d ",a[i][j]);
    printf("\n");
   }
  printf("\n*b[3]\n");

   for(i=0;i<3;i++)
   {
    for(j=0;j<4;j++)
      printf("%2d ",b[i][j]);
    printf("\n");
   }
  printf("\n(*c)[4]\n");

   for(i=0;i<3;i++)
   {
    for(j=0;j<4;j++)
      printf("%2d ",c[i][j]);
    printf("\n");
   }
  printf("\n");

  free(a);
  free(*b);
  free(c);
  getch();
  return 0;
}

努力—前进—变老—退休—入土
2009-11-05 17:28
塘角
Rank: 1
等 级:新手上路
帖 子:35
专家分:5
注 册:2008-12-16
收藏
得分:0 
十分感谢,平时就对这个比较迷惑

海纳百川,有容乃大!!
2009-11-05 18:24
塘角
Rank: 1
等 级:新手上路
帖 子:35
专家分:5
注 册:2008-12-16
收藏
得分:0 
UserYuH的测试程序不能用,c=(int **)malloc(3*4*sizeof(int));
除了加上头文件“stdlib.h”,指针不一样
“ cannot convert from 'int ** ' to 'int (*)[4]'”
我无法解决这个问题,高手帮忙写一个正确的
要数组指针创建,感谢一下

海纳百川,有容乃大!!
2009-11-05 18:41
塘角
Rank: 1
等 级:新手上路
帖 子:35
专家分:5
注 册:2008-12-16
收藏
得分:0 
我写了一个,这样完成,但是我无法肯定它理论上是否正确(vc运行正确
#include<stdlib.h>
#include<stdio.h>
typedef int (*a)[4];
int main()
{
    a b;
    int i=0,j=0;
    b=(a)malloc(sizeof(int)*2*4);
    for(i=0;i<2;i++)
     for(j=0;j<4;j++)
     {
         b[i][j]=4;
     }
    for(i=0;i<2;i++)
    {
        for(j=0;j<4;j++)
     {
        printf("%d ",b[i][j]);
     }
      printf("\n");
    }
    return 0;
}
我希望是用指针形式操作,比如在申请内存时,我想像**p一样分成两层写,但是不知道怎么办,大家帮帮忙,搞晕了



海纳百川,有容乃大!!
2009-11-05 19:01
快速回复:创建二位数组,指点一下,感谢
数据加载中...
 
   



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

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