有這樣的代碼:指向在陣列
int tab[14][2];
int (*wskk)[2] = tab; // &tab makes error
int tab2[2];
wskk = &tab2; // tab2 makes error
爲什麼有可能使用一個指針在不同尺寸的兩個陣列以指向?
有這樣的代碼:指向在陣列
int tab[14][2];
int (*wskk)[2] = tab; // &tab makes error
int tab2[2];
wskk = &tab2; // tab2 makes error
爲什麼有可能使用一個指針在不同尺寸的兩個陣列以指向?
要了解發生了什麼事情,你必須熟悉一些關鍵的概念:
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 *
。
使數組到指針的轉換明確的,它可能會變得更加清晰:
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
你是什麼意思*不同類型的數組* *? – Dennis
tab是int [14] [2],tab2是int [2] – scdmb
我認爲他指的是不同的維數 – Robb