c ++, манипулируя указателем на первый элемент массива - PullRequest
1 голос
/ 14 февраля 2012

Я написал небольшой код, чтобы быстро объяснить мой вопрос:

    #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]

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

b[9] по определению *(b+9).То есть оператор массива [] суммирует индекс и указатель, а затем разыменовывает этот указатель .

Итак:

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

являются истинными утверждениями.

2 голосов
/ 14 февраля 2012
  • b является int *
  • b + 9 - это int *
  • * (b + 9) - это int
  • b [9] - это int (то же, что и выше)
  • & b [9] является целым *
  • * (& b [9]) - это int
1 голос
/ 14 февраля 2012

Оператор индексации массива включает разыменование, поэтому вам нужно использовать оператор address-of, чтобы снова получить указатель.

b[9] совпадает с *(b+9) по определению.

1 голос
/ 14 февраля 2012

b[9] - последний элемент вашего массива.

&b[9] - указатель на этот элемент.

b + 9 эквивалентен форме &b[9].

...