2011-09-30 42 views
1

有這樣的代碼:指向在陣列

int tab[14][2]; 
int (*wskk)[2] = tab; // &tab makes error 

int tab2[2]; 
wskk = &tab2; // tab2 makes error 

爲什麼有可能使用一個指針在不同尺寸的兩個陣列以指向?

+1

你是什麼意思*不同類型的數組* *? – Dennis

+0

tab是int [14] [2],tab2是int [2] – scdmb

+0

我認爲他指的是不同的維數 – Robb

回答

5

要了解發生了什麼事情,你必須熟悉一些關鍵的概念:

  • 多維數組是一個數組數組;
  • 數組的名稱衰減爲指向其第一個元素的指針;
  • wskk的類型是「指向2個數組的指針」int s。

因此,如果你寫tab你得到一個指向tab的第一要素,這是它的第一行;該行的類型爲int[2],因此指向它的指針的類型爲int (*)[2],這正是指針的類型。因此,您可以將tab指定爲wskk,該指標現在將指向tab的第一行。

無法分配&tab它,因爲你得到一個指針到整個多維數組,這是int (*)[14][2]類型。

至於第二塊,它更簡單:tab2是兩個int s的陣列,所以它的類型是int[2]。如果你通過&運算符得到一個指針,你會得到一個int (*)[2],這是你的指針類型。實際上,它是有道理的:tab2和一排tab實際上是相同的東西(數組爲2 int s)。

不能分配tab2它,因爲tab2衰變到一個指向它的第一個元素,即一個int *

4

使數組到指針的轉換明確的,它可能會變得更加清晰:

int tab[14][2]; 
int (*wskk)[2] = &tab[0]; // point at tab[0], which has type array of 2 int 

int tab2[2]; 
wskk = &tab2;    // point at tab2, which has type array of 2 int 

參見:How do I use arrays in C++?