我對C++程序中的這一行感到困惑。該程序的想法是檢查4x4
陣列是否是對稱的。這部分代碼聲明瞭一個2D數組,我不明白。使用雙指針聲明2D數組
int** array = new int*[n];
雖然,還有另一個類似於這個問題,但它是關於我得到的單個指針。
int *array = new int[n];
我不明白雙指針。請解釋一下。
我對C++程序中的這一行感到困惑。該程序的想法是檢查4x4
陣列是否是對稱的。這部分代碼聲明瞭一個2D數組,我不明白。使用雙指針聲明2D數組
int** array = new int*[n];
雖然,還有另一個類似於這個問題,但它是關於我得到的單個指針。
int *array = new int[n];
我不明白雙指針。請解釋一下。
如何創建單個指針數組?你這樣做:
int* myArray = new int[n];
這是什麼意思?它有兩個部分。第一部分是保留一個指針int*
我們稱之爲myArray
,第二部分是你保留n
元素,每個元素在內存中的大小爲int
(這是一個數組,對嗎?),然後你獲取該數組的地址並保存它在變量myArray
中。
現在你想要一個二維數組,它是一個數組的數組。所以這個新數組陣列中的每個元素就是其中之一,我們在那裏討論過。我們如何保留這個?我們這樣做:
new int*[n];
因爲我們是保留n
插槽,每個int*
類型,我們之前談到。
現在什麼是返回值的類型?這是一個數組的數組,或「指向數組的指針,而後者也是一個指向數組的指針」,所以你把它寫成
(int*)*
或者
int**
因此它成爲
int** array = new int*[n];
「...一個二維數組,它是一個數組的數組」 - 該語句是準確的。但是,OP的混淆不需要通過將* array *數組與*指針*數組混淆而進一步加劇。他們**不是**的同義詞。後者讓句法糖看起來像前者,但它們絕不相同。我希望OP能夠抓住這個問題,否則他們會回過頭來發表另外一個關於爲什麼要傳遞'a',聲明爲'int a [n] [m];'來期待'int ** ar'不起作用的問題。 – WhozCraig
@WhozCraig我喜歡讓事情繫統化地理解。那是我在那裏試圖做的。 –
@ TheQuantumPhysicist你的解釋真的很有幫助。非常感謝。 – TheLearner
int** array
是一個指向的指針int
。因此,通過這樣做:
int** array = new int*[n];
要創建的保存n
int*
指針部分內存,並在內存指着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);
和你做......
很好解釋。感謝您的幫助。 – TheLearner
這樣想:第一個是分配一系列'n'指針,然後每個指針可以分配類似於第二行的東西,你已經明白了。然後通過'array [i]'訪問數據的第i行「行」。但那只是一個'int *'。因此,您可以通過'array [i] [j]'訪問數據的*第*列「數據」。 – WhozCraig