动态数组的优点:
传统数组(静态数组)是需要在程序运行前,就指定大小,比如说
int i = 10;
int a[i];
这种就是不合法的。
因为函数栈的要求,就是在函数运行前,分配好所有变量的空间,i是不定的,所以不能再运行前,就分配好空间。
但是大多数情况,我们并不能预先知道数组的大小的。
所以我们使用动态数组
int *a = new int[i];
这个语句就可以在执行的时候,才分配空间,是合法的。
同时,传统数组是存放在栈区的,栈区是有大小限制的,好像是2M吧。如果你申请了一个大于2M的数组,程序就会报错……
但是动态数组是在堆空间的,理论上,内存有多大,就可以申请多大的数组。2G总够用的了吧。
动态数组C++实现:
int main()
{
int i = 10;
int *a = new int[i];
for (int j = 0; j < 10; j++)
a[j] = j;
for (int j = 0; j < 10; j++)
cout << a[j] << " ";
cout << endl;
system("pause");
return 0;
}
动态数组的C实现:
申请动态一维数组,只是这个一维数组中存储的是指针类型。
一维数组中的每个指针又可以动态分配一个一维数组,即最终可以形成一个二维数组。
int** array_init(unsigned int size)
{
int **ppArray = NULL;
if (0 == size)
{
return NULL;
}
ppArray = (int**)malloc(sizeof(int*) * size);
if (ppArray == NULL)
{
return NULL;
}
memset(ppArray, 0, sizeof(int*) * size);
return ppArray;
}
void use_array()
{
int **ppArr = NULL;
int i = 0;
int size = 10;
ppArr = array_init(size);
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (i = 0; i < 10; i++)
{
ppArr[i] = &array[i];
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", *(int*)(ppArr[i]));
}
}