2014-09-21 4 views
1

конвертации 8.3.4/8 N3797:указатель на массив

[Пример:

рассмотреть int x[3][5];

Здесь x представляет собой массив целых чисел 3 × 5. Когда в выражении появляется x, оно преобразуется в указатель на ( первый из трех) пятичленных массивов целых чисел. В выражении x[i], которое эквивалентно *(x+i), x сначала преобразуется в указатель , как описано; затем x+i преобразуется к типу x, который включает в себя умножения i по длине объекта, на который указывает указатель, а именно пять целочисленных объектов [...]

Поскольку тип x является «массивом из 3 массивов из 5 целых чисел», мы также имеем x + i. Предположим, что i = 2;

Какое значение x + i (Call him arr) элементов после преобразования в массив из 3 массивов из 5 целых чисел? Я имею в виду, что arr[3] равно?

+0

Вы сделали этот вопрос довольно нескюрером, ИМО. 'x + i' является' int (*) [5] ', это значение (при разыменовании) является объектом массива в i-м индексе. – jrok

+0

@jrok Я согласен, что 'x + i' имеет тип' int (*) [5] '. Но в стандарте указано, что _ then x + i преобразуется в тип x_, то есть к типу 'int [3] [5]', который сам может быть неявно преобразован в 'int (*) [5]' через array- to-pointer-conversion (раздел 4.2 стандарта). –

+0

Не могли бы вы пересмотреть стандартную ссылку? 3.8 - «Время жизни объекта», и нет 3.8.4. – jrok

ответ

0

arr[3] представляет собой массив из пяти целых чисел. Причина заключается в следующем:

Когда х появляется в выражении, он преобразуется в указатель (The первых из трех) пятичленных массивов целых чисел

это означает, что любое использование arr в выражении приведет к типу int(*)[5] (затухает).

Для x[3], что эквивалентно *(x+i), вы сначала получаете х переводится в тип int(*)[5] и продвигать его, то вы разыменовать (помните *), что указатель и таким образом получить тип int[5].

К сожалению, указатель указал на недопустимое место памяти, и поэтому любая операция в этом массиве из пяти целых чисел является неопределенным поведением/нарушением прав доступа.

Я согласен с тем, что этот отрывок действительно не ясен об этом, кажется, что два предложения одно перед другим (также неясное).

Я бы перефразировать как:

Здесь х представляет собой 3 × 5 массив целых чисел. Когда x появляется в выражении, преобразуется в указатель на (первый из трех) пятичленных массивов целых чисел.В выражении x [i], которое эквивалентно * (x + i), x сначала преобразуется в указатель, как описано; после приращения указателя x + i (который побайтно включает в себя умножение i на длину объекта, на который указывает указатель, а именно пять целых объектов), x + 1 преобразуется в тип, обозначенный x [...]

+0

Но тип 'x' не является массивом из 5 целых чисел. Это массив из 3 массивов из 5 целых чисел. –

+0

@DmitryFucintv Тип x после разложения является ** указателем на массив из 5 целых чисел **. –

+0

Насколько я понял, вы сначала выполняете преобразование 'int (*) [5]' в 'int [3] [5]', а затем с помощью преобразования array-to-pointer выполняете 'int [3] [5] '--->' int (*) [5] 'снова. Правильно? –

Смежные вопросы