2013-07-01 201 views
3

我對指向指針的指針有些困惑,並且由於谷歌省略了一些符號而無法找到想要的結果。什麼是下面的語句實際上意味着關於指針指針的混淆

int** arr[10]; 

是它的10個指針的數組或者是指針的10個整數指針數組(或兩個語句是一樣的)。

下面的敘述描述了什麼?

*arr[0] = new int(5); //assign the first pointer to array of 10 pointers a memory of 5? 

,並聲明等同於

int* (*arr)[10]; 

第一,如果有人清除我的疑惑我們將不勝感激。謝謝!

+4

使用[**順時針螺旋規則**](http://c-faq.com/decl/spiral.anderson.html) –

+1

'雙pointer'是混亂的,人們可能會認爲這是一個指向'double'的指針,使用'pointer to pointer'。 –

+0

http://cdn.memegenerator.net/instances/400x/25611683.jpg –

回答

7

什麼下面的聲明實際上意味着

這意味着指針數組的指針的int。數組中有10個元素,每個元素的類型爲int**

什麼是下面的語句描繪?

它首先訪問數組中的第一個元素,然後取消引用它以訪問int*。指向第一個元素的int指針指向指向新分配的內存。新分配的內存保存值爲5

而且是第一個語句等效爲int *(* ARR)[10];

不,完全沒有。 int* (*arr)[10];是指向數組int*的指針。換句話說,它不是一個數組,它是一個指向數組的指針,並且它指向數組包含10個元素;這些都是int*

2

好的,讓我們一次拿出這個問題。

int** arr[10];是10個指針指向整數指針的數組。 C++中的聲明通常可以更容易地從右到左讀取。請注意,arr是一個數組,而不是指針 - 雖然它可以「衰減」爲指向其元素的指針(其類型爲int***)。

*arr[0] = new int(5);涉及幾個步驟。首先,在堆上分配一個整數(這就是new所做的)。它的初始值爲5((5)位稱爲「構造函數」int)。 new返回一個指針(int*)到這個新分配的int在內存中的位置。該指針被分配給arr中第一個指針指針指向的指針 - *取消引用賦值的第一個元素。

int* (*arr)[10];是較爲奇特的,並不等同;它似乎聲明瞭一個指向10個int指針數組的指針(source)。

3

[]符號的優先級高於*當你做出聲明。因此,像

int* arr[10]; 

實際上是10個指針,即使閱讀從左至右它自然看起來像一個指針數組整數數組。

但是如果調整優先級,像這樣:

int (*arr)[10]; 

你得到一個指向十個整數數組。

在你的情況int** arr[10];是10個指針的數組的指針。它不等同於int* (*arr)[10];,因爲後者是一個指向10個整數指針數組的指針(基本上在前一種情況下,您有一個數組,而在後者中是一個指針,這是一個非常重要的區別)。

也許C++專家可能會在你的關於new的問題上發出警告。

3
35 <---- I am a pointer to an int 


35 <---- I am pointer to an int <---- I am a pointer to an int pointer 

此代碼:

int** arr[10]; 

聲明的那些指針10上的最右邊那裏的陣列。

int** arr[10]; 

int num = 35; 
int* pint = &num; 
int** ppint = &pint; 
arr[0] = ppint; 

int** ppint2 = new int*[5]; 
int num2 = 35; 
int num3 = 45; 
*ppint2 = &num2; 
*(ppint2 + 1) = &num3; 
cout << **ppint2 << " " << **(ppint2 + 1) << endl; 

--output:-- 
35 45 


int* pint2 = new int[3]; 
int* pint3 = new int[2]; 

*pint2 = 10; 
*(pint2 + 1) = 20; 
*(pint2 + 2) = 30; 

*pint3 = 100; 
*(pint3 + 1) = 200; 

arr[0] = &pint2; 
arr[1] = &pint3; 

cout << **arr[0] << endl; 
cout << *(*arr[0] + 1) << endl; 

--output:-- 
10 
20 

pointer是存儲存儲器地址的變量。假設你已將int 10存儲在地址1A處。你可以創建一個指針變量爲10,指針變量的值爲1A。當然,指針的值必須存儲在內存中,因此您可以創建另一個指針來存儲第一個指針的值在內存中的位置。您可以通過將第一個指針的地址分配給第二個指針來實現這一點。第一個指針的類型是int *,第二個指針的類型是int **,即第二個指針是存儲int指針地址的指針。

*arr[0] = new int(5); 

ARR [0]是存儲在哪裏一些其他指針所在的地址的指針
* ARR [0]說, 「讓其他指針,請」
*常用3 [0] = new ...將new返回的地址賦給另一個指針。

2

一個好的技巧破譯陳述這樣是採取一步一步,並建立

這是double數組

double array[5];

陣列也是一個指針,所以這是該相同(但是第一個大小是已知爲五在第二它可能指向任何數目)

double *array;

`

現在讓我們嘗試一些更普遍

T *a;是指向一個或多個TS所以T a[x];其中x是一個數字

這裏建立T **a;是指向一個或多個指針指向一個或多個TS

這意味着*a是指向一個或多個Ts和類似

*a = new T[5]是有效的但a = new T[5]不是一個正確的人會a= new T*[5]創建5個指針TS

所以回到你原來的例子int ** arr[10];這裏ARR點到10 INT **這意味着arr[0] = new int*[5]的靜態數組是一個有效的聲明下面是有效的C++

int ** arr[10]; 

arr[0] = new int*[5]; 
arr[0][1] = new int[5]; 
arr[0][1][0] = 4; 

std::cout << arr[0][1][0] << std::endl; // prints 4 

delete [] arr[0][1]; 
delete [] arr[0]; 
    //note that arr doesn't need to be deleted as it wasn't dynamically allocated 
+0

'數組也是一個指針,所以這是相同的'不,數組和指針是完全不同的。 '這裏a是指向一個或多個指針的指針'不,它是指向指針的指針。它不是一個數組,它指向一個指針。 –

+0

@JesseGood所以你不能做int * a = new int [x]?或者int ** a = new int * [x]?我明白你的意思,我可以分配一個指向數組中第一個單元格的地址的指針,並嘗試在答案中清除它 –