Массивы (C++)

Массив — это коллекция похожих объектов. Простейший пример массива — вектор, который может быть объявлен следующей последовательностью:

decl-specifier identifier [ constant-expression ]
decl-specifier identifier []
decl-specifier identifer [][ constant-expression] . . .
decl-specifier identifier [ constant-expression ]
[ constant-expression ] . . .

1. Спецификатор объявления:

  • Необязательный спецификатор класса хранения.

  • Необязательные спецификаторы const и (или) volatile.

  • Имя типа элементов массива.

2. Декларатор:

  • Идентификатор.

  • Константное выражение целочисленного типа, заключенное в квадратные скобки []. Если с помощью дополнительных квадратных скобок объявляется несколько измерений, константное выражение в первом наборе квадратных скобок может быть опущено.

  • Необязательные дополнительные квадратные скобки для константных выражений.

3. Необязательный инициализатор. См. раздел Инициализаторы.

Количество элементов в массиве задается константным выражением. Первым элементом массива является нулевой элемент, а последним — элемент n-1, где n — количество элементов, которые могут входить в массив. Константное-выражение должно быть целочисленного типа и больше 0. Массив нулевого размера допустим, только если он является последним полем в struct или union и включены расширения Microsoft (/Ze).

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

// arrays.cpp
// compile with: /EHsc
#include <iostream>

int main() {
   using namespace std;
   int size = 3, i = 0;

   int* myarr = new int[size];

   for (i = 0 ; i < size ; i++)
      myarr[i] = 10;

   for (i = 0 ; i < size ; i++)
      printf_s("myarr[%d] = %d\n", i, myarr[i]);

   delete [] myarr;
}

Массивы — это производные типы, поэтому они могут создаваться из любого другого производного или базового типа, кроме функций, ссылок и типа void.

Массивы, созданные из других массивов, являются многомерными. Такие многомерные массивы определяются путем последовательного размещения нескольких константных выражений, заключенных в квадратные скобки. Рассмотрим, например, следующее объявление:

int i2[5][7];

Оно определяет массив типа int, по существу размещенный в двумерной матрице, состоящей из пяти строк и семи столбцов, как показано на следующем рисунке.

Концептуальная раскладка многомерного массива

Концептуальная структура многомерного массива

В объявлениях многомерных массивов, содержащих список инициализаторов (см. раздел Инициализаторы), константное выражение, определяющее границы первого измерения, можно опустить. Например:

// arrays2.cpp
// compile with: /c
const int cMarkets = 4;
// Declare a float that represents the transportation costs.
double TransportCosts[][cMarkets] = { 
   { 32.19, 47.29, 31.99, 19.11 },
   { 11.29, 22.49, 33.47, 17.29 },
   { 41.97, 22.09,  9.76, 22.55 }
};

В показанном выше объявлении определяется массив, состоящий из трех строк и четырех столбцов. Строки представляют фабрики, а столбцы — рынки, на которые фабрики поставляют свою продукцию. Значения — это стоимости транспортировки с фабрик на рынки. Первое измерение массива опущено, но компилятор заполняет его, проверяя инициализатор.

Подразделы в этом разделе:

Пример

Метод пропуска определения границ первого измерения многомерного массива можно также использовать в объявлениях функций следующим образом.

// multidimensional_arrays.cpp
// compile with: /EHsc
// arguments: 3
#include <limits>   // Includes DBL_MAX
#include <iostream>

const int cMkts = 4, cFacts = 2;

// Declare a float that represents the transportation costs
double TransportCosts[][cMkts] = { 
   { 32.19, 47.29, 31.99, 19.11 },
   { 11.29, 22.49, 33.47, 17.29 },
   { 41.97, 22.09,  9.76, 22.55 }  
};

// Calculate size of unspecified dimension
const int cFactories = sizeof TransportCosts /
                  sizeof( double[cMkts] );

double FindMinToMkt( int Mkt, double myTransportCosts[][cMkts], int mycFacts);

using namespace std;

int main( int argc, char *argv[] ) {
   double MinCost;

   if (argv[1] == 0) {
      cout << "You must specify the number of markets." << endl;
      exit(0);
   }
   MinCost = FindMinToMkt( *argv[1] - '0', TransportCosts, cFacts);
   cout << "The minimum cost to Market " << argv[1] << " is: "
       << MinCost << "\n";
}

double FindMinToMkt(int Mkt, double myTransportCosts[][cMkts], int mycFacts) {
   double MinCost = DBL_MAX;

   for( int i = 0; i < cFacts; ++i )
      MinCost = (MinCost < TransportCosts[i][Mkt]) ?
         MinCost : TransportCosts[i][Mkt];

   return MinCost;
}
  

Комментарии

Функция FindMinToMkt создана таким образом, что для добавления новых фабрик не требуется никаких изменений в коде, необходима только перекомпиляция.

См. также

Ссылки

Абстрактные деклараторы в C++