簡體   English   中英

多維數組和指針

[英]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&aa[0]&a[0]&a[0][0]都產生相同的 (數組的地址與數組的第一個元素的地址相同),但是表達式的類型不同。

因此,根據上述聲明,表達式a[0]類型為T [M]MT元素數組),除非類型為sizeof運算符,否則它會“拒絕”類型T * 表達式&a[0]類型為T (*)[M]指向 T M元素數組的指針 )。

假設聲明

T a[N][M];
T *p0 = a[0];
T (*p1)[M] = &a[0];

最初, p0p1包含相同的值( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM