動態分配數組


 

你假如要創建一個數組
數組長度由用戶輸入
那就可以這樣寫:
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