[英]Multidimensional arrays and pointers
我正在閱讀“新方法”,並遇到了一個不錯的理論。 在二維數組a[i][j]
a[0]
和&a[0]
之間的區別是什么?
它如下所示:
int a[NUM_ROWS][NUM_COLS], *p, i;
for(p = a[i]; p < a[i] + NUM_COLS; p++)
*p = 0;
另一件事是這樣的:
int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i;
for(p = &a[0]; p < &a[NUM_ROWS]; p++)
(*p)[i] = 0;
a[0]
和&a[0]
什么區別?
a[0]
是2D數組中的第一行,類型為int [NUM_COLS]
。
&a[0]
是該行的地址,類型為int (*)[NUM_COLS]
。
在第一個代碼示例中, p
的類型為int *
。 因為在某些情況下,數組會衰減為指向第一個元素的指針,所以可以做p = a[i]
。 那么p[n]
和a[i][n]
是相同的。
當第一個代碼段通過for
循環時,它將在每次迭代中將p
遞增1,以使其指向該行中的后續元素。 因此,第一個代碼塊將第i
行中的每個元素設置為0。
在第二個示例中, p
的類型為int (*)[NUM_COLS]
,因此您可以為其分配行的地址。 隨着循環的迭代, p
遞增,從而指向下一行 。 因此,該代碼塊將第i
列中的每個元素設置為0。
給出聲明
T a[N][M]; // for any type T
以下是正確的:
Expression Type Decays to Value
---------- ---- --------- -----
a T [N][M] T (*)[M] Address of a[0]
&a T (*)[N][M] n/a Address of a
*a T [M] T * Address of a[0][0]
a[i] T [M] T * Address of a[i][0]
&a[i] T (*)[M] n/a Address of a[i]
*a[i] T n/a Value of a[i][0]
a[i][j] T n/a Value of a[i][j]
&a[i][j] T * n/a Address of a[i][j]
a
, &a
, a[0]
, &a[0]
和&a[0][0]
都產生相同的值 (數組的地址與數組的第一個元素的地址相同),但是表達式的類型不同。
因此,根據上述聲明,表達式a[0]
類型為T [M]
( M
的T
元素數組),除非類型為sizeof
運算符,否則它會“拒絕”類型T *
。 表達式&a[0]
類型為T (*)[M]
( 指向 T
M
元素數組的指針 )。
假設聲明
T a[N][M];
T *p0 = a[0];
T (*p1)[M] = &a[0];
最初, p0
和p1
包含相同的值( a[0][0]
的地址)。 但是,如果我們執行以下代碼:
p0++;
p1++;
那么p0
將包含a[0][1]
的地址,而p1
包含a[1][0]
的地址。 p0++
前進p0
指向類型T
的下一個對象,而p1++
前進p1
指向類型T [M]
的下一個對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.