C/C++实现动态数组

        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; ‘[ ]’表明该指针是指向的自由存储区的数组,而非单个对象。如果遗漏了空方括号,编译器将无法发现这个错误,将导致程序在运行时出错。


  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值