2012-02-14 70 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)相同。