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

如题所述

在做项目的时候遇到了动态分配数组内存赋值后,怎样得到数组的行数和列数的问题,下面给大家分享一下我解决这个问题的过程。
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");
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-04-16
为什么要用双指针呢,双指针首先要new一个指针的数组,然后再每个去具体new出来放值。直接用指针就好了,比如ROW * COL的矩阵,直接new [ROW * COL]第r行c列就是 m[r*COL+c]如果你觉得直接这样用比较麻烦,那就封装成一个class本回答被网友采纳
相似回答