Массив — это группа переменных одного типа, расположенных в памяти рядом и имеющих общее имя. Каждая ячейка массива имеет уникальный индекс (как правило, это номер элемента).
Элемент массива – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:
- адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
- индексом элемента (порядковым номером элемента в массиве);
- значением элемента.
Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.
ДлинаМассива = РазмерЭлемента * КоличествоЭлементов
Добавление и удаление элементов массива
Проще всего добавить элемент в конец массива, для этого используется метод append:
A = [1, 2, 3]
x = 5
A.append (x + 3) # получаем A = [1, 2, 3, 8]
Метод — это подпрограмма (процедура или функция), связанная с каким-то объектом. Чтобы вызвать метод, используют точечную запись: название метода записывают через точку после названия объекта.
Для того, чтобы вставить элемент в любое место массива, применяется другой метод — insert. В параметрах сначала указывается номер нового элемента в массиве, а затем — его значение:
A = [1, 2, 3]
A.insert (1, 35) # получаем A = [1, 35, 2, 3]
Для удаления элемента с известным номером используется метод pop. Если номер не указан, удаляется последний элемент. Удалённый элемент возвращается как результат работы метода:
A = [1, 2, 3]
x = A.pop(1) # получаем A = [1, 3], x = 2
x = A.pop() # теперь A = [1], x = 3
Ввод и вывод массива
Далее во всех примерах мы будем считать, что в программе создан список A, в котором хранится массив из N однотипных элементов — целых чисел. Переменная i будет обозначать индекс элемента списка (массива).
Чтобы ввести значения элементов массива с клавиатуры, нужно использовать цикл:
for i in range (N):
print ("A[", i, "]=", sep = "", end = "")
В этом примере перед вводом очередного элемента массива на экран выводится подсказка. Например, при вводе 3-го элемента будет выведено A [3]=.
Если никакое подсказки нам не нужно, создать массив из N элементов и вывести их значения можно с помощью генератора списка:
A = [ int (input () ) for i in range (N) ]
Когда весь массив вводится в одной строке, то строчку, полученную от функции input, нужно "расщепить" на части с помощью метода split:
data = input ()
s = data.split ()
или сразу:
s = input () . split ()
Например, если ввести строчку " 1 2 3 4 5", то после "расщепления" мы получим массив
["1", "2", "3", "4", "5"]
Объявление и инициализация массивов
Для объявления массива в языке Си используется следующий синтаксис:
тип имя[размерность]={инициализация};
Инициализация представляет собой набор начальных значений элементов массива, указанных в фигурных скобках, и разделенных запятыми.
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // массив a из 10 целых чисел
Если количество инициализирующих значений, указанных в фигурных скобках, меньше, чем количество элементов массива, указанное в квадратных скобках, то все оставшиеся элементы в массиве (для которых не хватило инициализирующих значений) будут равны нулю. Это свойство удобно использовать для задания нулевых значений всем элементам массива.
int b[10] = {0}; // массив b из 10 элементов, инициализированных 0
Если массив проинициализирован при объявлении, то константные начальные значения его элементов указываются через запятую в фигурных скобках. В этом случае количество элементов в квадратных скобках может быть опущено.
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках [].
Многомерные массивы
В языке Си могут быть также объявлены многомерные массивы. Отличие многомерного массива от одномерного состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном — несколькими. Примером многомерного массива является матрица.
Общая форма объявления многомерного массива
тип имя[размерность1][размерность2]...[размерностьm];
Элементы многомерного массива располагаются в последовательных ячейках оперативной памяти по возрастанию адресов. В памяти компьютера элементы многомерного массива располагаются подряд, например массив, имеющий 2 строки и 3 столбца,
int a[2][3];
будет расположен в памяти следующим образом
КоличествоСтрок * КоличествоСтолбцов = 2 * 3 = 6.
Количество байт памяти, требуемых для размещения массива, определится как
КоличествоЭлементов * РазмерЭлемента = 6 * 4 = 24 байта.
Представление строк в языке Си
В языке Си отсутствует специализированный тип данных для хранения строк. Строки в языке Си реализуются посредством массивом символов. Однако такой массив отличается от любого другого целочисленного массива тем, что последним элементом массива всегда является нуль-символ, код которого равен 0. По положению нуль-символа определяется фактическая длина строки.
Передача массива в функцию
Обработку массивов удобно организовывать с помощью специальных функций. Для обработки массива в качестве аргументов функции необходимо передать
- адрес массива,
- размер массива.
Исключение составляют функции обработки строк, в которые достаточно передать только адрес.
При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.
Если в функцию передается адрес переменной (или адрес массива), то все операции, выполняемые в функции с данными, находящимися в пределах видимости указанного адреса, производятся над оригиналом данных, поэтому исходный массив (или значение переменной) может быть изменено вызываемой функцией.