C ++ предоставляет структуру данных, массив , в котором хранится последовательная коллекция фиксированного размера элементов одного типа. Они используются для хранения похожих типов элементов. (Тип данных должен быть одинаковым для всех элементов.) Их можно использовать для хранения коллекций примитивных типов данных, таких как int, float, double, char и т. Д. Любого конкретного типа. Чтобы добавить к этому, массив в C или C ++ может хранить производные типы данных, такие как структуры, указатели и т. Д.
Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему элементу.
Если вы хотите следовать видео-уроку, посмотрите его ниже:
Вам также может понравиться:
Лучшие из коллекций Java [Учебники] .
Декларация массива
Чтобы объявить массив в C ++, программист указывает тип элементов и количество элементов в массиве, например:
C ++
xxxxxxxxxx
1
type Name_of_array [ arraySize ];
Это называется одномерным массивом. arraySize
должна быть целочисленной константой больше нуля, а типом может быть любой допустимый тип данных C ++. Например, чтобы объявить 5-элементный массив типа double, используйте этот оператор:
C ++
xxxxxxxxxx
1
double bal[5];
Существуют различные способы объявления массива. Это можно сделать, указав его тип и размер, инициализировав его или оба.
- Объявление массива с указанием размера
C ++
xxxxxxxxxx
1
// With recent C/C++ versions, we can also
2
// declare an array of user specified size
4
int n = 10;
6
int arr2[n];
- Объявление массива путем инициализации элементов
C ++
xxxxxxxxxx
1
// Array declaration by initializing elements
2
3
int arr[] = { 10, 20, 30, 40 }
5
// Compiler creates an array of size 4.
7
// above is same as "int arr[4] = {10, 20, 30, 40}"
- Объявление массива путем указания размера и инициализации элементов
C ++
xxxxxxxxxx
1
int arr[6] = { 10, 20, 30, 40 }
2
// above is same as "int arr[] = {10, 20, 30, 40, 0, 0}"
Преимущества массива в C / C ++:
- Произвольный доступ к элементам с использованием индекса массива.
- Используйте меньше кода, так как он создает один массив из нескольких элементов.
- Легкий доступ ко всем элементам.
- Обход массива становится проще, если использовать один цикл.
- Сортировка становится легкой, поскольку она может быть достигнута путем написания меньшего количества кода.
Недостатки массива в C / C ++:
- Позволяет ввести фиксированное количество элементов, которое определяется во время объявления. В отличие от связанного списка, массив в C не является динамическим.
- Вставка и удаление элементов могут быть дорогостоящими, поскольку необходимо управлять элементами в соответствии с новым распределением памяти.
Пример массивов:
C ++
xxxxxxxxxx
1
2
using namespace std;
4
6
int main()
8
{
10
int arr[5];
12
arr[0] = 5;
14
arr[2] = -10;
16
18
// this is same as arr[1] = 2
20
arr[3 / 2] = 2;
22
arr[3] = arr[0];
24
26
cout << arr[0] << " " << arr[1]
28
<< " " << arr[2] << " " << arr[3];
30
32
return 0;
34
}
Вывод:
C ++
xxxxxxxxxx
1
5 2 -10 5
Пример элементов хранятся в смежных местах памяти
C ++
xxxxxxxxxx
1
2
using namespace std;
4
int main()
6
{
7
int arr[5], i;
9
cout << "Size of integer in this compiler is " << sizeof(int) << "\n";
10
for (i = 0; i < 5; i++)
12
cout << "Address arr[" << i << "] is " << &arr[i] << "\n";
14
return 0;
17
}
Вывод:
C ++
xxxxxxxxxx
1
Size of integer in this compiler is 4
2
Address arr[0] is 0x7ffdb4260
4
Address arr[1] is 0x7ffdb4264
6
Address arr[2] is 0x7ffdb4268
8
Address arr[3] is 0x7ffdb426c
10
Address arr[4] is 0x7ffdb4270
Многомерные массивы
C ++ допускает многомерные массивы. Вот общая форма объявления многомерного массива -
С
xxxxxxxxxx
1
type name[size1][size2]...[sizeN];
Например, следующая декларация создает трехмерное 5. 10 4 целочисленных массива -
С
xxxxxxxxxx
1
int threedim[5][10][4];
Двумерные массивы
Простейшей формой многомерного массива является двумерный массив. Двумерный массив - это, по сути, список одномерных массивов. Чтобы объявить двумерный целочисленный массив размером x, y, вы должны написать что-то следующее:
С
xxxxxxxxxx
1
type arrayName [ x ][ y ];
Type
может быть любым допустимым типом данных C ++ и arrayName
будет допустимым идентификатором C ++.
Двумерный массив можно рассматривать как таблицу, которая будет иметь x количество строк и y количество столбцов. Двумерный массив a , который содержит три строки и четыре столбца, может быть показан следующим образом:
Каждый элемент в массиве a идентифицируется именем элемента в форме a [i] [j] , где a - это имя массива, а i и j - индексы, которые уникально идентифицируют каждый элемент в a.
Инициализация двухмерных массивов
Многомерные массивы можно инициализировать, указав значения в скобках для каждой строки. Ниже приведен массив из 3 строк, где каждая строка имеет 4 столбца.
C ++
xxxxxxxxxx
1
int a[3][4] = {
2
{0, 1, 2, 3} , /* initializers for row indexed by 0 */
4
{4, 5, 6, 7} , /* initializers for row indexed by 1 */
6
{8, 9, 10, 11} /* initializers for row indexed by 2 */
8
};
Вложенные скобки, которые указывают на предполагаемый ряд, являются необязательными. Следующая инициализация эквивалентна предыдущему примеру -
С
xxxxxxxxxx
1
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
Доступ к элементам двумерного массива
Доступ к элементу в двумерном массиве осуществляется с помощью индексов (т. Е. Индекса строки и индекса столбца массива). Например:
С
xxxxxxxxxx
1
int val = a[2][3];
Приведенный выше оператор возьмет 4-й элемент из 3-й строки массива. Вы можете проверить это на приведенной выше диаграмме.
C ++
xxxxxxxxxx
1
2
using namespace std;
4
int main () {
6
// an array with 5 rows and 2 columns.
8
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
10
// output each array element's value
12
for ( int i = 0; i < 5; i++ )
14
for ( int j = 0; j < 2; j++ ) {
16
18
cout << "a[" << i << "][" << j << "]: ";
19
cout << a[i][j]<< endl;
21
}
23
25
return 0;
27
}
Вывод:
С
xxxxxxxxxx
1
a[0][0]: 0
2
a[0][1]: 0
3
a[1][0]: 1
4
a[1][1]: 2
5
a[2][0]: 2
6
a[2][1]: 4
7
a[3][0]: 3
8
a[3][1]: 6
9
a[4][0]: 4
10
a[4][1]: 8
Как объяснялось выше, у вас могут быть массивы с любым числом измерений, хотя вполне вероятно, что большинство создаваемых вами массивов будут иметь одно или два измерения.
Указатель на массив
Скорее всего, вы не поймете эту главу, пока не разберетесь с указателями.
Итак, предполагая, что вы немного разбираетесь в указателях в C ++, давайте начнем: имя массива - это постоянный указатель на первый элемент массива. Поэтому в декларации:
C ++
xxxxxxxxxx
1
double balance[50];
balance
является указателем на &balance[0]
, который является адресом первого элемента баланса массива. Таким образом, следующий фрагмент программы присваивает p
адрес первого элемента balance
:
C ++
xxxxxxxxxx
1
double *p;
2
double balance[10];
4
p = balance;
Допустимо использовать имена массивов в качестве указателей на константы, и наоборот. Таким образом, *(balance + 4)
это законный способ доступа к данным в balance[4]
.
После того, как вы сохраните адрес первого элемента p
, вы можете получить доступ к элементам массива с помощью *p
, *(p+1)
, *(p+2)
, и так далее. Ниже приведен пример, демонстрирующий все концепции, рассмотренные выше:
Джава
xxxxxxxxxx
1
#include <iostream>
2
using namespace std;
4
6
int main () {
7
// an array with 5 elements.
9
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
11
double *p;
13
p = balance;
15
// output each array element's value
17
cout << "Array values using pointer " << endl;
19
for ( int i = 0; i < 5; i++ ) {
21
cout << "*(p + " << i << ") : ";
23
cout << *(p + i) << endl;
25
}
27
cout << "Array values using balance as address " << endl;
29
for ( int i = 0; i < 5; i++ ) {
31
cout << "*(balance + " << i << ") : ";
33
cout << *(balance + i) << endl;
35
}
37
return 0;
39
}
Вывод:
C ++
xxxxxxxxxx
1
Array values using pointer
2
*(p + 0) : 1000
4
*(p + 1) : 2
6
*(p + 2) : 3.4
8
*(p + 3) : 17
10
*(p + 4) : 50
12
Array values using balance as address
14
*(balance + 0) : 1000
16
*(balance + 1) : 2
18
*(balance + 2) : 3.4
20
*(balance + 3) : 17
22
*(balance + 4) : 50
В приведенном выше примере p
указатель на double
, что означает, что он может хранить адрес переменной типа double. Как только мы получим адрес в p, * p даст нам значение, доступное по адресу, сохраненному в p, как мы показали в приведенном выше примере.