- •Массив — это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип.
- •Массивы. Синтаксис объявления и доступ к элементам массива
- •Размерность массивов предпочтительнее задавать с помощью типизированных констант.
- •Основные свойства массивов
- •Массив констант
- •Массивы и параметры
Массив констант
Как уже известно, имя массива является константным указателем. Именно поэтому и невозможно копирование массивов с помощью простого оператора присвоения. Константный указатель "охраняет" область памяти, выделенную для размещения данного массива. При этом значения элементов массива можно изменять в ходе выполнения программы. Защитить их от изменения можно с помощью дополнительного спецификатора типа const. При этом массив должен быть проинициализирован непосредственно в момент определения:
const int cIntArray[] = {0,1,2,3,4,5,6,7,8,9};
Это аналог константного указателя на массив констант. Попытки изменения значения элементов массива пресекаются на этапе компиляции.
cIntArray[5] = 111; // Ошибка.
А вот от скрытого изменения значения элементы массива констант уберечь не удается.
const char cCH[] = "0123456789";
char CH[] = "0123456789";
CH[15] = 'X';
/* Выполнение этого оператора ведет к изменению строки cCH. */
cout << cCH << endl;
Транслятор не занимается проверкой корректности выполняемых операций. На этапе выполнения программы язык C++ не предоставляет никаких средств защиты данных.
ПРИМЕР
В следующем примере подсчитывается сумма элементов массива.
#include <iostream.h>
int main(){
const int n = 10;
int marks[n] = {3, 4, 5, 4, 4};
for (int i = 0, sum = 0; i<n; i++) sum += marks[i];
std::cout << "Сумма элементов: " << sum;}
МНОГОМЕРНЫЙ МАССИВ
Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы.
Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности.
int MyArray1[10]; // Одномерный массив размерности 10.
int MyArray2[20][10]; // 20 одномерных массивов размерности 10.
int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10.
По крайней мере, для Borland C++ 4.5, элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы
MyArray1[0],
MyArray2[0][0],
MyArray3[0][0][0],
затем элементы
MyArray1[1],
MyArray2[0][1],
MyArray3[0][0][1]
и т.д.
Многомерный массив подобно одномерному массиву может быть проинициализирован с помощью списка инициализаторов. Первыми инициализируются элементы с самыми маленькими индексами:
int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};
Начальные значения получают следующие элементы трехмерного массива:
MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[0][0][2] == 2
MyArray[0][1][0] == 3
MyArray[0][1][1] == 4
MyArray[0][1][2] == 5
MyArray[0][2][0] == 6
MyArray[0][2][1] == 7
MyArray[0][2][2] == 8
MyArray[1][0][0] == 9
MyArray[1][0][1] == 10
MyArray[1][0][2] == 11
Остальные элементы массива получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементам присваиваются неопределенные значения).
Дополнительные фигурные скобки в инициализаторе позволяют инициализировать отдельные фрагменты многомерного массива. Каждая пара фигурных скобок специфицирует значения, относящиеся к одной определенной размерности. Пустые фигурные скобки не допускаются (и это означает, что в C++ реализован жесткий алгоритм инициализации массивов):
int MyArray[3][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100},{3000,3100,3200}}
};
В результате выполнения этого оператора определения будут означены следующие элементы массива MyArray:
MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[1][0][0] == 100
MyArray[1][1][0] == 200
MyArray[1][1][1] == 210
MyArray[1][2][0] == 300
MyArray[2][0][0] == 1000
MyArray[2][1][0] == 2000
MyArray[2][1][1] == 2100
MyArray[2][2][0] == 3000
MyArray[2][2][1] == 3100
MyArray[2][2][2] == 3200
По аналогии с одномерным массивом, при явной инициализации массива входящего в состав многомерного массива его самая левая размерность может не указываться. Она определяется на основе инициализатора.
int MyArray[ ][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100}}
};
Транслятор понимает, что речь идет об определении массива размерности 3*3*3.
А в таком случае
int MyArray[ ][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100}},
{{10000}}
};
предполагается размерность 4*3*3. В результате MyArray оказывается массивом из четырех частично проинициализированных двумерных массивов. Следует помнить, что в C++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом.
ПРИМЕР
Программа определяет в целочисленной матрице номер строки, которая содержит наибольшее количество элементов, равных нулю.
#include <stdio.h>
int main(){
const int nstr = 4, nstb = 5;//Размерности массива
int b[nstr][nstb];
int i, j;
for (i = 0; i<nstr; i++)//Ввод массива
for (j = 0; j<nstb; j++) scanf("%d", &b[i][j]);
int istr = -1, MaxKol = 0;
for (i=0; i<nstr; i++){//Просмотр массива по строкам
int Kol = 0ж
for (j = 0; j<nstb; j++)if (b[i][j]==0)Kol++;
if (Kol>MaxKol){istr = i; MaxKol = Kol;}
}
printf(" Исходный массив:\n"); for (i = 0; i<nstr; i++){
for (j = 0; j<nstb; j++)printf("%d ", b[i][j]);
printf("\n");}
if (-1 == istr)printf("Нулевых элементов нет");
else printf("Номер строки: %d", istr);
return 0;}