>> [Играет музыка]
ДАГ Lloyd: Ладно.
Работа с одним переменные довольно весело.
Но что, если мы хотим работать с большим количеством переменных,
но мы не хотим, чтобы иметь кучу разные имена летать вокруг нашего кода?
В этом случае массивы придет в очень удобно.
Массивы действительно фундаментальная данные структура любого языка программирования
что вы будете использовать.
И они действительно, действительно полезно, В частности, как мы увидим, в CS 50.
>> Мы используем массивы для хранения Значения данных одного типа
в смежных ячейках памяти.
То есть, это так, что мы можем группа
куча целых вместе памяти или куча персонажей
или плавает в памяти действительно закрыть вместе и работа
с ними без дать каждому одним свое уникальное имя, которое может
получить громоздким через некоторое время.
>> Теперь, один из способов аналогию массивы это думать о вашем местном сообщению
офис на секунду.
Так шаг от программирования и просто закрыть глаза
и визуализировать в уме ваш местный почтамт.
Как правило, в большинстве пост офисы, есть крупный банк
а почтовые ящики на стене.
>> Массив представляет собой гигантский блок непрерывной памяти,
так же, как почтовый банк в Вашем почтовом отделении
большое пространство на стены почтамта.
Массивы были разделены на небольшие, одинакового размера блоки пространства,
каждый из которых называется элементом, в так же, как стены поста
офис была разделена на мелкие, одинакового размера блоки пространства,
что мы называем PO коробку.
Каждый элемент массива может хранить определенное количество данных,
как каждый почтовый ящик может провести определенное количество почте.
>> Что можно хранить в каждом элементе массив переменных и тех же данных
тип, например, Int или полукокса, всего как в вашем ящике почтовом отделении,
Вы можете вставить только вещи подобного типа,
такие как письма или небольших упаковках.
Наконец, мы можем получить доступ к каждому элементу массив непосредственно по номеру индекса,
как мы можем получить доступ к нашим почтовое отделение коробка, зная его номер почтового ящика.
Надеюсь, что аналогия помогает вам получить вашу голову
вокруг идеи массивов по аналогию с чем-то еще
что вы, вероятно, уже знакомы.
>> В C, элементы массива являются индексируется, начиная с 0, а не от 1.
И это действительно важно.
И в самом деле, это, почему мы, в CS 50, и почему ученые-компьютерщики часто
будет считать от 0, потому массива C в
индексация, которая всегда начинается с 0.
Таким образом, если массив состоит из п элементов, первый элемент этого массива
находится по индексу 0, и последний элемент массива
находится в индексом п минус 1.
Опять же, если есть п элементов в наших Массив, последний индекс п минус 1.
>> Так что, если наш массив имеет 50 элементов, в Первый элемент расположен по индексу 0,
и последний элемент находится в индексе 49.
К сожалению, или к счастью, в зависимости от вашей точки зрения,
С очень мягкими здесь.
Это не помешает вам выходя за пределы своего массива.
Вы можете получить доступ к минус 3 элемент вашего массива
или 59-элемент вашего массива, если ваш массив имеет только 50 элементов.
Это не остановит свою программу из компиляции, но во время выполнения,
Вы можете столкнуться с Страшный ошибки сегментации
если вы начинаете получить доступ к памяти что находится за пределами того, что
Вы спросили вашу программу, чтобы дать вам.
Так что будьте осторожны.
>> Что делает массив Заявление выглядит?
Как мы закодировать массива в существовании как мы код любой другой переменной?
Есть три части в массив declaration-- тип, имя,
и размер.
Это очень похож на Объявление переменной, которая
это просто тип и имя, элемент Размер будучи
особый случай для массива, потому что мы получаем кучу из них
в то же время.
>> Таким образом, тип, какой переменной, хочу, чтобы каждый элемент массива будет.
Вы хотите, чтобы это массив целых чисел?
Затем ваш тип данных должен быть Int.
Хотите, чтобы это было массив удваивается или поплавки?
Тип данных должен быть двойной или плавать.
Это имя, что вы хочу обратить ваше массив.
Что вы хотите, чтобы назвать этого гиганта банк целых чисел или плавает или символов
или двухместные, или все, что у вас?
Что вы хотите назвать это?
Довольно пояснений.
>> Наконец, размер, который идет внутри квадратных скобок,
как многие элементы, которые вы бы как ваш массив содержит.
Сколько чисел вы хотите?
Сколько плывет вы хотите?
>> Так, например, INT оценки студентов 40.
Это объявляет массив с именем Студент сорта, который состоит из 40 целых чисел.
Довольно пояснений, я надеюсь.
Вот еще один пример.
Двойные цены меню 8.
Это создает массив с именем Цены меню, которое состоит
комнаты в памяти восемь дублей.
>> Если вы думаете о каждом элементе массива типа данных типа,
Так, например, один элемент массив типа INT, так же, как вам
будет думать о любой другой переменная типа Int,
все привычные операции, которые мы обсуждалось ранее в операциях
видео будет иметь смысл.
Так вот, мы могли бы объявить массив логических значений называемые Truthtable,
которая состоит из комнаты для 10 Booleans.
>> А потом, как мы могли бы просто присвоить значение в любой другой переменной типа
Логическое, мы могли бы сказать что-то как Truthtable квадратных скобках
2, который является, как мы указываем, какой элемент таблицы истинности?
Третий элемент из Таблица истинности, потому что помните,
мы рассчитываем от 0.
Так вот, как мы указать Третий элемент таблицы истинности.
Truthtable 2 равняется ложь, так же, как мы могли бы declare--
или мы могли бы назначить, а любая Логический тип переменной, чтобы быть ложным.
>> Мы можем также использовать его в условиях.
если (== 7 truthtable истинно), который должен сказать,
если восьмой элемент из Truthtable правда,
может быть, мы хотим, чтобы напечатать сообщение пользователю, Е ("ИСТИНА! N") ;.
Это заставляет нас говорить Truthtable 10 равна правда, не так ли?
Ну, я могу, но это довольно опасно, потому что помните,
у нас есть массив из 10 булевых.
Таким образом, высокий показатель, что компилятор дал нам 9.
>> Эта программа компилируется, но если что-то еще в памяти
существует там, где мы бы ожидать Truthtable 10 идти,
мы могли бы пострадать ошибку сегментации. Мы может уйти с ним, но в целом,
очень опасно.
Так, что я делаю здесь правовой С, но не обязательно лучший ход.
Теперь, когда вы объявляете и инициализировать массив одновременно,
там на самом деле довольно специальный синтаксис, что вам
можно использовать для заполнения массива с его начальными значениями.
Он может получить громоздким объявить массив размером 100,
а затем должен сказать, элемент 0 равен этому; элемент 1 равен этому;
элемент 2 равна, что.
Какой смысл, верно?
>> Если это небольшой массив, вы могли бы сделать что-то вроде этого.
Bool truthtable 3 равна открыт фигурная скобка, а затем запятая
отделить список элементов что вы хотите, чтобы положить в массиве.
Затем закройте фигурная скобка запятой.
Это создает массив Размер три называется Truthtable,
с элементами ложной, правда, и правда.
И в самом деле, конкретизация Синтаксис у меня вот
точно так же, как делать то индивидуальный синтаксис элемента ниже.
Эти два способа кодирования будет производить тот же массив.
>> Точно так же мы могли пройтись по всем элементам
массива, используя цикл, который, в сути, является очень настоятельно рекомендуется
на дому упражнения.
Как создать массив 100 целых чисел, где
каждый элемент массива является его индекс?
Так, например, у нас есть массив из 100 целые числа, а в первом элементе,
мы хотим, чтобы положить 0.
Во второй элемент, мы хотим, чтобы положить 1.
В третьем элементе, мы хотим положить 2; И так далее, и так далее.
Это действительно хорошо на дому упражнения, чтобы сделать это.
>> Здесь это не выглядит как слишком многое изменилось.
Но обратите внимание, что в между квадратные скобки, на этот раз,
Я на самом деле опустить номер.
Если вы используете это очень специальный экземпляра
Синтаксис создать Массив, вы на самом деле не
необходимо указать размер массива заранее.
Компилятор достаточно умен, чтобы знать, что вы действительно
хочу массив размера 3, потому что вы положили три элемента
справа от знака равенства.
Если вы поставили четыре, это было бы дал вам таблицу истинности размера четыре;
И так далее, и так далее.
>> Массивы не ограничиваются одной измерение, которое является довольно прохладно.
Вы на самом деле может иметь как многие боковые спецификаторы, как вы хотите.
Так, например, если вы хотите создать доска для игры Морской бой, который,
если вы когда-либо играл, это игра, которая является играл с колышками на 10 на 10 сетку,
Вы могли бы создать массив как это.
Можно сказать, Bool линкор квадратная скобка 10
закрытая скобка квадратная Кронштейн 10 закрыт квадратную скобку.
>> И потом, вы можете выбрать интерпретировать это в виду, как в 10
10 сетки ячеек.
Теперь, на самом деле, в памяти, это действительно просто
остаются 100 элемент, один одномерный массив.
И это, на самом деле, идет, если вы есть три измерения или четыре или пять.
Это действительно просто не размножаются все indices--
или все размеры specifiers-- вместе,
и вы просто получите одномерной Массив размера.
>> Но с точки зрения организации и визуализации и человеческого восприятия,
это может быть намного проще, работать с сеткой
если вы работаете на игры как игра в крестики-нолики или линкор,
или что-то вроде того.
Это отличный абстракция, вместо того,
думать о Tic-Tac-Toe доска в линии девяти
квадраты или доска Броненосец как линия 100 квадратов.
10 10 сетке или трех на три сетки, вероятно,
много легче воспринимать.
>> Теперь, что-то действительно Важно о массивах.
Мы можем относиться друг от частных лиц элемент массива в качестве переменной.
Мы видели, что ранее когда мы были присвоения
значение Правда некоторым Booleans или их тестирования в условных.
Но мы не можем относиться к цельные массивы себя переменных.
Мы не можем, например, присвоить один массив в другой массив, используя назначение
оператором.
Это не юридическое С.
>> Если мы хотим, чтобы для example--, что мы будет делать в этом примере
будет скопировать один массив в другой.
Если мы хотим, чтобы это сделать, мы на самом деле нужно использовать цикл скопировать
каждый отдельный элемент по одному.
Я знаю, это немного времени.
>> Так, например, если бы мы имели эти несколько строк кода, это будет работать?
Ну, нет, это не так, верно?
Потому что мы пытаемся назначить пищу бар.
Это не будет работать, потому что это массив,
и мы только что описали что это не законно С.
>> Вместо этого, если мы хотим, чтобы скопировать содержимое пищи
в строке, что и мы пытаемся сделать здесь,
мы должны были бы синтаксис вроде этого.
У нас есть цикл, который идет от J равна 0 до 5,
и мы увеличиваем J на ​​каждой итерации цикл и назначить элементы, такие как, что.
Это приведет к строке и являющийся одним, двумя, тремя, четырьмя, пятью,
но мы должны сделать это этот очень медленно элемент-по-элемента образом,
а, просто копирование весь массив.
В других программ языки, более современных,
Вы можете, на самом деле, делать только что просто равна синтаксис.
Но С, к сожалению, мы Не допускается, чтобы сделать это.
>> Теперь, есть еще одна что я хочу сказать,
о массивах, которые могут быть немного немного сложнее в первый раз вам
работать с ними.
Мы обсудили в видео о видимости переменных,
что большинство переменных в C, когда Вы называете их функций, которые передаются по значению.
Вы помните, что это значит, чтобы передать что-то по стоимости?
Это означает, что мы делаем копию Переменная, которая передается в.
Функция вызываемая функция который получает переменную,
не получить саму переменную.
Он получает свои местные Копия этого работать.
>> Массивы, конечно, сделать не следовать этому правилу.
Скорее всего, то, что мы называем это проходит по ссылке.
Подпрограмма самом деле вовсе получить массив.
Это не получить его собственную локальную копию из него.
И если вы думаете о это, в этом есть смысл.
Если массивы действительно большим, его занимает так много времени и усилий,
чтобы сделать копию массива 100 или 1000 или 10000 элементов,
что это не стоит для функционировать, чтобы получить копию из него,
сделать некоторую работу с ним, а затем просто сделать копию;
не должны иметь это висит вокруг больше.
>> Поскольку массивы являются одними громоздким и громоздкой,
мы просто передавать их по ссылке.
Мы просто доверять эту функцию чтобы, ничего не сломать.
Так это на самом деле получить массив.
Это не получить свою собственную локальную копию.
>> Так что это означает, Затем, когда вызываемый абонент
манипулирует элементы массива?
Что происходит?
В настоящее время, мы будем замалчивать над тем, почему именно этот
Бывает, почему массивы передаются по ссылке
а все остальное передается по значению.
Но я обещаю вам, мы будем вернуться и дать вам ответ
к этому в более поздней видео.
>> Вот еще одно упражнение для вас прежде, чем мы обернуть вещи на массивах.
Пучок кода здесь, это не особенно хороший стиль,
просто я сделаю что предостережение.
Там нет комментариев здесь, который является довольно плохой форме.
Но это только потому, что я хотел быть в состоянии соответствовать все на экране.
>> В верхней части, вы можете увидеть, что у меня есть две декларации функции для заданного массива
и установить Int.
Набор массив, по-видимому принимает массив из четырех целых чисел в качестве входных данных.
И, видимо, набор INT принимает одно целое число в качестве своего вклада.
Но оба они не имеют выхода.
Выход, возвращение введите, друг один недействительными.
В главном, у нас есть пару строк кода.
Мы объявляем целочисленную переменную называется и назначить ей значение 10.
Мы заявляем, массив из четырех чисел В называется и назначить элементы 0, 1,
2 и 3, соответственно.
Затем, у нас есть звонок, чтобы установить INT и призыв установить массив.
Определения множества массива и набора INT вниз ниже, на дне.
>> И так, опять же, я прошу вас вопрос.
Что получает распечатать Здесь в конце основного?
Там это распечатка кол. я печать из двух целых чисел.
Я распечатки содержимого и содержимое B квадратные скобки. 0
Пауза видео здесь и занять минуту.
Можете ли вы выяснить, что это Функция печати в конце?
Надеюсь, если вы вспомнить Различие между передача по значению
и передача по ссылке, это Проблема была не слишком сложно для вас.
И ответ вы бы нашли это.
Если вы не совсем уверены, чтобы почему это так, взять второй,
вернуться, рассмотреть то, что я был просто обсуждения о передаче массивов
в качестве ссылки, по сравнению с проходящей другие переменные по значению,
и, надеюсь, это сделает немного больше смысла.
>> Я Дуг Ллойд, и это CS50.