2013-07-23 2 views
4

При доступе к массиву мы используем оператор [] так:Каков правильный тип данных ввода для оператора []?

int a[5]; 
... 
a[b] = 12; 

Что такое правильный тип данных для переменной b выше?

Я обнаружил, что a[b] эквивалентно *(a + b), который заставляет меня думать, что я хотел бы b быть void* или size_t, но я не уверен.

ответ

4

Один из a и b должен быть указателем, а другой должен быть любым целым числом типа. Доказательство следует.

Поскольку a[b] идентична (*((a)+(b))) на C 2011 (n1570) 6.5.2.1 2, a и b могут быть любые типы, такие, что определено последнее выражение.

В соответствии с 6.5.3.2 2 операнд унарного оператора * должен иметь тип указателя. Следовательно, результат (a)+(b) должен иметь тип указателя.

По 6.5.6, двоичный оператор + принимает различные комбинации типов, но единственным, который дает тип указателя, является комбинация указателя и целого числа, как описано в 6.5.6. 8.

Согласно 6.5.6 8, целое число может быть добавлено к указателю, а результат имеет тип операнда указателя. В пункте 6.5.6 не делается различий относительно порядка операндов +, поэтому они могут быть в любом порядке. Таким образом, любой из a и b может быть указателем, а другой - целым числом.

+1

+1 для демонстрации. – Xaqq

+0

Я всегда предпочитаю 'int' inside' [] ', потому что его самый популярный, также' int [array] 'не так понятен, как base/index. Второй 'array [++ i]' мне понятен, но '++ i [array]' not (infect оба не одинаковы). Более того, 'i [++ array]' является ошибкой для имени массива. –

+0

Это только если вы можете предположить, что ваши массивы не огромны, что почти всегда верно (за исключением случаев, когда это не так); см. http://ewontfix.com/9/ :) – loreb

0

b известен как индекс, который является номером. Таким образом, вы можете иметь дело с ним как целое. a[b] будет получать доступ к b-му элементу массива a.

*(a + b) даст значение в (a + (b * sizeof(data type of array element)))

0

Несколько типов могут работать из-за неявного преобразования.

A char будет назначен на int. Также будет работать int или unsigned int. short или unsigned short также являются допустимыми.

Даже если a[b] такая же, как *(a + b), b не может быть указателем, потому что a уже указатель. Бинарный оператор + не принимает два указатели.

+1

Выражение 'a [b]' является законным в C, когда 'a' - любой целочисленный тип, а' ​​b' - указатель, а также наоборот. Бинарный '+' оператор принимает либо указатель, и целое число, либо целое число и указатель. –

+0

@EricPostpischil Отредактировано так теперь ясно, что я имел в виду два указателя. Ваше замечание верно, но я никогда не против. – Xaqq

5

От стандарта C (ИСО/МЭК 9899: СК2) Раздел 6.5.2.1 индексации массивов

Выражение постфикса следует выражение в квадратных скобках [] является индексируются обозначения элемент объекта массива. Определение индексного оператора [] состоит в том, что E1[E2] идентичен (*((E1)+(E2))). Из-за правило преобразования, которые применяются к бинарному оператору +, если E1 является объект массива (что эквивалентно, указатель на начальный элемент объекта массива) и Е2 представляет собой целое число, E1[E2] обозначает E2-th элемента E1 (с нуля).

+0

Гипотетически, долгая работа? Или это будет отлито от целого? – zztops

+0

@zztops: Любой целочисленный тип будет работать, включая 'long'. –

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