Арифметика указателей - PullRequest
2 голосов
/ 18 апреля 2010

Имея код:

int** a = new int*[2];
a[0] = new int(1);
a[1] = new int(2);
cout << "a[0] " << a[0] << '\n';
cout << "a[1] " << a[1] << '\n';
cout << "a[2] " << a[2] << '\n';
cout << "a[0] + 1 " << a[0] + 1 << '\n';//WHY THIS ISN'T == a[1] ?
cout << "*(a + 1): " << *(a + 1) << '\n'; //WHY THIS IS == a[1] ?
cout << "a[0] - a[1] " << static_cast<int>(a[0] - a[1])<< '\n';//WHY THIS IS == 16 not 4?

cout << sizeof(int**);

Вопросы включены в код рядом с соответствующими строками.

Ответы [ 4 ]

9 голосов
/ 18 апреля 2010

a[0] + 1 означает, что 1 добавляется к значению, сохраненному в a[0]

*(a + 1) означает, что 1 * sizeof(int) добавляется к адресу памяти a, а затем осуществляется доступ к значению в этом месте, что означает, что вы получите a[1]

Подробнее об указателях здесь .

Что касается вашего последнего вопроса, нет гарантии, что он напечатает какое-либо конкретное значение, так как два адреса памяти не должны быть смежными. Для меня это печатает -4 например.

5 голосов
/ 18 апреля 2010

a[0] и a[1] являются смежными, и они оба являются указателями, но они не указывают на смежные области памяти.

Это потому, что указатели памяти, возвращаемые оператором new, фактически непредсказуемы.

Другими словами, нет никакой гарантии (фактически, совсем противоположной), что куски памяти, возвращаемые

a[0] = new int(1);
a[1] = new int(2);

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

1 голос
/ 18 апреля 2010
  1. Вы берете значение в нулевой позиции и добавляете к нему 1.
  2. Вы берете начало массива, передвигаете указатель на один размер указателя int и принимаете значение, на которое указывает указатель, равное [1].
  3. Это может быть что угодно. Вы вычитаете по разным адресам и приводите его к int.
1 голос
/ 18 апреля 2010

a[0] + 1 получить доступ к первому элементу в a и добавить 1.

a[1] доступ ко второму элементу в.

*(a + 1) является синонимом a[1].

static_cast<int>(a[0] - a[1]) вычитает второй элемент из a из первого элемента в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...