2012-09-10 111 views
0

C++指針訪問有時我看到在C++中不同陣列的訪問的樣式和以爲可以尋址方式是相對於一個組件:類似於組件

C++:

int * aa=new int[2]; 
0[aa]=15; //a little different than aa[0] 
1[aa]=15; 
aa[0]=15; 
aa[1]=15; 
printf("%d %d \n",aa[0],aa[1]); 

組裝:

__asm 
{ 
    mov aa[0],ebx 
    mov aa[1],eax 
    mov 0[aa],ebx 
    mov 1[aa],eax 
} 

這是C++數組訪問表示法的一個標準嗎?如果是,它是從彙編尋址模式派生的嗎?

當我嘗試[aa]1=5;,編譯器會發出

  • 「找不到AA屬性」,
  • 「缺少 ';'在「常量」之前「
  • 」左操作數必須是l值「。

    //當我嘗試指針運算,

    *(AA + 1)= 0 //沒有給出錯誤

    *(AA + 0)= 0 //沒有給出錯誤:)

此規則是否與運算符[]重載相同?

MSVC++ 2010

謝謝。

+3

這兩者是無關的 - C早在80x86年前就已經存在了。 –

+4

在真正的C++代碼中,你在哪裏看到類似'0 [aa] = 15'的東西?這是合法的,但大多數人不會使用它,除非他們吸取不是 – jalf

回答

5

這是C和C++的一個衆所周知的怪癖,他們並不關心表達式中的哪一半表示出現在方括號內[]。他們都計算出相同的等價表達式:

*(0+aa)=15; 
+0

那麼運營商超載[]呢? –

+0

運算符重載在這裏完全正交,因爲它允許在使用'[]'運算符時調用任何行爲。 – slugonamission

+0

@slugonamission:但是,重載必須是一個非靜態類成員,所以你通常不能定義一個重載,使得'0 [aa]'等同於'aa [0]'。 –

4

基本上被轉換爲*(a+b)表達a[b]。 這就是爲什麼這個「風格」11[arr]是可能的。

原因[aa]11失敗純粹是句法。

3

這是C++數組訪問表示法的一個標準嗎?

是的。只要一個操作數是一個指針而另一個是算術,a[b]就相當於*(a+b),所以指針或索引是否在[]的內部都沒關係。

如果是,是從彙編尋址模式派生的嗎?

幾乎肯定不是。語法直接來自C,它最初是爲PDP系列計算機開發的,其中彙編尋址模式編寫爲1(aa)

當我嘗試[aa]1=5,編譯器會發出(錯誤)

這是因爲一個下標表達式的語法被指定爲postfix-expression [ expression ],所以在[]操作數必須出現在其他之後。

此規則是否與運算符[]重載相同?

號如果操作者已被重載然後a[b]相當於a.operator[](b),而不是b.operator[](a)