我們都從書上學習的方法,定義一個數組需要數組名、類型以及數組元素個數,一般定義必須明確元素的個數,否則無法通過編譯。
1、
int a[];
2、
int n; int a[n];
就想上面這兩種情況,肯定無法通過編譯的。
當然有一種情況不用定義元素個數,就是在聲明的時候就將數組進行初始化賦值。
int a[] = {1,2,3,4}
這種情況是可以的。
那當我不想進行初始化賦值,又不能確定元素個數時,我們該如何聲明這個數組呢?
我相信很多人遇到過這個問題,我也一樣。今天我終於找到這個問題的解決方案——利用動態聲明的方式聲明一個數組。
首先,我們來看看一維數組的定義,代碼如下:
int n; int *a = new int[n];
當然,動態聲明一位數組,實質是根據n的值向內存申請了n*sizeof(int)大小的空間,在數組使用完之後,需要釋放這個空間:
delete []a;
那麼二維數組如何通過動態聲明進行聲明呢?代碼如下:
int **a = new int*[m]; //首先聲明一組指向各行指針 for(int i = 0;i<m;i++) a[i] = new int[n] //再聲明各行的每列元素的指針
同樣,使用完數組還需釋放內存空間:
for(int i = 0; i<m;i++) delete []a[i]; delete []a;
最後要注意的一點是,動態聲明的二維數組中,a[k]是一個int*類型,是一個指針,因此只能使用a[i][j]或*(*(a+i)+j)訪問相應的元素,絕對不能使用a[i*n+j]的方式訪問。