Добавление на указатель массива - PullRequest
0 голосов
/ 21 октября 2018

Итак, я недавно столкнулся с чем-то, что не очень интуитивно для меня и немного смутило меня.Если я выделю массив в куче следующим образом:

uint32_t* Array = new uint32_t[5];

, а затем попытаюсь добавить определенное количество байтов к указателю массива следующим образом:

Array + 3

результат будетбыть Array + sizeof(uint32_t) * 3 вместо Array + 3.

Почему это делается?

1 Ответ

0 голосов
/ 21 октября 2018

Аддитивные операторы (§7.6.6 / 4) [expr.add] / 4 :

Когда выражение J имеет целочисленный типдобавляется или вычитается из выражения P типа указателя, результат имеет тип P .

  1. Если P оценивает значение нулевого указателя и J оценивает 0, результатом является значение нулевого указателя .
  2. В противном случае, если P указывает на элемент x [i] объекта массива x с n элементами, выражениями P + J и J + P (где J имеет значение j ) указывают на (возможно, гипотетический) элемент x [i + j] если 0 ≤ i + j ≤ n , а выражение P - J указывает на (возможно, гипотетический) элемент * x [i - j] if 0 ≤ i - j ≤ n .
  3. В противном случае поведение не определено.

Подписка(§7.6.1.1 / 1) [expr.sub] / 1

Выражение postfix, за которым следует выражение в квадратных скобках, является выражением postfix.Одно из выражений должно быть glvalue типа «массив T» или prvalue типа «указатель на T», а другое должно быть prvalue перечисления с незаданной областью или целочисленного типа.Результат имеет тип «T».Тип «Т» должен быть полностью определенным типом объекта.Выражение E1 [E2] идентично (по определению) * ((E1) + (E2)) , за исключением того, что в случае операнда массива результатом являетсяlvalue, если этот операнд является lvalue и xvalue в противном случае.Выражение E1 упорядочено перед выражением E2 .

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