2015-01-23 8 views
1

Является ли массив типом данных или он является указателем на его первый элемент?Является ли массив типом данных?

+4

Нет, это не вопрос мнения. Массив ** не ** указатель. –

+0

@DrewDormann id -> is –

+0

Массив не является указателем или типом данных. –

ответ

8

Вы спрашиваете о двух разных языках, C и C++. У них, как правило, есть те же правила в этой области (в основном), но важно помнить, что это два разных (но тесно связанных) языка.

Это также зависит от того, что вы подразумеваете под «массивом». Часто лучше думать о слове «массив» как о прилагательном, а не о существительном; таким образом, вы можете иметь массив тип, массив объект (объект типа массива), массив выражение (выражение типа массива) и т. д.

Стандарты C и C++ не определяют фразу «тип данных», хотя оба стандарта используют эту информацию неофициально несколько раз. Учитывая контекст, достаточно ясно, что фраза «тип данных» является синонимом «типа объекта».

C имеет два типа типов, типы объектов и типы функций. (До стандарта C11, неполные типы были третьим видом, определение, были изменены в 2011 году, так неполных типов являются подмножеством типов объектов.)

Массива типа является типом объекта (и нет, это не вопрос мнения).

Если вам сказали, что массив «действительно» является указателем на его первый элемент, вы были плохо дезинформированы. Выражение массива неявно конвертировало в большинстве, но не во всех контекстах, указателю на первый элемент массива. Объект массива все еще существует, по-прежнему является объектом и по-прежнему имеет тип массива.

Предлагаемое чтение: Раздел 6 раздела comp.lang.c FAQ.

1

Массив - это тип. Его можно назвать типом соединения или типом массива (C++ стандарт, §3.9.2):

типа соединения может быть построен следующим образом:
- массивы объектов данного типа, (8.3 .4)

где (§8.3.4) есть, курсив мой:

В декларации TD где D имеет вид

D1 [ constant-expressionopt] attribute-specifier-seqopt 

и тип идентификатора объявления T D1 является «производного описатель-типа списокT», то тип идентификатора D является типом массива;

И, как и любой другой тип, вы можете использовать его в typedef.Из того же раздела:

typedef int A[5], AA[2][3]; 
typedef const A CA; // type is “array of 5 const int” 
typedef const AA CAA; // type is “array of 2 array of 3 const int” 

Объект типа массива может быть неявно к указателю, следовательно, потенциальное замешательство:

void foo(int*); 
A some_array; 

foo(some_array);  // OK 
int* p = some_array; // OK 
1

является массив из данных type или это указатель на его первый элемент?

Это тип данных, и это не указатель.

Вот источник этой общей путаницы.

  • Массив может быть неявно преобразуется в указатель на первый элемент (но не наоборот)
  • указатель разделяет некоторые синтаксические сходства с массивами (а именно «[]»), так что это не всегда очевидным для новичков, когда произошел неявный бросок.
+1

На самом деле для оператора '[]' требуется операнд указателя и целочисленный операнд. Указатель должен указывать на элемент объекта массива. '[]' определяется в терминах арифметики указателя: 'a [i]' означает '* (a + i)' –

1

Собственно массив в экземпляра объекта, имеющего тип массива. Поэтому массивы имеют тип, а не являются типами.

В то время как массивы имеют тип (и являются примером структуры контейнера данных), это, возможно, полезно, чтобы понять, что в C и C++, в отличие от основных типов, и class/struct/union типов, они не рассматриваются как first-class data types в том, что они не могут быть переданы как параметры по значению, возвращены по значению или назначены или из.

Массив не то же самое, как указатель - массив в C и C++ имеет размер, равное числу элементов, умноженное на размер каждого элемента, в то время как указатель является размер указателя, а не размер которого он имеет в виду. Однако, поскольку массив не является первоклассным типом, когда он передан, возвращен или назначен, массив «распадается» на указатель.

C++ STL поддерживает различные типы структуры данных контейнеров, которые являются более гибкими и обычно более безопасными, чем необработанные массивы, и являются типами первого класса.

+0

Тип массива * явно является типом как в C, так и в C++. Существуют только некоторые ограничения на то, какие операции доступны для объектов и выражений типа массива. –

+0

@KeithThompson: В самом деле - я изменил ответ, я не думаю, что я сказал что-то другое, но ваша точка не была подчеркнута. – Clifford

+0

* Все типы * являются «структурами данных»; Я не думаю, что подчеркнуть, что это полезно. Итог: типы массивов являются типами. Все типы ограничены в действиях, которые вы можете применить к ним. –

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