Массивы в C++ — урок 5
Сегодня мы с поговорим о массивах. Вы уже знаете, что переменная — это ячейка в памяти компьютера, где может храниться одно единственное значение. Массив — это область памяти, где могут последовательно храниться несколько значений.
Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.
- Пример инициализации массива
- Описание синтаксиса
- Вывод элементов массива через цикл
- Объявление массива без инициализации
- Заполнение массива с клавиатуры
Пример инициализации массива
string students[10] = { "Иванов", "Петров", "Сидоров", "Ахмедов", "Ерошкин", "Выхин", "Андеев", "Вин Дизель", "Картошкин", "Чубайс" };
Описание синтаксиса
Массив создается почти так же, как и обычная переменная. Для хранения десяти фамилий нам нужен массив, состоящий из 10 элементов.
Чтобы описать элементы массива сразу при его создании, можно использовать фигурные скобки. В фигурных скобках значения элементов массива перечисляются через запятую. В конце закрывающей фигурной скобки ставится точка с запятой.
Попробуем вывести наш массив на экран с помощью оператора cout
.
#include <iostream> #include <string> int main() { std::string students[10] = { "Иванов", "Петров", "Сидоров", "Ахмедов", "Ерошкин", "Выхин", "Андеев", "Вин Дизель", "Картошкин", "Чубайс" }; std::cout << students << std::endl; // Пытаемся вывести весь массив непосредственно return 0; }
Скомпилируйте этот код и посмотрите, на результат работы программы. Готово? А теперь запустите программу еще раз и сравните с предыдущим результатом. В моей операционной системе вывод был следующим:
- Первый вывод:
0x7ffff8b85820
- Второй вывод:
0x7fff7a335f90
- Третий вывод:
0x7ffff847eb40
Мы видим, что выводится адрес этого массива в оперативной памяти, а никакие не «Иванов» и «Петров».
Дело в том, что при создании переменной, ей выделяется определенное место в памяти. Если мы объявляем переменную типа int
, то на машинном уровне она описывается двумя параметрами — ее адресом и размером хранимых данных.
Массивы в памяти хранятся таким же образом. Массив типа int
из 10 элементов описывается с помощью адреса его первого элемента и количества байт, которое может вместить этот массив. Если для хранения одного целого числа выделяется 4 байта, то для массива из десяти целых чисел будет выделено 40 байт.
Так почему же, при повторном запуске программы, адреса различаются? Это сделано для защиты от атак переполнения буфера. Такая технология называется рандомизацией адресного пространства и реализована в большинстве популярных ОС.
Попробуем вывести первый элемент массива — фамилию студента Иванова.
#include <iostream> #include <string> int main() { std::string students[10] = { "Иванов", "Петров", "Сидоров", "Ахмедов", "Ерошкин", "Выхин", "Андеев", "Вин Дизель", "Картошкин", "Чубайс" }; std::cout << students[0] << std::endl; return 0; }
Смотрим, компилируем, запускаем. Убедились, что вывелся именно «Иванов».
Заметьте, что нумерация элементов массива в C++ начинается с нуля. Следовательно, фамилия первого студента находится в
students[0]
, а фамилия последнего — в students[9]
В большинстве языков программирования нумерация элементов массива также начинается с нуля.
Попробуем вывести список всех студентов. Но сначала подумаем, а что если бы вместо группы из десяти студентов, была бы кафедра их ста, факультет из тысячи, или даже весь университет? Ну не будем же мы писать десятки тысяч строк с cout
?
Конечно же нет! Мы возьмем на вооружение циклы, о которых был написан предыдущий урок.
Вывод элементов массива через цикл
#include <iostream> #include <string> int main() { std::string students[10] = { "Иванов", "Петров", "Сидоров", "Ахмедов", "Ерошкин", "Выхин", "Андеев", "Вин Дизель", "Картошкин", "Чубайс" }; for (int i = 0; i < 10; i++) { std::cout << students[i] << std::endl; } return 0; }
Если бы нам пришлось выводить массив из нескольких тысяч фамилий, то мы бы просто увеличили конечное значение счетчика цикла — строку for (.
заменили на for (...; i < 10000; ...)
.
Заметьте что счетчик нашего цикла начинается с нуля, а заканчивается девяткой. Если вместо оператора строгого неравенства — i < 10
использовать оператор «меньше, либо равно» — i <= 10
, то на последней итерации программа обратится к несуществующему элементу массива — students[10]
. Это может привести к ошибкам сегментации и аварийному завершению программы. Будьте внимательны — подобные ошибки бывает сложно отловить.
Массив, как и любую переменную можно не заполнять значениями при объявлении.
Объявление массива без инициализации
string students[10]; // или string teachers[5];
Элементы такого массива обычно содержат в себе «мусор» из выделенной, но еще не инициализированной, памяти. Некоторые компиляторы, такие как GCC, заполняют все элементы массива нулями при его создании.
При создании статического массива, для указания его размера может использоваться только константа. Размер выделяемой памяти определяется на этапе компиляции и не может изменяться в процессе выполнения.
int n; cin >> n; string students[n]; /* Неверно */
Выделение памяти в процессе выполнения возможно при работе с динамическими массивами. Но о них немного позже.
Заполним с клавиатуры пустой массив из 10 элементов.
Заполнение массива с клавиатуры
#include <iostream> #include <string> using std::cout; using std::cin; using std::endl; int main() { int arr[10]; // Заполняем массив с клавиатуры for (int i = 0; i < 10; i++) { cout << "[" << i + 1 << "]" << ": "; cin >> arr[i]; } // И выводим заполненный массив. cout << "\nВаш массив: "; for (int i = 0; i < 10; ++i) { cout << arr[i] << " "; } cout << endl; return 0; }
Скомпилируем эту программу и проверим ее работу.
Если у вас возникают проблемы при компиляции исходников из уроков — внимательно прочитайте ошибку компилятора, попробуйте проанализировать и исправить ее. Если вы нашли ошибку в коде — напишите об этом в комментариях к уроку.
Массивы — очень важная вещь в программировании. Автор советует вам хорошо попрактиковаться в работе с ними.
Следующий урок: Функции в C++ →.
Массивы в C
Массив — это группа однотипных объектов данных, хранящихся в оперативной памяти. Внутри программирования на C массивы действительно являются производным типом данных, который может содержать примитивные типы данных, такие как int, char, double, float и т.д. Он также может содержать группу производных типов данных, таких как указатели, структуры и т.д. Если вы хотите записать оценки студента за шесть курсов, нам не нужно создавать отдельные переменные для оценок каждого предмета. В качестве альтернативы мы можем создать массив, который может содержать оценки для каждой темы в областях общей памяти. Мы можем просто получить элементы, используя массив. Чтобы получить элементы массива, необходимо еще несколько строк сценария C. Давайте взглянем на некоторые примеры, чтобы увидеть работу массивов на языке C. При написании этого руководства мы использовали Ubuntu 20.
Содержание
- Пример 1
- Пример 2
- Пример 3
- Пример 4
- Пример 5
- Заключение
Пример 1
Начнем с открытия оболочки терминала в операционной системе Ubuntu 20.04. Используйте «Ctrl + Alt + T», чтобы открыть консоль оболочки в течение 5 секунд. Начнем с создания файла на языке C, используя «сенсорный» запрос, как показано ниже.
Откройте его в каком-нибудь редакторе, чтобы добавить к нему код. Следовательно, мы использовали «нано» запрос, чтобы открыть этот файл в GNU.
Теперь файл открыт в редакторе GNU; пришло время написать код на языке C для разработки массивов. Было бы полезно, если бы вы осознали, что существуют различные способы объявления массива и его инициализации. В этом примере мы обсудим первый и самый простой способ объявления и инициализации массива на языке C. Итак, сначала добавьте стандартную библиотеку ввода-вывода. После этого запускаем в коде основную функцию. Мы утвердили массив величиной 5. После этого мы добавили значения в массив по каждому индексу отдельно. После этого мы использовали цикл for, чтобы распечатать все 5 элементов массива arr в оболочке. Это один из самых простых способов заявить и предварительно подготовить массив. Сохраните свой код и выйдите из него, используя «Ctrl + S» и «Ctrl + X» один за другим.
Теперь файл сохранен, нам нужно скомпилировать код, чтобы сделать его исполняемым файлом. Итак, используйте компиляцию c ++ «gcc», чтобы скомпилировать его, как показано ниже.
Давайте просто запустим файл, чтобы увидеть вывод массива на языке C. Мы должны использовать представленную инструкцию в консоли и нажать на кнопку «Enter», чтобы сделать это. На выходе отображаются все 5 значений массива одно за другим.
Пример 2
Давайте посмотрим на новый экземпляр для объявления и инициализации массива на этот раз другим методом. Следовательно, откройте файл «test.c» снова.
Поскольку файл был открыт в редакторе, сначала добавьте стандартную библиотеку ввода-вывода. Основная функция использовалась так же, как указано выше. В этом примере мы объявили два массива «нечетный» и «четный» для последовательной инициализации нечетных и четных значений в массивах. Массив «odd» не имеет определенного размера и имеет 5 элементов, инициализированных нечетными значениями. Сообщение печати было отображено, чтобы показать сообщение перед печатью нечетных элементов. Цикл For используется для сбора значений из индекса массива «odd» и печати по одному. Массив «even» содержит 5 четных чисел и определенный размер 5. Сообщение печати будет отображаться перед циклом «for», чтобы показать, что будут показаны четные числа. Затем цикл for был использован для печати значений четных массивов одно за другим.
Скомпилируйте файл «test.c» еще раз, чтобы выполнить его дальше.
После компиляции кода выполните его, используя следующую команду. Результат будет таким, как показано на нижнем изображении. Сначала он будет печатать нечетные элементы массива, затем четные элементы массива и простые текстовые сообщения перед обоими массивами.
Пример 3
Давайте посмотрим на пример массива, принимающего значение из пользовательского ввода, а затем отображающего эти значения в терминале. Итак, откройте тот же файл еще раз.
Теперь файл открыт в редакторе GNU nano. Мы добавили в него приведенный ниже сценарий C, чтобы вводить данные пользователя. После включения стандартного заголовка ввода-вывода и основной функции мы объявили массив «store» размером 7. Оператор print использовался для печати сообщения для пользователя о добавлении только целочисленных значений. Цикл «for» использовался для сбора и добавления введенных пользователем значений в массив «store» с помощью & sign в функции scanf. После завершения цикла «for» было распечатано другое сообщение на дисплее. Второй цикл «for» использовался для отображения значений массива на экране с помощью оператора «printf». Функция main закрывается фразой return 0. Сохраните этот код и уходите.
Теперь используйте запрос «gcc» для компиляции этого кода.
После того, как код был скомпилирован, выполните запрос, показанный ниже. Потребителя попросили передать значения целочисленного типа. Как видите, мы добавили 7 значений и нажали Enter. После сообщения на дисплее все значения, добавленные пользователем, будут сохранены в массиве, а затем распечатаны.
Пример 4
Рассмотрим пример вычисления суммы и среднего значения по содержимому массива. Сначала откройте файл C.
После открытия файла добавьте в него такой же код ниже. Снова мы сначала использовали стандартную библиотеку C и основную функцию. Подтвержден размер массива «Arr» 10. Две целочисленные переменные: sum и avg были объявлены для подсчета общего и среднего значений по элементам массива. Оператор печати используется, чтобы попросить пользователя добавить целые значения. Цикл «for» используется для добавления введенных пользователем значений в массив «Arr» с помощью метода scanf. Между тем, все значения, добавленные пользователем, будут суммированы и сохранены в переменной «сумма». После того, как эта сумма отобразится, а после расчета будет отображаться среднее значение.
Скомпилируйте свой код.
Результат показан ниже.
Пример 5
На этой иллюстрации мы обсудим, как отсортировать массив. Для этого откройте файл.
Инициализированы целочисленная переменная «temp» и массив «Arr» размера 10. Первый цикл «for» используется для печати текущего порядка массива. Второй и третий циклы for использовались для сортировки существующего массива в порядке возрастания с использованием замены. Если оператор содержит условие, что если значение индекса «i + 1» больше значения индекса, добавьте значение индекса «I» к переменной temp. Добавьте значения индекса «i + 1» к индексу «I». Теперь добавьте значение переменной temp к индексу «i + 1». Четвертый цикл for используется для печати отсортированного массива.
Скомпилируйте файл.
В выводе ниже сначала показан несортированный массив; затем массив был отсортирован и отображен.
Заключение
Фундаментальная структура данных будет массивом, который позволяет произвольно извлекать каждый объект данных с помощью значения индекса. Если вам нужно сохранить сопоставимые элементы, полезен массив C
Что такое массив в языке программирования C
Вопросы для интервью
Что такое массив в языке программирования C
Массив в языке программирования C представляет собой набор данных фиксированного размера, принадлежащих одному и тому же типу данных. Массив — это структура данных, в которой может храниться ряд переменных
один и тот же тип данных в последовательности. Эти похожие элементы могут быть типа int, float, double, char и т. д.
Важные моменты о массивах в C:
- Массив — это набор переменных одного типа данных.
- Все элементы массива хранятся в смежных ячейках памяти.
- Размер массива должен быть постоянным целым числом.
- Доступ к отдельным элементам в массиве можно получить по имени массива и целому числу, заключенному в квадратную скобку, называемому переменной нижнего индекса/индекса, например, employeeSalary[5].
- Массив — это структура данных с произвольным доступом. вы можете получить доступ к любому элементу массива всего за одну инструкцию.
- Первый элемент массива имеет индекс 0, тогда как последний элемент имеет индекс (size_of_array — 1).
Каковы преимущества и недостатки массивов в C
Преимущество массивов в C
- Меньше кода : Используя массив, мы можем объединить N переменных одного типа данных в одну структуру данных.
В противном случае мы должны объявить N отдельных переменных.
- Легкий доступ к элементам : Мы можем получить доступ к любому элементу массива, используя имя и индекс массива. Мы можем получить доступ ко всем элементам последовательно, итерируя от индекса 0 до size-1, используя цикл.
- Простые в реализации алгоритмы : Некоторые алгоритмы могут быть легко реализованы с использованием массива, например поиск и сортировка, поиск максимальных и минимальных элементов.
- Произвольный доступ : Мы можем получить доступ к любым элементам массива с временной сложностью O(1).
Недостатки или ограничения массивов в C
- Массив является статической структурой данных. Мы не можем изменить размер массива во время выполнения.
- Мы должны заранее знать, сколько элементов должно храниться в массиве.
- В массиве могут храниться только элементы одного типа данных.
Мы не можем хранить элементы нескольких типов данных в одном массиве.
- As Элементы массива хранятся в последовательных ячейках памяти. Таким образом, вставка и удаление элемента занимает много времени, так как мы должны сдвигать другие элементы на один положение впереди или сзади соответственно.
- C не выполняет проверку привязки индекса массива. В массиве и размером N вы можете написать код для доступа к элементу N+5 th без получения ошибки. Когда мы попытаемся получить доступ к элементам из-за пределов массива, мы получим мусорное значение.
- Поскольку мы не можем изменить размер массива, разработчики обычно объявляют большие массивы для поддержки любого расширения данных в будущем. Это приводит к созданию больших массивов, где большая часть пространства не используется.
Можем ли мы использовать отрицательные индексы массива в C, например метки[-2]
Нет, мы не можем использовать отрицательные индексы массива. Помните, что индексация массива начинается с 0. N-й элемент массива имеет индекс N-1.
Связанные темы
В чем разница между массивом и структурой в программировании на C
12 февраля 2019 г.
от Lithmee
Чтение через 4 мин.
Основное отличие между массивом и структурой в программировании на C заключается в том, что массив помогает хранить набор элементов данных одного типа, в то время как структура помогает хранить разные типы данных как единое целое.
C — это высокоуровневый язык программирования общего назначения, разработанный Деннисом Ритчи в Bell Labs. Это базовый язык для большинства современных языков программирования, таких как C++, Java, Python и PHP. Операционные системы, встроенные системы, сетевые драйверы, базы данных и т. д. — вот некоторые приложения, которые мы можем разрабатывать с использованием языка C. Массив и структура — две важные концепции программирования в языке C. В целом, элементы в массиве имеют одинаковый тип данных, тогда как элементы в структуре имеют разные типы данных.
Ключевые области, охватываемые
1. Что представляет собой массив в программировании C
— Определение, функциональность
2. Что является структурой в C -программировании
— определение, функциональность
3. Как разница. Между массивом и структурой в программировании на C
nofollow – Сравнение ключевых различий
Ключевые термины
Массив, структура, C, C++
Что такое массив в программировании на C
Массив — это структура данных, способная хранить элементы, принадлежащие к одному и тому же типу данных. Программист должен объявить количество элементов, которые должен хранить массив. Следовательно, массив имеет фиксированную длину. В качестве примера рассмотрим следующее.
целые числа [10];
При этом массив не может хранить более 10 элементов. Первый элемент массива начинается с нулевого индекса. Индекс последнего элемента равен 9. Кроме того, все элементы хранятся в непрерывной области памяти. Таким образом, выделение памяти для массива является статическим.
Рис. 1: Программа на C с массивами
Выше показана простая программа на C. Метки — это массив. Он может хранить пять целочисленных значений. Программист инициализирует массив пятью метками. Цикл for помогает перебирать массив. Переменная «i» начинается с 0 и увеличивается до 4. Она последовательно печатает метки в массиве. Первый элемент равен 75, а последний элемент равен 66.
Что такое структура в программировании на C
Структура — это отдельная переменная, которая может содержать данные, принадлежащие к разным типам данных. Другими словами, это набор переменных с разными типами данных. Пример следующий.
Рисунок 2: Программа на C со структурой
В приведенной выше программе студент является структурой. Он содержит два свойства: id (int) и name (char). В основном методе s1 является переменной структурного типа. В строке 13 номер 1 присваивается свойству id структуры. Функция strcpy позволяет скопировать строку «Ann» в свойство name структуры. Программист может получить доступ к свойствам структуры с помощью оператора доступа (.). Наконец, функция printf отображает идентификатор и имя на консоли.
Разница между массивом и структурой в программировании на C
Определение
Массив — это структура данных, состоящая из набора элементов, каждый из которых идентифицируется индексом массива, в то время как структура — это тип данных, который хранит разные типы данных в одной и той же ячейке памяти. Таким образом, это основное различие между массивом и структурой в программировании на C.
Функциональность
Массив хранит набор элементов данных одного типа в смежных ячейках памяти, тогда как структура хранит разные типы данных как единое целое.
Доступ
Доступ к элементу массива возможен с помощью индекса. Однако можно получить доступ к свойству структуры, используя имя структуры и оператор точки. Следовательно, это еще одно различие между массивом и структурой в программировании на C.
Ключевое слово
Кроме того, нет ключевого слова для объявления массива, но программист использует ключевое слово «struct» для объявления структуры.
Размер элемента данных
Еще одно различие между массивом и структурой в программировании на C заключается в размере элементов данных. Каждый элемент в массиве имеет одинаковый размер, в то время как размер элементов в структуре может быть разным.
Доступ к элементам и поиск по ним
Кроме того, структуре требуется больше времени для доступа и поиска элементов по сравнению с массивом.
Заключение
Массив и структура — два важных понятия в программировании на C. Программист может напрямую объявить массив, тогда как структура является определяемым пользователем типом данных. Разница между массивом и структурой в программировании на C заключается в том, что массив помогает хранить набор элементов одного типа данных, а структура помогает хранить разные типы данных как единое целое.