int
могут быть объявлены как массив 5 разных переменных с именем foo: foo[5] (каждый со своим собственным идентификатором c индексом foo[i]).Например, массив, содержащий 5 целых значений int
, foo может быть представлен как:
Эти элементы нумеруются от 0 до 4, являясь 0 первым и 4 последним;Как и регулярная переменная, массив должен быть объявлен до его использования. Следовательно, массив с пятью элементами типа может быть объявлен как:
int foo [5];
ПРИМЕЧАНИЕ. Поле в квадратных скобках []
, представляющее количество элементов в массиве, должно быть постоянным выражением , так как массивы представляют собой блоки статической памяти, размер которых должен определяться во время компиляции до запуска программы.
Инициализация (присвоение значений) массивов
|
Этот оператор объявляет массив, который может быть представлен следующим образом:
количество значений между фигурными скобками {}
не должно превышать число элементов в массиве. Например, в приведенном выше примере foo
было объявлено 5 элементов (как указано числом, заключенным в квадратные скобки []
), а фигурные скобки {}
содержат ровно 5 значений, по одному для каждого элемента. Если объявлено с меньшим значением, остальные элементы устанавливаются в значения по умолчанию (что для основных типов означает, что они заполнены нулями). Например:
|
Создает такой массив:
Инициализатор может даже не иметь значений, просто привязки:
|
Это создает массив из пяти int
значений, каждый из которых инициализируется нулевым значением.
Когда инициализация значений предоставляется для массива, C ++ позволяет оставлять квадратные скобки пустыми []
. В этом случае компилятор автоматически примет размер массива, который соответствует числу значений, заключенных между фигурными скобками {}
:
|
После этого объявления массив foo
будет иметь int
длину 5 , так как мы предоставили 5 значений инициализации.
Наконец, эволюция C ++ привела к принятию универсальной инициализации также для массивов. Следовательно, больше нет необходимости в знаке равенства между объявлением и инициализатором. Оба эти утверждения эквивалентны:
int foo[] = { 10, 20, 30 };
int foo[] { 10, 20, 30 };
Доступ к значениям массива
name[index]
После предыдущих примеров, в которых
foo
было 5 элементов, и каждый из этих элементов имел тип int
, имя, которое может использоваться для обозначения каждого элемента, следующее:
Например, следующий оператор сохраняет значение 75 в третьем элемент
foo
:
|
и, например, следующее копирует значение третьего элемента foo
переменной x
:
|
Следовательно, выражение foo[2]
само по себе является переменной типа int
.
Обратите внимание, что foo
указан третий элемент foo[2]
, так как первый из них foo[0]
, второй foo[1]
, и, следовательно, третий foo[2]
. По этой же причине последний элемент foo[4]
. Поэтому, если мы пишем foo[5]
, мы будем обращаться к шестому элементу foo
и, следовательно, фактически превышать размер массива.
На этом этапе важно четко различать два использования скобок []
связаны с массивами. Они выполняют две разные задачи: первая – указать размер массивов при их объявлении; а вторая – указывать индексы для конкретных элементов массива при их доступе.
|
|
Основное отличие состоит в том, что объявлению предшествует тип элементов, а в доступе – нет.
Некоторые другие действительные операции с массивами:
|
|
Например:
|
|
12206 |
result += foo[n]; // равнозначно result = result + foo[n]; в первом случае сокращенная запись
Многомерные массив
многомерный массив | ||||||
---|---|---|---|---|---|---|
Многомерные массивы можно охарактеризовать как «массивы массивов». Например,
двумерный массив можно представить в виде двумерной таблицы, состоящей из
элементов, одного и того же типа данных, с одним именем и разными индексами
(типа "морского боя").
способ ссылки на второй элемент по вертикали и четвертый по горизонтали в выражении:
Присвоение значений в двумерном массиве: #define WIDTH 5 |
Код не выводит массив на экране, но присваивают значения блоку памяти, называемому jimmy, следующим образом:
Обратите внимание, что код использует определенные константы для ширины и высоты вместо использования непосредственно их числовых значений. Это дает коду лучшую читаемость и позволяет легко изменять код в одном месте.
==================================================================
Массивы как параметры*
|
|
Эта функция принимает параметр int
вызываемого типа «массив » arg
. Чтобы передать этой функции массив, объявленный как:
|
достаточно было бы написать такой вызов:
|
Здесь у вас есть полный пример:
|
|
5 10 15 2 4 6 8 10 |
В приведенном выше коде первый параметр ( int arg[]
) принимает любой массив, элементы которого имеют тип int
, независимо от его длины. По этой причине мы включили второй параметр, который сообщает функции длину каждого массива, который мы передаем ему в качестве первого параметра. Это позволяет циклу for печатать массив, чтобы знать диапазон для итерации в переданном массиве, не выходя за пределы диапазона.
В объявлении функции также можно включать многомерные массивы. Формат для трехмерного параметра массива:
|
Например, функция с многомерным массивом в качестве аргумента может быть:
|
Обратите внимание, что первые скобки []
оставлены пустыми, а следующие определяют размеры для соответствующих размеров. Это необходимо для того, чтобы компилятор мог определить глубину каждого дополнительного измерения.
В некотором смысле передача массива как аргумента всегда теряет измерение. Причина в том, что по историческим причинам массивы не могут быть скопированы напрямую, и, следовательно, то, что действительно передается, является указателем. Это общий источник ошибок для начинающих программистов. Хотя ясное понимание указателей, объясняемое в грядущей главе, очень помогает.
Библиотечные массивы
<array>
.Контейнеры представляют собой библиотечную функцию, выходящую за рамки данного руководства, и, следовательно, этот класс не будет подробно описан здесь. Достаточно сказать, что они работают аналогично встроенным массивам, за исключением того, что они позволяют копировать (фактически дорогостоящая операция, которая копирует весь блок памяти и, следовательно, будет использоваться с осторожностью) и распадаться на указатели только тогда, когда явно сказал сделать это (через своего члена data
).Как пример, это две версии одного и того же примера с использованием встроенного в язык массива, описанного в этой главе, и контейнера в библиотеке:
встроенный язык | контейнерная библиотека |
---|---|
#include <iostream> using namespace std; int main() { int myarray[3] = {10,20,30}; for (int i=0; i<3; ++i) ++myarray[i]; for (int elem : myarray) cout << elem << '\n'; } |
#include <iostream> #include <array> using namespace std; int main() { array<int,3> myarray {10,20,30}; for (int i=0; i<myarray.size(); ++i) ++myarray[i]; for (int elem : myarray) cout << elem << '\n'; } |
Как вы можете видеть, оба вида массивов используют один и тот же синтаксис для доступа к его элементам: myarray[i]
. Помимо этого, основные отличия заключаются в объявлении массива и включении дополнительного заголовка для массива библиотеки . Обратите внимание также, как легко получить доступ к размеру массива библиотеки .