2012-02-14 83 views
1

我寫了一個小碼,以便快速解釋我的問題數組的第一個元素:C++,操縱指針

#include<iostream> 
    using namespace std; 

    int main() 
    { int a [10] = { 200, 60, 100, 70, 0, 0, 105, 400, 450, 30}; 
     int *b = &a[0]; 
     int *c = &a[9]; 
     int *d = b+9; 

     cout<<&b[9]<<endl 
     <<c<<endl 
     <<d<<endl; 
    return 0; 
    } 

我不明白,爲什麼我不得不使用運營商的地址的得到相同的結果。更具體地說,不應該b[9](而不是&b[9])等於&a[9]b+9?我很困惑,因爲b已經被定義爲一個指針,b [9]也應該是一個,它對我來說是有意義的,因爲它指向與b+9相同的地址。

而在我的例子中,b[9]究竟代表什麼?

+0

b [9]指向a [9]。 b和b [0]一樣指向a [0]。當您將一個下標放在指針上時,下標將被添加到指針中。當你加載一個指針時,這就是你使用address-of操作符的時候。 (只是爲了進一步混淆事物,int * 0 [b]也指向一個[0]。) – 2012-02-14 19:42:30

+0

@PeteWilson:b [9]並不真正指向任何東西,因爲指針指向的是事物。 – 2012-02-14 19:51:27

回答

2
  • b爲INT *
  • B + 9爲int *
  • *(B + 9)爲int
  • B [9] INT(與上述相同)
  • & b [9]爲int *
  • *(& b [9])爲int
+0

b [9]如何成爲int&b [9]?如果你在上面的腳本中替換它,b [9]和&b [9]是兩個不同的東西。令人困惑的是,它是&b [9]指向原始數組a的最後一個元素,而不是b [9]。 – 2012-02-14 19:37:46

+0

b [9]是int,&b [9]是int *; p [i]與*(p + i)相同 – 2012-02-14 19:38:49

2

b[9]是,根據定義,*(b+9)。也就是說,數組運算符[]將索引和指針相加,然後解除引用指針

所以:

b[9] == a[9] 
b+9 == &(a[9]) 

都是真實的陳述。

+0

這就是我錯過的。感謝您澄清它。 – 2012-02-14 21:16:41

1

b[9]是數組的最後一個元素。

&b[9]是一個指向這個元素的指針。

b + 9相當於&b[9]的形式。

1

數組下標運算符包含一個解引用,這就是爲什麼您需要使用address-of運算符來再次獲取指針。

b[9]根據定義與*(b+9)相同。