C/C++实现动态数组

来源:互联网 发布:永锡尔类。其是之谓乎 编辑:程序博客网 时间:2024/06/05 18:06
        C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量。一旦定义了一个数组,系统将为它分配一个固定大小的空间,以后不能改变,称为静态数组。静态数组存放在:全局变量区、栈

        动态数组,可以随程序需要而重新指定大小。动态数组的内存空间是从堆(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; ‘[ ]’表明该指针是指向的自由存储区的数组,而非单个对象。如果遗漏了空方括号,编译器将无法发现这个错误,将导致程序在运行时出错。


0 0