Массив – набор данных одного и того же типа, обращение к которым происходит с применением общего для всех имени.
Определение массива
тип name[размер];
int Arr_1[10];
int Arr_2[] = {1,2,3};
int Arr_3[3] = {1,2,3};
int Arr_4[3] = {1,2}; Частичное определение массива. Последний элемент получает значение 0.
const k=10;
float A[k];
Доступ к элементам массива.
A[0]=1;
A[i]=i*2;//i- индекс –целое число
- Базовый элемент массива имеет индекс 0.
- Размеры массива должны быть константами.
- Индекс массива – целое число от 0 до k-1, где k- число элементов в массиве
- Обращение к элементу массива осуществляется с помощью индекса (номера) элемента.
- В языке С не проверяется выход индекса за пределы массива
Индекс может быть :
- Константой,
- Переменной,
- Выражением целого типа
- Нельзя присвоить один массив другому!!!
Если массив при объявлении не инициализирован, то его элементы имеют случайные значения.
Определение количества элементов массива:
int arr[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
cout<<sizeof(arr)/sizeof(arr[0])<<endl;
Передача в функцию одномерного массива
Использование массива как параметра функции не вызывает ни каких трудностей. Как было сказано ранее, массив в подпрограмму всегда передаётся по адресу, поэтому достаточно при вызове функции указать адрес начала массива или адрес того элемента, начиная с которого предполагается обрабатывать массив.
Пример. Написать программу, которая будет вызывать функцию для вывода на печать элементов массива.
Возможный вариант решения:
#include <iostream>
using namespace std;
void print(int x[], int n);
int main()
{
const int n = 5;
int x[n] = {3, 5, 1 ,7, 4};
print(x, n);
return 0;
}
void print(int x[], int n)
{
cout << "Massiv:" << endl;
for(int i = 0; i < n; i++)
cout << x[i] << endl;
}
При вызове функции оператором print(x, n); в неё передаётся адрес начала массива x и количество элементов n. Количество элементов n передаётся по значению и здесь всё должно быть понятно, но вот с передачей самого массива может быть некоторое непонимание, которое необходимо устранить.
Итак, массив в функцию должен передаваться по адресу, и нам необходим в подпрограмме весь массив, поэтому логично вызов функции записать так:
print(&x[0], n);
С учётом того, что массив в подпрограмму чаще всего передаётся весь и с начала, разработчики языка запись вида &x[0] сократили до x, т.е. обращение к массиву по имени эквивалентно обращению по адресу к элементу с индексом 0.
В заголовке функции void print(int x[], int n) // 1-й вариант
два формальных параметра. Запись x[] говорит о том, что в подпрограмму передаётся именно массив. Заголовок может выглядеть и так:
void print(int *x, int n) // 2-й вариант
Массив передаётся по адресу, поэтому и записываем первый параметр как адрес на объект типа int. Этот объект-указатель принимает адрес того элемента массива, который вычисляется в вызывающей функции (например, в main()).
Компилятор рассматривает 1-й вариант как эквивалент 2-го, хотя для человека нагляднее именно 1-й вариант. По нему видно, что формальный параметр — это именно массив, а не указатель, например, на одиночный элемент.
Трактовка при вызове x как &x[0] позволяет при необходимости передать в подпрограмму не весь массив, а только его часть, начиная с какого-либо адреса. Например, вызов
print(&x[2], n - 2);
приводит к выводу на экран монитора трёх элементов массива, начиная с элемента с индексом 2. При этом сама функция не требует каких либо доработок. В этом плане языки С/С++ гораздо удобнее многих других языков.