动态分配数组内存赋值后,怎样得到数组的行数和列数

来源:互联网 发布:淘宝好评返现怎么罚款 编辑:程序博客网 时间:2024/06/01 09:05


动态分配数组内存赋值后,怎样得到数组的行数和列数

在做项目的时候遇到了动态分配数组内存赋值后,怎样得到数组的行数和列数的问题,下面给大家分享一下我解决这个问题的过程。

1. 首先按普通的数组,我们是怎么得到他的行数和列数的呢?

         例如:

          int a[3][4];

          cout<<sizeof(a[0])/sizeof(int);  //这个显示的是列数;为4.

2. 我们按上面的这种方法对动态分配内存后的数组进行操作,

     例如:

            int **R = new int*[10];

           for(int i=0;i<10;i++)
           {
                R[i]=new int[10];

           }

           for(int y2=0;y2<10;y2++)
          {
               for(int x2=0;x2<10;x2++)
             {
                  R[y2][x2] = 150;


               }
            }

            cout <<sizeof(*R[0])/sizeof(int);//这里肯定是不对的,不论怎么修改sizeof中的数值,输出都是不对的。
            system("pause");

    问题:为什么这样是不对的呢?

答案:动态申请返回的其他是一个指针,C/C++里函数返回不了基本类型里的数组的,返回的仅是退化后的指针数组首元素的指针,而指针是不会记录数组大小的,所以如果要在敌后得到申请的是多大,在申请时自己用一个变量来保存

问题:如果我就是想用上面的方法呢?

答案:是可以的,但是数组内的元素不能有0元素。下面我们来探讨一下这个方法。

3.这个方法:在二维数组的每一行和每一列最后都加上NULL,然后有一个嵌套循环就可以求出行数和列数。程序如下:

            int **R = new int*[10+1];

           for(int i=0;i<10+1;i++)
            {


                 R[i]=new int[10+1];

            }

           for(int y2=0;y2<10;y2++)
           {
                for(int x2=0;x2<10;x2++)
                {
                     R[y2][x2] = 150;


                 }
             }

            //再数组每行每列最后加null

          for(int y2=10;y2<10+1;y2++)
          {


                for(int x2=0;x2<10+1;x2++)
                {
                     R[y2][x2] = NULL;

                     R[x2][y2] = NULL;

 
                 }
            }

            //计算出行列数

            int i=0;

            int countx=0,county=0;

            while(*R[i]!=NULL)

            {

                  i++;

                 countx++;

 

             } 

            int j=0;

            while(R[0][j]!=NULL)

            {

                  j++;

                  county++;

 

             }

            cout <<countx<<””<<county; //得出正确结果。
            system("pause");

0 0
原创粉丝点击