数组可以进行静态创建和动态创建,平时最常用的还是动态创建:
动态创建一维数组,测试代码如下:
int *array1;
int n;
cin >> n;
array1 = new int[n];
for (int i = 0; i < n; i++)
{
array1[i] = i;
}
for (int j = 0; j < n; j++)
{
cout << array1[j] << " , ";
}
动态创建二维数组,测试代码如下:
int **array2;
int a;
int b;
cin >> a >> b;
array2 = new int *[a];
for (int i = 0; i < a; i++)
{
array2[i] = new int[b];
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
array2[i][j] = 0;
}
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
cout << array2[i][j] << " , ";
}
}
动态创建三维数组,测试代码如下:
int ***array3;
int p;
int q;
int m;
cin >> p >> q >> m;
array3 = new int **[p];
for (int i = 0; i < p; i++)
{
array3[i] = new int *[q];
for (int j = 0; j < q; j++)
{
array3[i][j] = new int[m];
}
}
int count = 1;
for (int i = 0; i < p; i++)
{
for (int j = 0; j < q; j++)
{
for (int k = 0; k < m; k++){
array3[i][j][k] = count;
count++;
}
}
}
for (int i = 0; i < p; i++)
{
for (int j = 0; j < q; j++)
{
for (int k = 0; k < m; k++)
{
cout << array3[i][j][k] << " , ";
}
}
}
由上面动态创建高维数组测试代码可知,高维数组的创建其实就是从第一维开始一层一层创建指向下一维类型的指针数组,直至指向最后一维创建的一维数组new elemType[n];而静态创建数组就是直接计算好空间,然后一次性开辟出那么大的连续空间,所以静态创建和动态创建数组的机制是不一样的,不同之处可以由下面一段测试代码看出一些:
double **array2;
int a;
int b;
cin >> a >> b;
array2 = new double *[a];
for (int i = 0; i < a; i++)
{
array2[i] = new double[b];
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
array2[i][j] = 0;
}
}
for (int i = 0; i < a; i++)
{
//for (int j = 0; j < b; j++)
//{
cout << array2[i] << " , ";
//}
}
cout << endl;
cout << array2 << endl;
cout << array2 + 1 << endl;
cout << *(array2 + 1) << endl;
cout << endl;
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < a; i++)
{
//for (int j = 0; j < b; j++)
//{
cout << arr[i] << " , ";
//}
}
cout << endl;
cout << arr << endl;
cout << arr + 1 <<endl;
cout << *(arr + 1) << endl;
}
由这段代码的输出结果可知静态数组是由编译器自动开辟一块连续空间,然后各种指针的机制(上面一篇写的二维数组指针的意义)都是由编译器制定的;而动态创建的数组,分配的地址空间除了最后一维上的之外是不连续的,分析结构的时候要根据创建指针数组的次序一层层解析。