作者:jny2272191 | 来源:互联网 | 2023-06-21 10:06
昨天做了一道剑指Offer的题目,是关于dfs的题目,链接点这里但是其中对于flag[][],二维数组的创建,起了疑惑。在上面链接里也放了关于用new建立二维数组的例子。但是自己突
昨天做了一道剑指Offer的题目,是关于dfs的题目,链接点这里
但是其中对于flag[][],二维数组的创建,起了疑惑。在上面链接里也放了关于用new建立二维数组的例子。
但是自己突然想测试一下,用new创建的二维数组是真的二维数组吗?
首先我们真的 C++可以直接定义二维数组 只要row和col都知道,就可以确定二维数组大小。
int num[10][10];
明确了row和col,就不太容易越界了。同时我们也可以通过sizeof来确定行和列的大小(关于如何用sizeof确定行和列,大家看这个链接)
例子:
#include
#include
using namespace std;
int main()
{
int arr[3][4];
cout<<"row:"< cout<<"col:"<}
结果很明显:
于是我就像用这个方法来确定通过new创建的二维数组大小,
#include
#include
using namespace std;
int main()
{
int n;
cout<<"请输入n的大小:";
cin >> n;
int (*flag)[10]= new int[n][10];
for(int i=0;i for(int j=0;j<10;j++)
flag[i][j]=i*10+j;
}
// for(int i=0;i// for(int j=0;j<10;j++)
// cout<// cout<// }
cout<<"sizeof(flag):"< cout<<"row:"< cout<<"sizeof(flag[0]):"< cout<<"col:"<// flag[11][1]=10;
// cout<<"flag[11][1]="< return 0;
}
结果有点有趣:
通过上面的输出发现,sizeof认为flag只是一个指针,不是二维数组。 为了印证这一点,我对代码又做了改动
#include
#include
using namespace std;
int main()
{
int n;
cout<<"请输入n的大小:";
cin >> n;
int (*flag)[10]= new int[n][10];
for(int i=0; i {
for(int j=0; j<10; j++)
flag[i][j]=i*10+j;
}
for(int i=0; i {
for(int j=0; j<10; j++)
cout< cout< }
cout<<"sizeof(flag):"< cout<<"row:"< cout<<"sizeof(flag[0]):"< cout<<"col:"< flag[11][1]=10;
cout<<"flag[11][1]="< return 0;
}
结果更加有趣:
我加了一个flag[11][1],对于数组来说应该是越界的,但是却没有报错,直接输出了。看来flag你真的是一个指针。。。
但是我还是不相信,我换了一个IDE,之前用的codeblocks,现在试试VS执行,出结果但是一闪而过,出现下图的错误。
看来确实有问题,
代码注释掉后,程序运行正常。看来还是VS大法好。
最后,C++中到底存不存在二维数组?
其实,在C++中,不存在‘二维数组’这种类型。二维数组本身会被解释成一个一维数组:这个数组的元素类型为另一种一维数组。比如int arr[3][3]这个二维数组,它会被编译器视作一个元素类型为‘arr[3]’的一维数组。并且,‘arr[2]’和&#8217;arr[3]&#8217;会被当成不同的数据类型,这也算C++的一种局限吧。