2016-10-02 131 views
3

我對C++課程中的幻燈片感到困惑。 int(* foo)[5]是一個指向5個元素的整數數組的指針,但在示例2中,int(* numbers2)[4]指向一個數組(4個數組)的數組,類型的整數。這兩個人如何擁有相同的左手聲明,但擁有不同的類型?C++中的指針混淆

#include <iostream> 
using std::cout; 
using std::endl; 


int main() { 

    //Example1 
    int numbers[5] = { 1,2,3,4,5 }; 
    int(*foo)[5] = &numbers; 
    int *foo1 = *foo; 


    //Example2 
    int numRows = 3; 
    int(*numbers2)[4] = new int[numRows][4]; 
    delete[] numbers2; 


    return 0; 

} 
+1

'numbers2'指向動態數組的第一個元素*。現在'新'表達式工作。 –

+2

想一點...如果你分配一個普通的整數數組,然後'new int [numRows]'返回'int *'。所以當你分配一個數組的數組時,你會得到一個指向數組的指針,或者是'int(*)[4]'(在你的具體情況下)。 –

+2

一個'int *'可以指向一個整數或整數數組的第一個元素的地址。指向數組的指針也是如此。它可以指向單個數組或數組數組的第一個元素的地址。 – Galik

回答

3

檢查pointer declaration reference

由於陣列到指針的隱式轉換的,指針數組的 第一個元件可以與 陣列類型的表達式初始化

int a[2]; 
int* p1 = a; // pointer to the first element a[0] (an int) of the array a 

int b[6][3][8]; 
int (*p2)[3][8] = b; // pointer to the first element b[0] of the array b, 
        // which is an array of 3 arrays of 8 ints 

所以基本上說什麼左手numbers2foo指向右側的事項。

所以在以下numbers2指向temporary(尚未命名的)陣列的第一元件,其是4個整數

int(*numbers2)[4] = new int[numRows][4]; 

numRows數組的數組雖然foo點的numbers第一元件,其爲5的陣列整數

int(*foo)[5] = &numbers; 
1

您在示例2的問題中的描述不完全正確。

嘗試這樣的措辭,你會看到並行性。

  • foo是指向第一個對象的指針,每個對象是一個由5個元素組成的整數數組。 (事實證明,第一個是唯一的一個)
  • numbers2是指向第一個對象的指針,每個對象是一個由4個元素組成的整數數組。 (事實證明,有一個總的人numRows

指針數據類型不告訴你它指向的對象的數量,只有每一個類型。