2014-02-08 71 views
-4

我有一個問題,關於c指針2d數組。我們經常寫:訪問2d數組與指針在c + +中,如何分配地址指針?

int (*p)[3]=a //here a is a 2d array 

但寫着:

int (*p)[3]=a[0] 

int (*p)[3]=&a[0] 

產生相同的結果即是a基址。如果我們cout p,它產生與*p相同的結果。

爲什麼這一切都在發生。

+0

@Manu343726上面的*是*聲明。 int(* p)[3]中的'p'是int [3]'數組的簡單*指針,而int * p [3]中的'p'將是一個由3個指針組成的數組,這將衰減到'int **' – mb84

回答

0

本聲明

int (*p)[3]=a[0] 

無效,編譯器將發出錯誤。右操作數的類型int *而左操作數的類型int (*p)[3]

這些陳述

int (*p)[3]=a 
int (*p)[3]=&a[0] 

是等效的,因爲在右側陣列的隱式轉換爲指針到它的第一元件。

至於語句

std::cout << p; 

std::cout << *p; 

那麼它們產生相同的結果,因爲它們輸出,其中該陣列被分配memort的地址。 * p相當於一個[0]並隱式轉換爲指向其第一個元素的指針,即& a [0] [0]。所以在這兩種情況下,它實際上是[0] [0]的地址,因爲數組從第一行開始按行放置在內存中。

+0

右邊的第一條語句有** int ** –

+0

@David Kernin你在說什麼聲明? –

+0

對不起,我沒有閱讀「二維數組」,並採取了一維 –

0

第一:您的代碼無效,因爲在不兼容類型之間沒有強制轉換。

將右側表達式中使用的數組名稱隱式轉換爲指向數組第一個元素的指針。這是怎麼回事:

#include <iostream> 
using namespace std; 

int main() { 
    int a[][2] = { {0,0}, {1,1}, {2,2}}; 
    int (*p)[3]=(int(*)[3])a; // implicitly converted from array name to pointer to the first element (int(*)[2]) 
    int (*p2)[3]=(int(*)[3])a[0]; // a[3][2], access a[0], an array, implicitly converted to int* 
    int (*p3)[3]=(int(*)[3])&a[0]; // Address of int[2] array, int(*)[2] type 

    cout << p << endl; 
    cout << p2 << endl; 
    cout << p3 << endl; 

    // your code goes here 
    return 0; 
} 

http://ideone.com/qG5riN

0

這是因爲數組變量基本上解決了。
所以a[0]將指向的基地址第一個1D陣列因爲a本身是二維陣列