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