动态分配数组


 

你假如要创建一个数组
数组长度由用户输入
那就可以这样写:
int   len; 
cin>>len; 
int   *p=new   int[len];

但是,如果用定长数组实现这个功能请问怎么实现?
int   len; 
cin>>len; 
int arr[len];
吗?

编译不过的吧?!

定长数组是在栈上分配的,在编译的时候就已经确定了大小(VC默认情况下栈大小是1M)

动态数组存储空间是在堆上分配的
只有代码运行的时候才向操作系统申请内存
机器可用内存有多大,就可以申请多大内存

 

一、动态分配一维数组

#include<iostream>
#include<iomanip>
using namespace std;
 
int main()
{  int n,i;
   cin>>n;
int* p = new int[n];//将动态数组起始地址赋给指针pfor (i = 0;i<n;i++) { p[i] = i; cout<<setw(4)<<p[i]; } cout<<endl; delete[] p; return 0; }

动态分配内存解决了运行时确定数组大小的问题,但是这样的数组是没有名字的,只能通过地址来访问。本例中,将new操作得到的动态数组起始地址赋给指针p,这样*p,*(p+1).......*(p+i)就依次是数组中下标为0、1……i的元素。其实数组名就是数组的起始地址,那我们现在得到了数组的起始地址,可否将p当做数组名用呢?当然可以。因此访问元素我们还可以用p[0]、p[1]……p[i]的形式。

二、动态分配二维数组

#include<iostream>
#include<iomanip>
using namespace std;
 
int main()
{
    int (*p)[3];//后面的[3]是必需的
    p = new int[2][3];
    int i,j;
    for (i=0;i<2;i++)
    {
        for (j=0;j<3;j++)
        {
            p[i][j] = i*j;
            cout<<setw(4)<<p[i][j];
        }
        cout<<endl;
    }
    return 0; 
}

本例创建了一个2*3的二维数组,它实际上是由两个一维数组构成的,每个一维数组有3个元素,因此需要声明一个指向一维Int数组的指针p。指针p接收了二维数组的首地址后,既可以作为数组名来使用(如p[i][j]),也可以以指针运算的方式访问数组元素(如*(*(p+i)+j))。C++标准规定,一个n维数组的数组名,如果出现在表达式中,就会立刻被转换成指向n-1维数组的指针,如果对这个指针执行*运算,其结果就是一个n-1维数组,并且也被转换成指针(指向n-2维数组的)。

定长数组是在栈上分配的,在编译的时候就已经确定了大小

动态数组存储空间是在堆上分配的 只有代码运行的时候才向操作系统申请内存 机器可用内存有多大,就可以申请多大内存

 

 

一、直接对数组大小进行输入

 

在C99标准中C语言数组已支持动态定义数组。由于并不是所有编译器支持,这样的代码就不易于移植,所以不推荐使用这种写法。

#include <stdio.h>
int main()
{
    int n,i;
    printf("请输入字符的长度");//int数组亦可
    scanf("%d",&n);
    char a[n];//此处定义为n+1是因为字符串的下标要小一个 
    printf("请输入字符");
    getchar(); 
    for (i=0;i<n;i++)
    {
        scanf("%c",&a[i]);
    }
    printf("%s",a);
    return 0;
}

 

 

 

二、使用malloc函数

#include<stdio.h>
int main()
{
    int a;
    printf("请输入字符串长度");
    scanf("%d",&a);
    char *pa;
    pa=(char *) malloc(a*sizeof(char));
    if(pa==NULL)
    {
        printf("内存分配失败!!!");
    }
    printf("请输入字符");
    getchar();\\可用于清除缓存区内上方输入整型时按的回车字符; int i;
    for(i=0;i<a;i++)
    {
        scanf("%c",pa+i);
    }
    for(i=0;i<a;i++)
    {
        printf("%c",*(pa+i));
    }
    return 0;
} 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM