Найти тему
Informatics

Массивы в языке СИ

Оглавление

Массив — это группа переменных одного типа, расположенных в памяти рядом и имеющих общее имя. Каждая ячейка массива имеет уникальный индекс (как правило, это номер элемента).

Элемент массива – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:

  • адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
  • индексом элемента (порядковым номером элемента в массиве);
  • значением элемента.
Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.
Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.

Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.

ДлинаМассива = РазмерЭлемента * КоличествоЭлементов

Добавление и удаление элементов массива

Проще всего добавить элемент в конец массива, для этого используется метод 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. По положению нуль-символа определяется фактическая длина строки.

Передача массива в функцию

Обработку массивов удобно организовывать с помощью специальных функций. Для обработки массива в качестве аргументов функции необходимо передать

  • адрес массива,
  • размер массива.

Исключение составляют функции обработки строк, в которые достаточно передать только адрес.

При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.

Если в функцию передается адрес переменной (или адрес массива), то все операции, выполняемые в функции с данными, находящимися в пределах видимости указанного адреса, производятся над оригиналом данных, поэтому исходный массив (или значение переменной) может быть изменено вызываемой функцией.

Наука
7 млн интересуются