2013-08-04 49 views
1

減少陣列的指針的K個& R法:(從arrays and pointers in C的摘錄)減少陣列的指針的K&R方法

ķ&ř試圖建立數組和指針的統一處理,一個 會公開而不是隱藏編譯器代碼中的數組公式。 他們發現了一個優雅的解決方案,儘管有點複雜。 「醜陋」 數組公式是由四個規則取代了他們的配方:

1) An array of dimension N is a 1D array with 
    elements that are arrays of dimension N-1. 

2) Pointer addition is defined by: 

     ptr # n = ptr + n * size(type-pointed-into) 

    "#" denotes here pointer addition to avoid 
    confusion with ordinary addition. 
    The function "size()" returns object's sizes. 

3) The famous "decay convention": an array is 
    treated as a pointer that points to the 
    first element of the array. 

    The decay convention shouldn't be applied 
    more than once to the same object. 

4) Taking a subscript with value i is equivalent 
    to the operation: "pointer-add i and then 
    type-dereference the sum", i.e. 

     xxx[i] = *(xxx # i) 


    When rule #4 + rule #3 are applied recursively 
    (this is the case of a multi-dimensional array), 
    only the data type is dereferenced and not the 
    pointer's value, except on the last step. 

我不明白這是什麼意思

  • 衰減公約不應當適用更比一次到同一個對象(規則#3)。
  • 遞歸應用規則#4 +規則#3(這是多維數組的情況),只有數據類型被取消引用,而不是指針的值,除了最後一步。

有人可以用例子解釋嗎?

+0

@EricPostpischil;源已在問題被引用(在第一行的末尾) – haccks

回答

1

嘗試研究這個代碼

#include <stdio.h> 

int main() { 

    int a[] = {42, 1, 5, 89, 7}; 
    int step = 3; 

    int b = a[step];  // step 1 
    printf("%d\n", b); 

    b = *(a + step);  // step 2 
    printf("%d\n", b); 

    b = *(step + a);  // step 3 
    printf("%d\n", b); 

    b = step[a];   // step 4 
    printf("%d\n", b); 

    return (0); 
} 

因爲這是可能的:

  • 陣列授予是存儲器包含相同類型的變量/時隙的contiguos塊
  • []運算符和指針取消引用您應用相同的算術,相同的指針運算
    • 這是關鍵點,指針和數組不是同一個東西,在這種情況下,同樣的算術適用於指針和數組,當你可以將一個數組看作一個指針或者作爲一個數組與[]運算符,但指針和數組是2種不同的結構,2種不同的東西。

編輯:

我加入步驟4只是澄清指針別名和[]運營商之間的相似性。

1

從你在問題中提供的鏈接,可以考慮下面的例子:

int mat[i][j] 
mat[i][j] = *(*(mat + i * sizeof(row)) # j) 
  • 當規則#4 +規則#3遞歸應用(這是一個多維陣列的情況下),只有數據類型被取消引用,而不是指針的值,除了最後一步。這意味着*(mat + i * sizeof(row))解引用了一個在我們的例子中是「具有j個元素的整數數組」的集合。只有第二個取消引用操作是*(*(mat + i * sizeof(row)) # j)會給你一個實際的int
  • 由於衰變只發生一次,所以上述成立,即。 *(mat + i * sizeof(row))是一個指針,它指向一個int數組」
+0

是什麼意思由* derefrencing數據類型*。? – haccks

+1

@haccks:考慮一個'int'類型的'''',它包含一個指向某個'int'的指針,''x'是對'int'的一個引用,它不是'int',只是關於它的信息。接下來,考慮表達式'* x',這個表達式是'x'指向的int,它不再是對象的引用,而是對象,由於引用不存在,所以應用'*'運算符被稱爲解引用 –

+0

@EricPostpischil;我知道derefrencing:引用數據指針指向但是* *引用數據類型*對我來說是新的 – haccks