2016-09-08 163 views
1

我對C++程序中的這一行感到困惑。該程序的想法是檢查4x4陣列是否是對稱的。這部分代碼聲明瞭一個2D數組,我不明白。使用雙指針聲明2D數組

int** array = new int*[n]; 

雖然,還有另一個類似於這個問題,但它是關於我得到的單個指針。

int *array = new int[n]; 

我不明白雙指針。請解釋一下。

+0

這樣想:第一個是分配一系列'n'指針,然後每個指針可以分配類似於第二行的東西,你已經明白了。然後通過'array [i]'訪問數據的第i行「行」。但那只是一個'int *'。因此,您可以通過'array [i] [j]'訪問數據的*第*列「數據」。 – WhozCraig

回答

3

如何創建單個指針數組?你這樣做:

int* myArray = new int[n]; 

這是什麼意思?它有兩個部分。第一部分是保留一個指針int*我們稱之爲myArray,第二部分是你保留n元素,每個元素在內存中的大小爲int(這是一個數組,對嗎?),然後你獲取該數組的地址並保存它在變量myArray中。

現在你想要一個二維數組,它是一個數組的數組。所以這個新數組陣列中的每個元素就是其中之一,我們在那裏討論過。我們如何保留這個?我們這樣做:

new int*[n]; 

因爲我們是保留n插槽,每個int*類型,我們之前談到。

現在什麼是返回值的類型?這是一個數組的數組,或「指向數組的指針,而後者也是一個指向數組的指針」,所以你把它寫成

(int*)* 

或者

int** 

因此它成爲

int** array = new int*[n]; 
+0

「...一個二維數組,它是一個數組的數組」 - 該語句是準確的。但是,OP的混淆不需要通過將* array *數組與*指針*數組混淆而進一步加劇。他們**不是**的同義詞。後者讓句法糖看起來像前者,但它們絕不相同。我希望OP能夠抓住這個問題,否則他們會回過頭來發表另外一個關於爲什麼要傳遞'a',聲明爲'int a [n] [m];'來期待'int ** ar'不起作用的問題。 – WhozCraig

+0

@WhozCraig我喜歡讓事情繫統化地理解。那是我在那裏試圖做的。 –

+0

@ TheQuantumPhysicist你的解釋真的很有幫助。非常感謝。 – TheLearner

1

int** array是一個指向的指針int。因此,通過這樣做:

int** array = new int*[n]; 

要創建的保存nint*指針部分內存,並在內存指着array。對於每一個你已經創建了這些指針,就可以像這樣創建一組int S:

for (auto i = 0; i < n; ++i) 
    array[i] = new int[n]; 

產生的內存將是這樣的:

array -> [  int*  |  int *  | .... n 
     [int | int | ...][int | int | ...][ ... n 

然而,這是多少如果你使用一些std東西在C++中容易得多,即std::vector

std::vector<std::vector<int>> arr(std::vector<int>(0, n), n); 

和你做......

+0

很好解釋。感謝您的幫助。 – TheLearner