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