静态数组。静态数组存放在:全局变量区、栈。
堆(heap)上分配(即动态分配)的。步骤如下:
1、malloc/new分配堆内存;注意堆内存的释放;
2、通过指针偏移、下标进行赋值。
首先看C如何实现动态数组。代码如下:
一、使用[]运算符
#include <stdio.h>
#include <stdlib.h>
int main(){
int arrLen; // 数组长度
int *array; // 数组指针
int i; // 数组下标
printf("输入数组长度:");
scanf("%d", &arrLen);
// 动态分配内存空间,如果失败就退出程序
array = (int*)malloc( arrLen*sizeof(int) );
if(!array){
printf("创建数组失败!\n");
exit(1);
}
// 向内存中写入数据
for(i=0; i<arrLen; i++){
array[i] = i+1;
}
// 循环输出数组元素
for(i=0; i<arrLen; i++){
printf("%d ", array[i]);
}
printf("\n");
free(array);
system("pause");
return 0;
}
运行结果:
输入数组长度:10
1 2 3 4 5 6 7 8 9 10
请按任意键继续. . .
二、不使用[]运算符
#include <stdio.h>
#include <stdlib.h>
int main(){
int arrLen; // 数组长度
int *array; // 数组指针
int *arrayCopy; // 数组指针副本
int i; // 数组下标
printf("输入数组长度:");
scanf("%d", &arrLen);
// 动态分配内存空间,如果失败就退出程序
arrayCopy = array = (int*)malloc( arrLen*sizeof(int) );
if(!array){
printf("创建数组失败!\n");
exit(1);
}
// 向内存中写入数据
for(i=0; i<arrLen; i++){
*arrayCopy++ = i+1;
}
// 循环输出数组元素
arrayCopy = array;
for(i=0; i<arrLen; i++){
printf("%d ", *arrayCopy++);
}
printf("\n");
free(array);
system("pause");
return 0;
}
可以发现,我们必须另外定义两个指针变量
1、arrayCopy,用来指向具体的数组元素。
2、array:用于指向数组首地址。在数组赋值完成后,要用array将 arrayCopy 重置到数组首地址,以便后面循环输出。
这里注意:free() 函数必须释放整块内存,不能只释放一部分,或者释放不存在的内存空间,否则程序会出错。
C++实现动态数组。
#include<iostream>
using namespace std;
int main(void)
{
int n=20;
int *p=new int[n];
for(int i=0;i<n;i++)
{
cout<<&p[i]<<endl;
p[i] = i;
}
for(int i= 0;i<n;i++)
{
cout<<p[i]<<endl;
}
delete [] p;
system("pause");
return 0;
}
注意:
最后重要的是别忘了将动态创造的空间释放掉,语句是:delete [] p; ‘[ ]’表明该指针是指向的自由存储区的数组,而非单个对象。如果遗漏了空方括号,编译器将无法发现这个错误,将导致程序在运行时出错。