Similar presentations:
Статические массивы. Связь массивов и указателей
1.
ИнформатикаСтатические массивы. Связь
массивов и указателей.
2.
Статические массивыМассив – конечная именованная последовательность
однотипных величин. Элементы массива в памяти
расположены линейно и непрерывно.
Статический (встроенный) массив – массив, число
элементов которого определено на этапе компиляции.
При этом память под элементы отводится в стэке
(для локальных переменных) или в статической (для
глобальных переменных) памяти.
2
3.
Статические массивыНапоминание:
Статические массивы, как и любая другая
локальная переменная, уничтожаются при выходе
из блока кода, где они объявлены.
3
4.
Объявление массиваОбъявление:
type arr_name[N];
type – тип элементов массива;
N – число элементов (неотрицательное целое
число). На этапе компиляции N должно быть
определено.
4
5.
Объявление массиваМассивы могут быть многомерными:
type arr_name[N][M]…[K];
При этом значения всех размерностей должны
быть определены на этапе компиляции.
5
6.
Инициализация массиваИнициализация массива может быть проведена
следующим образом:
type arr[N] = {a0, a1, …, aM};
где M ≤ N – 1.
Если M < N, то оставшиеся элементы
инициализируются нулевыми значениями
(значениями по умолчанию для типа type).
6
7.
Инициализация массиваint arr1[5] = {1, 2, 3, 4, 5};
1 2 3 4 5
int arr2[5] = {1, 2};
1 2 0 0 0
int arr3[5] = {0};
0 0 0 0 0
7
8.
Инициализация массиваМногомерные массивы могут быть инициализированы с
указанием подмассивов. При этом элементы, входящие в
определенный подмассив группируются посредством
фигурных скобок:
type arr1[N][M]={
{a00, a01, a02},
{a10, a11, a12, a13}
};
Инициализация начинает с младшей размерности. При
этом оставшиеся элементы будут также инициализированы
нулевыми значениями (значениями по умолчанию для типа8
type).
9.
Инициализация массиваМногомерный массив также может быть
инициализирован аналогично одномерному. При
этом элементы массива инициализируются
последовательно.
type arr1[N][M] = {a0, a1, a2, a3, a4, a5};
Массив имеет размерность N строк и M столбцов.
9
10.
Статические массивыint arr1[3][2] = { {1}, {2, 3}, {4, 5} };
1 0
2 3
4 5
int arr2[3][2] = { 1, 2, 3, 4, 5 };
1 2
3 4
5 0
10
11.
Статические массивыОбратиться к элементам массива можно посредством
индексов:
type arr[N];
type val = arr[5];
arr[0] = val;
type arr2D[M][N];
type val = arr2D[0][3];
arr2D[3][1] = val;
Нумерация элементов массива начинается с нуля.
Выход за границы массива не проверяется.
11
12.
Связь массива и указателяЭлементы статических массивов, в том числе
многомерных, располагаются в памяти последовательно
и непрерывно.
Имя одномерного массива компилятор интерпретирует
как указатель на первый элемент (т.е. с индексом 0).
Имя двумерного массива интерпретируется как
указатель на нулевую строку (одномерный подмассив),
имя трехмерного – как указатель на нулевой двумерный
подмассив и т.д.
12
13.
Связь массива и указателяtype arr[N];
Адрес i-го элемента может быть вычислен по
формуле:
address = arr + i*sizeof(type);
13
14.
Связь массива и указателяЕсли говорить словами, то:
индекс элемента массива – смещение
относительно начала массива, кратное размеру
типа.
14
15.
Связь массива и указателяСледовательно, к элементам массива можно
обращаться посредством указателя:
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
for(int i = 0; i < 5; i++){
std::cout << *ptr << “ ”;
ptr++;
}
1, 2, 3, 4, 5
15
16.
Связь массива и указателяint arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
*(ptr+2) = 7;
ptr[2] = 7
arr = {1, 2, 7, 4, 5}
16
17.
Связь массива и указателяС указателем может также использоваться
оператор [].
type* ptr = &arr[0]; // &arr[0] = arr
ptr[N] = val;
При этом происходит доступ к элементу,
смещенному на N*sizeof(type) байт относительно
адреса, на который указывает ptr.
17
18.
Связь массива и указателяint arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
ptr[2] = 7;
arr[2] = 7
arr = {1, 2, 7, 4, 5}
18
19.
Расположение элементов в памятиЭлементы статических массивов, в том числе
многомерных, располагаются в памяти
последовательно и непрерывно.
19
20.
Расположение элементов в памятиint arr3D[4][3][2] = {{
{
{
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
{ 7, 8 },
{ 9, 10 },
{ 11, 12 }
{ 13, 14 },
{ 15, 16 },
{ 17, 18 }
{ 19, 20 },
{ 21, 22 },
{ 23, 24 } }
},
},
},
};
20
21.
Расположение элементов в памятиНулевой двумерный
подмассив [3][2]
XXX
1
2
3
4
5
6
7
…
21
22
23
24
XXX
Нулевой одномерный
подмассив размерностью 2
21
22.
Расположение элементов в памятиПоскольку элементы массивов, в том числе и
многомерных, располагаются в памяти
последовательно, то любой многомерный
статический массив может быть интерпретирован
как одномерный массив с размерностью, равной
произведению размерностей соответствующего
многомерного массива.
22
23.
Расположение элементов в памятиint arr3D[4][3][2] = {{
{
{
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
{ 7, 8 },
{ 9, 10 },
{ 11, 12 }
{ 13, 14 },
{ 15, 16 },
{ 17, 18 }
{ 19, 20 },
{ 21, 22 },
{ 23, 24 } }
},
},
},
};
23
24.
Расположение элементов в памятиint* ptr = &arr3D[0][0][0]; //
адрес первого
элемента
for(int i = 0; i < 4*3*2; i++){
std::cout << *ptr << “ ”;
ptr++;
}
1 2 3 4 5 6 7 8 9 10 11 … 21 22 23 24
24
25.
Расположение элементов в памятиДля вычисления адреса элемента трехмерного
массива с индексами i, j и k используется
следующая формула:
type arr[N][M][L];
address = &arr[0][0][0] +
i*M*L*sizeof(type) + j*L*sizeof(type) +
k*sizeof(type);
25
26.
Расположение элементов в памятиЕсли доопределить MN как 1, то для N-мерного
массива формула для N > 1 имеет вид:
type arr[M0][M1]…[MN-1];
&arr[k0][k1]…[kN-1] = &arr[0]…[0] +