DAVID МАЛАН: Здравствуйте, и добро пожаловать обратно в CS50. Так что это в конце недели четыре. Только одно объявление в первую очередь. Таким образом, так называемый пятый понедельник придумывать следующий понедельник. Это возможность перейти от СБ / ненасыщенного на письмо классе, или из буквенную СБ / ненасыщенного. Досадно, что процесс требует подписи, потому что вы должны заполнить один из тех, розовый ввода / вывода форм. Потому что технически, СБ / ненасыщенного версии и версии буквенную имеют различные номера по каталогу. Но никакое грандиозное предприятие. Просто приходите ко мне или к Робу или Лорен в любой момент. Или напишите нам, если у вас нет вида документов вам нужно сегодня, и мы будете уверены, чтобы помочь вам принять уход за что до понедельника. Ладно, так что сегодня - На самом деле, есть что-то вроде эха. Можем ли мы тон меня немного? ОК. Таким образом, сегодня мы вводим тему известный как указатели. И я признаю, что это один из более сложные темы, которые мы, как правило, охватывают в этом классе, или действительно любой вводный курс, который использует C. Но поверьте мне на слово это, в частности, Если ваш ум чувствует себя немного более изогнутые сегодня и в ближайшие недели. Это не представитель вы получаете хуже в это это просто означает, что это особенно сложные темы Я обещаю, что, через несколько недель Таким образом, будет казаться слишком разительно прост в ретроспективе. Я все еще помню по сей день. Я сидел в Эллиотт столовая, сидя рядом с моим TF Нишат Мехта, который был жителем Elliott House. И почему-то, эта Тема просто кликов. Который должен сказать, что я тоже боролся с ним в течение некоторого количества времени, но я сделаю все возможное, чтобы помочь избежать таких борьба с теми, что в конечном счете является достаточно мощным. В самом деле, одна из тем, которые мы будем обсуждать В ближайшие недели в том, что безопасности, и как вы можете на самом деле эксплуатировать машины таким образом, которые не были предназначены. А те, как правило, exploitations результатом ошибки, ошибки, которые мы люди делают, не понимания некоторых от конкретной реализации подробнее через какие программы сделали. Теперь, чтобы сделать это кажется все более пользователей доброжелателен, я думал, что я буду играть 10 секундный фрагмент немного Claymation цифру назвал Binky который был доставлен в жизни нашего друга в Стэнфорде, Профессор Ник Parlante. Так что позвольте мне дать вам это тизер Binky здесь. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -Эй, Бинки. Проснуться. Это время для указателя весело. -Что это? Узнайте о указатели? О, положительный герой. [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID МАЛАН: Это Стэнфорде информатики. Так об этом в будущем. [Аплодисменты] DAVID МАЛАН: Извини, Ник. Поэтому напомним, что в прошлый раз мы закончили на это действительно захватывающее захватывающим причем эта функция просто не работает. По крайней мере, интуитивно, он чувствовал как она должна работать. Просто поменять местами значения двух целых чисел. Но напомним, что, когда мы выводим исходных значений в основном, один и два, они были все еще одно и два, а не две, а одну. Итак, позвольте мне на самом деле переключения более к прибору. И я написал немного кода в скелетных продвижения здесь, где я утверждаю, что X будет 1, у 2 будет. Я затем распечатать и их Значения F с печатью. Я тогда утверждать, что здесь мы собираемся поменять их местами. Я оставил пустое место здесь для нас заполнить сегодня через минуту. Тогда, я буду утверждать, что двух переменных были обменяны. Тогда я собираюсь распечатать их снова. И так, мы надеемся, я должен видеть 1, 2. 2, 1. Это супер просто цель сейчас. Так как же нам идти об обмене двух переменных? Ну, если я предлагаю здесь, что эти чашки может представлять памяти в компьютере. Это несколько укусов, это Другой несколько укусов. Могли ли мы волонтер поднимайся и смешать нам выпить, если знакомы? Поднимайся. Как тебя зовут? Джесси: Джесс. DAVID МАЛАН: Джесс? Поднимайся, Джесс. Если вы не возражаете, мы должны положить Google стекла на вас, чтобы мы могли увековечить это. Хорошо, стекла. Запись видео. И хорошо, что мы хорошие, чтобы пойти с Джесс здесь. Хорошо. Очень приятно. Так что я хотел бы вам сделать здесь - если бы вы могли, достаточно быстро - просто льет нам половину стакана апельсинового сока и полстакана молока представляющий эффективно цифрами 1 В одной чашке и 2 в другой чашке. Это собирается быть хорошие кадры. JESS: Извините. DAVID МАЛАН: Нет, нет. Все в порядке. Ниццу. Ладно, у нас есть четыре байта Стоит апельсинового сока. Мы назвали его значение 1. Теперь еще четыре байта стоит молока. Будем называть его значение 2. Так что х и у, соответственно. Ладно, так что теперь, если задаче - для вас, Джесс, на глазах у всех из ваших одноклассников - является замена значения х и у такие, что мы хотим, апельсиновый сок в другой чашке и молоко в чашу сию, как может вас - прежде чем на самом деле это - идти об этом? Хорошо, мудрое решение. Так что вам нужно немного больше памяти. Так что давайте выделить временное чашку, если вы будете. А теперь перейдем к поменять х и у. Отлично. Так что очень хорошо сделано. Большое вам спасибо, Джесс. Вот, пожалуйста. Небольшой сувенир. Хорошо, таким образом, очевидно, супер просто идея. Совершенно интуитивно, что нам нужно немного больше места для хранения - в таком виде, чашка - если мы действительно хотим поменять этих двух переменных. Так что давайте делать именно это. Здесь, в между тем, где я утверждаю, что я собираюсь делать некоторые замены, я буду идти вперед и объявить темп. И я буду его равным, скажем, х. Тогда я собираюсь изменить значение X так же, как Джесс сделал здесь с молоко и апельсиновый сок равным у. И я собираюсь изменить Y равным не х, потому что теперь мы будем застрял в круг, а темп. Там, где я временно - или там, где Джесс временно отложить апельсиновый сок до затирания, что чашки с молоком. Итак, позвольте мне теперь идти вперед и сделать это. Она называется noswap.c. А теперь позвольте мне работать не свопа. И в самом деле я вижу, если я расширяю окна немного, что х равен 1, у равен 2. , А затем х 2, у = 1. Но напомним, что в понедельник мы сделали вещи немного по-другому которой я , реализуются вспомогательные функции, если хотите, что было на самом деле пустота. Я назвал его поменять. Я дал ей два параметра, и я позвонил их и я назвал их б. Честно говоря, я мог бы назвать их х и у. Там ничто не мешает меня от этого. Но я бы сказал, что это то немного двусмысленно. Потому напомним, что в понедельник мы утверждают, что эти параметры были копии значений прошло дюйма Так что просто портит с виду, я думаю, если вы используете точно так же переменных. Так что я буду называть их вместо и В, только для ясности. Но мы могли бы назвать их наиболее все, что хотим. И я собираюсь копировать и вставлять эффективно этот код от там вниз в здесь. Потому что я только что видел, что он работает. Так вот в довольно хорошей форме. И я изменю свое х к, х моя а, у моего б и у моего б. Итак, другими словами, те же логикой. Одно и то же, что Джесс сделал. А потом одна вещь, я должен сделать до Здесь, конечно, сейчас ссылаться на это функции или вызвать эту функцию. Так что я буду называть эту функцию с двумя входов, х и у, и нажмите Сохранить. Ладно, принципиально то же самое. На самом деле, я, вероятно, сделали программу излишне сложным путем пишете функцию, которая просто принимает около шести строк кода, тогда как я ранее реализованы это всего за три. Итак, позвольте мне теперь идти вперед и переделать этого не делают подкачки. Ладно, я облажался здесь. Это должно быть ошибок, которые могут см. все более широко, как ваша Программы становятся все более сложными. Но есть легко исправить. Позвольте мне прокрутки вернуться сюда. И то, что первая ошибка, что я вижу? Неявная декларация. Что это обычно указывают? Ой, я забыл прототип. Я забыл научить компилятор, который своп будет существовать, хотя он не существует в самом начале программы. Так что я просто хотел сказать пустоту, своп, Интеллект, Перехват INT B, точкой с запятой. Так что я не собираюсь переопределить ее. Но теперь это соответствует тому, что это здесь. И заметьте, отсутствие точки с запятой здесь, который не является необходимым, когда реализации. Итак, позвольте мне переделать это, можете не свопа. Гораздо лучшей форме. Бегите не свопа. И черт побери. Теперь мы вернулись, где мы были в понедельник, где вещь не поменять. И то, что интуитивное объяснение , почему это так? Да? СТУДЕНТ: [неразборчиво]. DAVID МАЛАН: Совершенно верно. Так что А и В являются копиями х и у. И в самом деле, в любое время вы были вызове функции до сих пор, что передает переменные, как целые - так же, как своп ожидает здесь - Вы, ребята, проходящий в копиях. Теперь, означает, что она занимает немного времени, доли секунды, для Компьютер для копирования битов из одного переменная в биты с другом. Но это не такое уж большое дело. Но они, тем не менее копию. И вот теперь, в контексте обмена, Я на самом деле успешно изменения и б. В самом деле, давайте делать быстрые санитарной проверки. Печать F является% I, новая строка. И подключить давайте в. Теперь давайте сделаем то же самое с б. И давайте делать то же самое здесь. А теперь, позвольте мне скопировать эти же линии снова в нижней части функции после моих трех линий интересного могли бы казнили, а распечатать и B еще раз. Итак, теперь давайте сделаем это, не делайте подкачки. Позвольте мне сделать окно терминала немного выше, так что мы можем видеть больше его сразу. И никогда работать не свопа. х равен 1, у равен 2. = 1, B = 2. И потом, а равно 2, B = 1. Так он работает, как и Джесс сделал здесь внутри подкачки. Но, конечно, он не остается никакой эффект на переменные в основной. Таким образом, мы увидели трюк, посредством которого мы могла бы это исправить, не так ли? Если вы столкнулись с этой обзорной Вопрос, можно просто плоскодонки и сделать X Y и какие переменные вместо этого? Вы могли бы сделать их глобальными. Положите их в самом начале файла как и мы, даже в игре 15. Мы используем глобальную переменную. Однако в контексте игры 15, это разумно иметь глобальное переменная, представляющая доску, потому что полнота 15.С все о реализации этой игре. Это то, что файл существует, чтобы сделать. Но в данном случае здесь, я вызове функции подкачки. Я хочу, чтобы поменять двух переменных. И она должна начать чувствовать себя так же неаккуратно если решение всех наших проблемы, когда мы бежим в область вопросы, это сделать его глобальным. Потому что очень быстро наша программа собирается стать настоящий беспорядок. И мы сделали это очень экономно В итоге в 15.c. Но, оказывается, есть Лучший способ в целом. Позвольте мне на самом деле вернуться и удалить распечатать F, всего упростить этот код. И позвольте мне предложить, что это, действительно, плохо. Но если бы я вместо этого добавить в некоторых звездочками и звезды, я могу превратить это вместо функции в тот, который на самом деле работает. Итак, позвольте мне вернуться сюда и признаться говоря звездочками всегда трудно, Поэтому я скажу так звезды. Я просто признаться до того. Хорошо. А теперь, что я собираюсь сделать вместо этого? Итак, прежде всего, я собираюсь задать что вместо прохождения в десятичной своп функции, я вместо из собирался сказать десятичного звезды. Итак, что же звезды указывают? Это понятие, что указатель, который Бинки, Claymation характером, был ссылаясь на мгновение назад. Так что если мы говорим десятичного звезды, смысл это сейчас, что не собирается быть прошла в его значением. Это не собирается быть скопированы дюйма Скорее, адрес является будет передаваться дюйма Поэтому напомним, что внутри компьютера целая куча памяти, в противном случае известной как ОЗУ. И это только RAM целая куча байтов. Так что если ваш Mac или ваш компьютер имеет два гигабайта, у вас есть 2 миллиард байт памяти. Теперь давайте предположим, что просто держать вещи хорошо и организованно, мы назначить адрес - номер - в каждый байт оперативной памяти на вашем компьютере. Самый первый байт из тех 2 млрд. по числу нулю. Следующий байт является номером один, число два, всю дорогу на вверх, точка точка точки, примерно 2 миллиарда долларов. Так что вы можете количества байтов памяти в компьютере. Итак, давайте предположим, что это то, что мы подразумеваем под адресом. Поэтому, когда я вижу десятичного звезды, что происходит должны быть пропущены через своп в настоящее время является адрес. Не его стоимость, но все, что его почтовый адрес, так сказать - его расположение в памяти. И аналогично для В, я собираюсь сказать то же самое. Int, звезда, б. Как в стороне, технически звезды могли бы пойти в другие места. Но мы будем стандартизировать звезда является в непосредственной близости от типа данных. Так своп подписи теперь означает, дай мне адрес Интеллект, и вызов этот адрес. И дай мне другой адрес Int и называть этот адрес б. Но теперь мой код здесь должно измениться. Потому что, если я заявляю десятичного Temp - который до сих пор типа Int - но я храню в нем, какие ценности? Чтобы было ясно, я Ввод с код как написано прямо сейчас? Я ставлю расположение в. Но я не заботятся о место в настоящее время, не так ли? Temp существует только треть стакана Джес существовал, с какой целью? Для сохранения значения. Молоко или апельсиновый сок. Не фактически хранить адреса либо из тех вещей, которая чувствует себя немного бессмысленное в этом реальном мировой контекст в любом случае. Так на самом деле, то, что я хочу поставить в Temp не является адресом, но Содержание. Так что если это число, как 123, это 123-й байт памяти, что справедливый случается, оккупационной, что значение В случается оккупационными. Если я хочу пойти на этот адрес, Я должен сказать, звезды. Аналогичным образом, если бы я должен был изменить то, что по адресу, я меняю это для начала. Если я хочу сохранить в том, что, по крайней Расположение с тем, что на месте в B, B звезды звезды. Короче говоря, даже если это не совсем утопая в еще - и я бы не ожидал что она будет так быстро - понимать, что все что я делаю, предваряя эти звезды к моему переменных, говорю, не захватить ценности. Не изменяйте значения. Но, скорее, идти на эти адреса и получить значение. К этому адресу и изменения значение там. Так что теперь позвольте мне прокручивать вперед до самого верха, только для исправления этой линии здесь, чтобы изменить прототип, чтобы соответствовать. Но мне теперь нужно сделать еще одну вещь. Интуитивно, если я изменил типы аргументов, которые своп ожидает, Что еще мне нужно изменить в моем коде? Когда я звоню подкачки. Потому что сейчас, что же мне Я переходя к еще поменять? Х ценность и значение у, или молока и апельсиновый сок. Но я не хочу этого делать. Вместо этого я хочу передать в чем? Расположение х и расположение у. Каковы их почтовые адреса, так сказать. Таким образом, чтобы сделать это, есть амперсанд. Ampersand вида звучит как адреса. т. п., амперсанд, адрес х, а также адрес у. Так что это преднамеренное, которые мы используем амперсандах при вызове функции, и звезды при объявлении и когда реализации функции. И только подумайте, как амперсанд адрес оператора и звезды, как туда оператора - или, точнее, оператор разыменования. Так что в целом много слов просто сказать, что теперь, надеюсь, своп будет правильными. Позвольте мне пойти дальше и сделать - давайте на самом деле переименовать файл, чтобы эта программа по-прежнему не будут называть не свопа. Я утверждаю, что мы будем называть его swap.c сейчас. Поэтому убедитесь, своп. Точки, наклонной черты поменять. А теперь действительно, х = 1, у = 2. И затем, х равен 2, у равно единице. Ну давайте посмотрим, если мы не можем сделать этого немного по-другому, как к тому, что здесь происходит. Во-первых, позвольте мне увеличить на наш рисования экрана здесь. И позвольте мне предложить на мгновение - и всякий раз, когда я рисую здесь будет зеркально там сейчас - позвольте мне предложить, что Здесь целая куча памяти, или Оперативной памяти, внутри моего компьютера. И это будет укус числа, скажем, 1. Это будет байт номер 2. И я сделаю целый букет больше, и Затем куча многоточий многоточия точку, чтобы показывают, что есть 2000000000 из этих вещей. 4, 5, и так далее. Таким образом, есть первые пять байтов памяти моего компьютера. Все в порядке? Очень немногие из 2000000000. Но сейчас я собираюсь предложить следующем. Я собираюсь предложить, чтобы X собирается сохранить номер 1, а Y будет , чтобы сохранить номер 2. И позвольте мне теперь идти вперед и представляет эти значения следующим образом. Давайте сделаем это следующим образом. Дайте мне всего за одну секунду. Одна секунда. ОК. Я хочу сделать это немного - давайте сделаем это снова. В противном случае я собираюсь и использование те же номера, неумышленно, несколько раз. Так что у нас есть разные номера о чем поговорить, давайте назовем этот байт номер 123, 124, 125, 126, и точка точка точка. И позвольте мне утверждать теперь, что я собираюсь поместить значение 1 здесь, и значение 2 Здесь, иначе известный как х и у. Так уж случилось, что это х, это у. И только некоторые случайности, компьютер, операционная система, произошло положить х по месту нахождения номер 123. И у закончили в расположение 124 - черт побери. Я должен был это исправил. О человек, я действительно хочу это сделать? Да, я хочу, чтобы исправить это и В надлежащее об этом сегодня. К сожалению, новичок в этом. 127, 131, и я не хочу быть этим сложно, но почему я изменить номерах есть? Потому что я хочу, чтобы целыми на самом деле в четыре байта. Так что давайте быть супер анальный об этом. Так что если 1 происходит решать 123, 2 будет по адресу 127, потому что это всего в 4 прощания далеко. Вот и все. И мы забудем обо всех другим адресам в мире. Так что х находится в местоположении 123, Y находится в местоположении 127. А теперь, что же я на самом деле хотите сделать? Когда я звоню своп Теперь, что происходит на самом деле? Ну, когда я называю своп, я передаю в адрес х а также адрес у. Так, например, если эти две части бумаги в настоящее время представляют два Аргументы и B поменять, то, что я собираюсь написать на первом из них, которого я буду называть называть? Точно, 123. Так что это я утверждаю это. Это параметр. Я ставлю адрес X в там. Что это? Что это? Нет, нет. Это нормально. Тем не менее хорошо, все еще хорошо. Так что это. А теперь на второй лист бумаги, это будет B, и что я собираюсь писать на эта бумажка? 127. Так что единственное, что изменилось по сравнению с наши предыдущие показательным этой истории, буквально, а не 1 и 2, я собирается пройти в 123 и 127. И я сейчас собираюсь поставить внутри этих из этой рамки, все в порядке? Так что черный ящик в настоящее время представляет своп функции. Между тем, давайте теперь есть кто-то осуществлять своп функции. Кто-то здесь хотел стать волонтером? Поднимайся. Как тебя зовут? Чарли. Ладно, Чарли. Поднимайся. Так что Чарли будет играть роль нашего черного ящика. И Чарли, что я бы хотел, чтобы вы Теперь будет осуществлять обмен таким образом , что с учетом этих двух адреса, Вы были на самом деле происходит для изменения значений. И я буду шептать вам на ухо как запустить телевидение здесь. Так что давай, а ты черный ящик. Reach в там. Какие ценности Вы видите, и какие ценности вы видите для B? Чарли: составляет 123 и В 127. DAVID МАЛАН: ОК, это точно. Теперь остановимся там на мгновение. Первое, что вы собираетесь делать сейчас, в соответствии с кодом, - которые Теперь я буду тянуть на экране - будет выделить несколько бит памяти называется темп. Так что я собираюсь идти вперед и дать вам, что памяти. Так что это будет третья переменная что у вас есть доступными для Вы назвали темп. И что вы собираетесь написать Температура на листе бумаги? Чарли: указатели, не так ли? DAVID МАЛАН: Хорошо, ну не обязательно указателей. Таким образом, строка кода, что я выделены на правой стороне, давайте начнем там. Это говорит звезда. Так в настоящее время хранения номер 123. И так же, интуитивно, что сделал звездой 123 означает? А конкретно, если это 123, звезда означает, что? Значение. Или более небрежно, идите туда. Итак, позвольте мне предложить, что, держа в руки, идти вперед и лечения, что как будто это карта. И ходить к себе компьютера памяти, и найти то, что нам в точке 123. Именно так. Итак, мы видим в расположении 123 это то, что, очевидно? Итак, какое значение сейчас Вы собираются поставить в ТЕМР? Именно так. Так что идти вперед и делать это. И написать номер 1 на кусок бумаги, что в настоящее время под названием темп. А теперь следующий шаг, который Вы собираетесь реализовать будет что. Ну, с правой стороны Следующая строка кода является звездой б. B, из Конечно, хранятся адреса. В котором рассматриваются 127. Звезда B означает, что, случайно говорю? Перейдите в папку. Так идут вперед и найти нам, что в точке 127. ОК. Конечно, в положение 127, прежнему значению 2. Так чего же вы теперь собираетесь хранить при Что бы ни было на месте в? Так звезды средства идут на место. Что такое расположение? Именно так. Так что теперь, если вы хотите изменить что в этом месте - Я буду идти вперед и запустить Ластик здесь. И теперь вернуть его на кисти. Какой номер вы собираетесь написать в этом пустое поле сейчас? Именно так. Так что эту строку кода, чтобы было ясно - пусть мне прерваться, что Чарли делает и отметить здесь, что он только что сделали это написать в эту коробку в расположении 123 значение, которое было ранее в б. И поэтому мы сейчас действительно реализовано этот второй строки кода. Сейчас, к сожалению, есть еще одна линия остается. Теперь то, что в темп, в буквальном смысле? Очевидно, что это номер один. Это не адрес. Это просто числа, рода переменную из одной недели. И теперь, когда вы говорите, звезды B, это означает, что перейти по адресу B, которая имеет Конечно здесь. Поэтому, как только вы получите там - Я буду идти вперед и стереть то, что на самом деле там - и что вы собираюсь написать новой позиции 127? ЧАРЛИ: Темп, который является одним. DAVID МАЛАН: Темп, который является одним. И что происходит с температурой в конце концов? Ну, мы не знаем. Мы действительно не заботятся. Каждый раз, когда мы реализовали функцию До сих пор всех локальных переменных у вас есть действительно являются локальными. И они просто исчезают. Они утилизирован в операционной система в конечном итоге. Таким образом, тот факт, что температура по-прежнему имеет Значение 1 является своего рода принципиально неинтересные. Ладно, аплодисменты если бы мы могли для Чарли. Очень хорошо сделано. Ладно, так о чем еще делает это означает, что мы можем сделать? Вот и получается, что мы были говорить несколько белых лжи в течение достаточно долгого времени. В самом деле, получается, что строка, все это время, на самом деле не последовательность символов, как таковых. Это отчасти является то, что интуитивно. Но с формальной точки зрения, строка Тип данных, который мы объявили внутри CS50 библиотеку для упрощения мира в течение первых нескольких недель класса. Какая строка действительно является адресом символа где-то в памяти. Строка действительно номер, например, 123 или 127, что происходит, чтобы разграничить где строка начинается в компьютера памяти. Но она не представляет строка, по сути, себя. И мы видим это следующим образом. Позвольте мне идти вперед и открывать некоторый код, который среди источник сегодняшних примеров кода. И я собираюсь идти вперед и открыть до, скажем, сравнить-0.c. Это программа, которая багги собирается должны быть реализованы следующим образом. Первая. Я собираюсь кое-что сказать. Тогда я буду идти вперед и получить строку от пользователя , что в следующей строке. Тогда я собираюсь сказать это снова. Тогда я иду, чтобы получить другую строки от пользователя. И заметьте, я показываю один из строки в переменной с, а другой из этих строк в переменной T. И теперь я собираюсь утверждать, очень разумно, что если с равно равна т, строки одинаковы. Вы вводите то же самое. В противном случае, строки не то же самое. В конце концов, если мы введем два целых, два символы, двумя поплавками, два двухместных, любой из типы данных мы говорили о до сих пор их сравнивать - помню мы очень четко некоторое время назад что вы не делаете этого, потому что один знак равенства, конечно, оператора присваивания. Так что было бы ошибкой. Мы используем равную знак равенства, которые действительно сравнивает вещи для подлинного равенства. Но я утверждаю, что это детская коляска. Если я иду вперед и сделать сравнение нулю, и тогда точка слэш сравнить нулю. И я ввести, скажем, здравствуйте. А потом скажем еще раз привет. Буквально то же самое, компьютер претензии я набрал разные вещи. Теперь, может быть я просто опечатки. Я буду введите свое имя в этот раз. Я имею в виду, здравствуйте. Здравствуйте. Это разные каждый раз. Ну, почему же? Что происходит на самом деле под капотом? Ну, то, что происходит на самом деле под Капот Строка теперь Я набрал в тот первый раз, например, это слово привет, конечно. Но если представить это под капот, напомним, что строка в массиве. И мы так и сказал в прошлом. Так что, если я рисую этот массив, как это, я будет представлять нечто совершенно подобный тому, что мы сделали минуту назад. И на самом деле то специальные и здесь. Что мы определить было в в конце каждой строки? Да, эта нулевая обратная косая черта, которая является только способ представления, буквально, 00000000. Восемь бит 0 в ряд. Я не знаю, честно говоря, Что после этого. Это просто куча больше оперативной памяти внутри моего компьютера. Но это массив. Мы говорили о массивах раньше. И мы обычно говорим о массивах как расположение нулю, то один, то два. Но это только для удобства. И это совершенно относительное. Когда вы на самом деле получить память из компьютер, то, конечно, любой 2000000000 байт какой-то странной, потенциально. Так на самом деле под капотом, Все это время, да. Это вполне может быть кронштейн нулю. Но если копнуть еще глубже под капот, что на самом деле Номер адреса 123. Это адрес 124. Это адрес 125. И я не облажался на этот раз. Это теперь один байт друг от друга по какой причине? Насколько велика символ? Символ является только один байт. Целочисленное, как правило, четыре байта. Так вот почему я сделал это 123, 127, 131 и так далее. Теперь я могу держать простую математику и вобще плюс 1. И это теперь, что на самом деле происходит на под капотом. Поэтому, когда вы объявляете что-то вроде этого, Строка с, это на самом деле - получается - символ звезды. Star, конечно, означает адрес, иначе указатель. Так что это адрес что-то. Что это адрес? Ну - Я единственный, кто может видеть очень Важный момент я делаю, или думать Я делаю. Так строка - Печально то, у меня есть монитор именно там, где я возможно, не видел этого. Ладно, так что строка является то, что с Я объявил ранее. Но, оказывается, благодаря небольшой магии в библиотеке CS50, все это Строка времени буквально был символ звезды. Звезды снова означает, указатель или адреса. Тот факт, что это фланговые Слово символ означает, что это адрес символа. Так что если взять веревку называется, и я печатаю В H-Е-Л-Л-О, предлагать то, что сейчас получить Строка буквально возвращали все на этот раз, хотя мы довольно упрощенном мире? Что на самом деле получить строку вернуться в качестве возвращаемого значения? 123 в этом случае, например. Мы ранее заявили, что взять веревку просто возвращает строку, последовательность символов. Но это немного белой ложью. Способ получить строку действительно работает Под капотом он получает строки от пользователя. Он шлепает символов, которые он или она типа в памяти. Это ставит обратную косую черту Ноль в конце тех последовательности символов. Но тогда что же взять веревку буквально вернуть? Это буквально возвращает адрес первый байт в оперативной памяти, что она использовала для этого силы. И получается, что только путем возврата одного адреса первый символ в строке, то есть достаточный для нахождения совокупности строки. Другими словами, получают строка не имеет вернуть 123 и 124 и 125. Он не должен дать мне длинный Список всех байтов, которые моя строка использует. Потому что, они все спиной к спине. И два, основанной на первый адрес, я могу понять, где строка заканчивается. Каким образом? Специальный символ пустой, Обратная косая черта нуля в конце. Итак, другими словами, если Вы передаете вокруг - внутри переменных - адрес голец, и вы предполагаете, что в конце любой строки, любые последовательность символов, что мы, люди, думаю строк, если предположить, что в конце любого такого строка есть нулю обратную косую черту, вы золотой. Потому что всегда можно найти конца строки. Теперь то, что на самом деле то при переходе в этой программе? Почему эта программа, сравнить-0.c, багги? Что на самом деле сравнивается? Да? СТУДЕНТ: [неразборчиво]. DAVID МАЛАН: Совершенно верно. Это сопоставлени струн. Таким образом, если пользователь ввел Здравствуйте еще, как я сделал, память может в конечном итоге в таком виде. Если пользователь затем типов Здравствуйте еще раз, но по телефону получить строку снова, с- не особенно умный, если вы учите это быть умным путем написания кода. C - и компьютеров в целом - Если вы введете слово еще раз привет, Вы знаете, что вы собираетесь получить. Ты просто собираюсь получить второй массив памяти, что, да, бывает быть хранение H-E-L-L-вывода и так далее. Это будет выглядеть так же, чтобы нас, людей, но этот адрес не может быть 123. Это может быть просто так случилось, что операционная система имеет некоторые доступные пространстве, например, на месте - скажем нечто произвольное, как это расположение в 200. И это ячейка 201. И это расположение 202. Мы понятия не имею, где это будет в памяти. Но что это означает, что то, что будут храниться в конечном счете, в с? Номер 123. Что будет храниться в т, В этом примере произвольной? Номер 200. И все это означает, что то, очевидно, 123 не равно 200. И так, если это условие никогда оценивается как истина. Потому что взять веревку используют различные участков памяти каждый раз. Теперь мы можем видеть это снова в другом примере. Позвольте мне идти вперед и открывать копирования 0.c. Я утверждаю, что этот пример будет попробовать - но не в состоянии - для копирования двух строк следующим образом. Я собираюсь сказать что-то пользователю. Я тогда собирался получить Строка и назовите его с. И теперь, я делаю это здесь галочку. Мы упомянули это некоторое время назад. Но когда могли бы получить пустую строку возвращения, другого специального символа или для специальных Символ скажем так. Если это из памяти. Например, если пользователь действительно быть трудным и виды зверских Количество символов в Клавиатура и хитов Enter. Если это количество символов, просто не могу поместиться в оперативной памяти по какой-то сумасшедшей Причина, хорошо получить строка может очень хорошо возвращает нуль. Или, если ваша программа сама делает много других вещей, и есть только Не хватает памяти для получаю строку чтобы добиться успеха, это может кончиться тем, что вернулся пустым. Но давайте будем более точными относительно того, что это такое. Что такое тип данных с на самом деле? Char звезды. Вот и получается, теперь мы можем кожуры назад слой нулевых. Оказывается, NULL - да, очевидно, специальный символ. Но что это такое на самом деле? Действительно, NULL просто символ, что мы люди используют для замены нуля, а также. Таким образом, авторы С, и компьютеры более общо, решил лет назад , что, вы знаете, что. Почему бы нам не обеспечить, чтобы ни пользователь Данные никогда, никогда, никогда хранить при свидания нулю? В самом деле, даже в моем примере произвольного раньше, я не начала нумерации байт в нуле. Я начал работать в одном. Я знал, что люди в мире решили оставляем за собой нуля байт в оперативной памяти, как никому что-то особенное. Причина в том, в любое время вы хотите сигнал, что что-то пошло не так в отношении адресов, возвращается нулевой - иначе известный как нулевое - И потому, что вы не знаете, что нет никакой законны данные с нулевого адреса, четко это означает, что сообщение об ошибке. И именно поэтому мы, по соглашению, проверить за то, нулевой и обратной как один в таких случаях. Поэтому, если мы прокрутить вниз сейчас, это всего лишь Затем обработку ошибок, на всякий случай что-то пошло не так с [? залог?] в целом и выйти из программы , вернувшись рано. Эта линия в настоящее время может быть переписана как это, что означает, что? На левой стороне, дайте мне еще указатель на символ, и назовем его T. Что я хранении внутри т, основанных на этой одной строки кода? Я запись местоположения. В частности расположение , которая была в с. Таким образом, если пользователь ввел привет, и что первый привет происходит в конечном итоге здесь, то число 123 собирается вернуться из получить строку и хранить - Как мы говорили ранее - в с. Когда я объявляю указатель на другой символ и называют это т, что число буквально будет в конечном итоге в T в соответствии с историей? Так 123. Так что технически теперь оба с и т указывают на точное то же участков памяти. Так заметить, что я собираюсь сделать сейчас, чтобы доказать, что эта программа глючит. Сначала я собираюсь утверждать, с Печать F, спекулируя копия строки. Тогда я собираюсь сделать небольшой проверка на наличие ошибок. Я иду, чтобы убедиться. Давайте удостоверимся, что строка T находится в мере больше нуля в длину, так что есть некоторый характер на самом деле выгоду. И тогда вы, возможно, помните это от предыдущих примерах. 2 верхние - который находится в ctype.h файла. T Кронштейн нуля дает мне нулю символ строки т. И два верхних того же стоимости, Конечно, преобразует его в верхний регистр. Так интуитивно, благодаря выделенной линии кода делает ставку первым Письмо в т. Но это не капитализация, интуитивно, первая буква в с. Но если вы думаете вперед, то, что я смотреть, когда я запускаю эту программу и распечатать как оригинальные, сек, и так называемые копии, т? Они на самом деле будет то же самое. И почему они будет то же самое? Они оба указывают на ровно то же самое. Так давайте сделаем это. Сделайте копию нулю. В нем собрана OK. Позвольте мне запустить копию нулю. Позвольте мне что нибудь типа привет в все строчные затем нажмите Enter. И он утверждает, что и с оригинальным и копия действительно идентичны. Так что на самом деле произошло? Позвольте мне перерисовать эту картину просто чтобы рассказать историю в несколько иначе. Что происходит на самом деле под капот, когда я заявляю, что-то вроде символ начала с, или строка с, Я получаю указатель - который, оказывается, четыре байта В CS50 прибора и в большом количестве компьютеров. И я буду называть это с. И это в настоящее время имеет неизвестного значения. Когда вы не объявляете переменную, если Вы себя подставлять значение там, которые знает, что там. Это может быть некоторой случайной последовательности битов из предыдущего выполнения. Поэтому, когда я, по моему строка кода действительно получаем строки, а затем хранения возвращаемого значения в строку с так или иначе получить - и мы в конечном счете отогните как получить Строка работ, так или иначе выделяет массив, который, вероятно, выглядит как-нибудь так. H-E-L-L-О, обратный слэш нулю. Давайте предположим, что это адрес 123 только первая последовательность. Так что строка возвращается, в Выделенная строка есть, он возвращает числа мы уже говорили, 123. Так что же на самом деле происходит внутри с здесь? Ну, что действительно происходит Внутри с 123. Но, откровенно говоря, я получаю немного смущают все эти адреса, все эти произвольные числа. 123, 124, 127. Так что давайте на самом деле упрощения мире немного. Когда мы говорим об указателях, честно говоря, для нас, людей, кто, черт возьми, где заботится вещи в памяти? Это совершенно произвольно. Это будет зависеть от того, объем оперативной памяти у пользователя. Это будет зависеть от того, когда в тот же день вы запустите программу, пожалуй, и что введенные пользователем данные, дает тебе. Мы останавливаясь на несущественных деталей. Так что давайте абстрагироваться от и сказать, что, При выполнении строки кода, как это, символ звезды с получает возвращаемое Значение взять веревку. Почему бы нам не просто нарисовать, а не то, что мы звонят указатель, как будто это , указывая на что-то? Поэтому я утверждаю, что сейчас с до есть указатель - под капотом, что это адрес. Но это всего лишь указывает на первый байт строку, которая была возвращена. Если бы я сейчас вернуться к коду здесь, что происходит на этой линии? Ну, в этой выделенной линии сейчас, Я объявляю видимо другое переменную T. Но это также указатель, так что я собираюсь нарисовать ее, так как в теории, точное же размера коробки. И я буду называть его T. И теперь, если мы вернемся к коду снова, когда я с хранения внутри т, то, что я технически положить внутрь T? Ну технически это был номер 123. Так на самом деле я должен писать номер 123 там. Но давайте это более высокий уровень. т, если это только указатель Интуитивно, является именно это. Это все, что бытие там хранятся. Так что теперь в последние интересные строки кода, когда я на самом деле идти о капитализации символ ноль в т, что происходит? Ну, т кронштейна нуля теперь указывает к тому, что характер, по-видимому? Это указывает на час. Поскольку T Кронштейн нуля - Напомним, что это старый синтаксис. т кронштейна нуля просто означает, что если T является строка, т Кронштейн нуля означает получение нулевой символ в эту силу. Так что это действительно означает это зайти в этот массив - и да, это может быть 123, это может быть 124. Но это все относительно, помню. Всякий раз, когда говорят о массиве, у нас есть Преимущество говорить о относительные показатели. И вот теперь мы можем просто предположить, что Zero T кронштейн ч. Так что, если я называю 2 верхних на это, что это действительно делаете делает ставку строчная ч в верхний H. Но, конечно, то, что с? Это указывает на то же проклятое строку. Так что это все, что происходило В этом коде до сих пор. Так в чем же тогда последствия? Как это исправить эти две проблемы? Как мы можем сравнить с фактическими строками? Ну интуитивно, как бы вы идете по поводу сравнения двух Струны для подлинного равенства? Что значит, если два строки равны? Очевидно, что нет, что их адреса равными в памяти, потому что это низко Уровень детализации реализации. Все символы являются одинаковыми. Итак, позвольте мне предложить, и позвольте мне представить в версии одного из compare.c здесь, так что сравнить-1с. Позвольте мне предложить, что мы все еще получаем Указатель называется с, и магазин в нем вернуть значение взять веревку. Давайте сделаем то же самое с T. И никто из кода не отличаются. Я собираюсь добавить немного больше проверки ошибок сейчас. Так что теперь, когда мы вроде отслаивания это слоями в CS50, что строка на самом деле, мы должны быть более анальный о том, что мы не злоупотребляйте недопустимые значения как нулевые. Так что я просто собираюсь проверить. Если ей не равна утратившим Т не равным нулевой, это означает, что мы в порядке. Взять веревку не облажался получении любой из этих строк. И вы, возможно, может думаю сейчас, что вовсе STR CMP предположительно делать? Сравнение строк. Так что если вы в программе Java и прежде, Это похоже на равных метода в Строка класса. Но для тех из вас, кто не запрограммированы прежде, это всего лишь функция с. Это происходит, чтобы прийти в файл с именем string.h. Вот где они объявлены. И сравнение строк - Я на самом деле забывают его использование, но это не важно. Напомним, что мы можем сделать Человек, перемешать сравнения. И это будет воспитывать Linux Руководство программиста. И это, честно говоря, немного загадочным. Но я вижу здесь, что, да. Я должен включить string.h. И здесь говорится, под описанием " Функция сравнения строк сравнивает две строки S1 и S2. "И S1 и S2-видимому, являются два Аргументы, передаваемые дюйма Я не помню, что конст имеет значение, но теперь замечаю - и вы, возможно, видели это уже тогда, когда вы использовать справочные страницы, если вы все это есть - символ, что звезда просто синонимом бечевкой. Так он сравнивает две строки, S1 и S2, и возвращает целое число или равную или больше нуля если S1 находится, соответственно, быть меньше или совпадают, или быть больше, чем S2. Вот только очень сложный способ сказать что сравнение строк возвращается нулю, если две строки интуитивно идентичны, символ для символ в символ. Это возвращает отрицательное число, если с, в алфавитном порядке, предполагается предстать перед Т. Или возвращает положительное число, если ы должны идти за Т в алфавитном порядке. Так что с этой простой функции, мог Вы, например, сортировать целую кучу слов? Так что в этой новой версии, я собираюсь идти вперед и сделать compare1. Dot сравнить одну черту. Я буду вводить привет в нижнем регистре. Я собираюсь ввести привет в нижнем регистре снова. И к счастью теперь он понимает, Я напечатал то же самое. Между тем, если я печатаю в привет к снижению случае и привет в верхнем регистре и сравнить их, я набрал разные вещи. Поскольку не только адреса разные, но мы сравниваем разные персонажи снова и снова. Ну давайте и исправить одну Теперь другая проблема. Позвольте мне открыть версию одного из копию, которая теперь адресует этот вопрос следующим образом. А это будет выглядеть немного более сложной. Но если вы думаете о том, что проблема, которую мы нужно решить, мы надеемся, это будет очистить всего за момент. Таким образом, это первая строка, символ начала т, в С точки зрения непрофессионала может кто-то предложит то, что эта линия здесь означает? Char звезды т, что же это делаешь? Хорошо. Создать указатель на некоторый место в памяти. И позвольте мне уточнить его немного. Объявите переменную, которая будет хранить адрес некоторых символов в памяти, просто быть немного более правильным. Итак, теперь на правой стороне, у меня никогда не видел одну из этих функций раньше, Malloc. Но что же это значит? Распределение памяти. Распределения памяти. Так что не получается, до сих пор, мы действительно не было мощным способом просит операционную систему, дать мне некоторую память. Скорее, у нас теперь есть функция под названием Malloc, что делает именно это. Даже если это немного отвлечение прямо сейчас, отметим, что в между двумя скобках просто будет рядом. Где я набрал в вопросе метки могут быть числом. И это число означает, дайте мне 10 байт. Дайте мне 20 байт. Дайте мне 100 байт. И Malloc сделает все возможное, чтобы просить операционной системы - Linux, в данном случае - Эй, а их 100 байт доступной оперативной памяти? Если да, то вернуть эти байты мне возвращение адрес которого из эти байты, что ли? Самый первый. Так и здесь - и это преобладающее в C, в любое время вы дело с адресами? Вы почти всегда имеем дело с Первый такой адрес, независимо от того, насколько велика кусок памяти вы в настоящее время вернул, так сказать. Так давайте приступим здесь. Я пытаюсь выделить как количество байт, точно? Ну. Длина строки с - давайте делать конкретный пример. Если ей это привет, Н-Е-Л-Л-О, что длина строки с, очевидно? Так что это пять. Но я делаю плюс 1 о том, почему? Почему я хочу шесть байтов вместо пяти? Нулевой символ. Я не хочу бросить эту специальные нулевым символом. Потому что если я сделать копию Здравствуйте и просто делать H-E-L-L-O, но я не ставлю , что специальный символ, компьютер не могли бы, случайно, обратную косую черту нулю там для меня. И поэтому, если я пытаюсь выяснить, длину копии, я мог бы думать, что это 20 символов, или миллион символов, если я просто никогда не случится ударить обратную косую черту нулю. Так что нам нужно шесть байт H-E-L-L-О, обратный слэш нулю. А потом это просто быть супер анальный. Предположим, что я забыл, что размер символов есть. Мы постоянно говорят, что это один байт. И это обычно. В теории, это может быть что-то разными, на другом компьютере или другой компьютер. Вот и получается, что есть этот оператор называется SizeOf, что если вы передаете его имя типа данных - как угля или Интеллект, или поплавок - он скажет вам, динамично, сколько байт символ занимает на этом конкретного компьютера. Так что это просто эффективно как говорят раз 1 или Не раз вообще ничего. Но я делаю это только, чтобы быть супер анал, , что на всякий случай символ отличается на ваш компьютер по сравнению с моим, таким образом, математика всегда будет проверить. Наконец, здесь я проверять нулевые, которая всегда хорошая практика - опять же, любое время мы имеем дело с указателями. Если Malloc не был в состоянии дать мне шесть прощаний - что маловероятно, но на всякий случай - вернуться немедленно. А теперь, идти вперед и скопировать строки следующим образом. И это знакомый синтаксис хотя и в иной роли. Я собираюсь идти вперед и получить строку длина с и хранить его на русском языке. Я тогда собирался я от итерации равна нулю вплоть до N, больше или равно. Так что на каждой итерации, я поставил го характера с в го Характер T. Так что же на самом деле происходит под капотом здесь? Хорошо, если это, например, в с - и я набрал в слове H-Е-Л-Л-О и есть обратный слеш нулю. И опять же, это указывающем здесь. И вот теперь это т. И это указывает сейчас копию памяти, правильно? Malloc дал мне целую кусок памяти. Я не знаю, что первоначально В любом из этих мест. Так что я буду думать о них как о целую кучу вопросительных знаков. Но как только я начинаю цикл от нуля далее, вплоть до длины S, T Кронштейн нуля и кронштейном 1 т - и я положу это сейчас на верхнем - T Кронштейн нуля и с нулевым средним кронштейном , что я собираюсь быть копированием итеративно ч здесь, E-L-L-O. Плюс, потому что я сделал плюс 1, обратную косую черту нулю. Так что теперь в случае сравнить-1с, В конце концов, если я распечатать Капитализация т, мы должны видеть, что с не изменяется. Позвольте мне теперь идти вперед и делать это. Поэтому убедитесь, copy1. Dot слэш copy1. Я собираюсь ввести привет, Enter. А теперь обратите внимание, только копию были капитализированы. Потому что я действительно есть два участков памяти. К сожалению, вы можете сделать некоторые довольно плохое и довольно опасные вещи. Позвольте мне подтянуть пример здесь и сейчас, что дает нам пример несколько различных линий. Так что просто интуитивно здесь, первая линия кода, внутр звезду х, заявляет переменную х. И то, что тип данных этой переменной? Какой тип данных этой переменной? Это не было захватывающим. Тип данных десятичного звезды. Так что же это значит? X будет сохранить адрес Int. Вот как все просто. Y мы собираемся хранить адрес Int. Что такое третья линия кода там делает? Это распределение, сколько байт, скорее всего? Четыре. Из-за размера десятичного это вообще четыре, Malloc из четырех дает мне обратно адрес кусок память, первый из которых байт хранится в настоящее время в х. Сейчас мы движемся немного быстрее. Звезда X означает, что? Это значит, пойти на этот адрес и положить то, что число есть? , Число 42 есть. Звезда Y означает идти к тому, что при у , а также номер 13 там. Но подождите минуту. Что находится в Y на данный момент? Какой адрес у хранении? Мы не знаем, верно? Мы ни разу не использовать назначение оператор, содержащий у. Так у которое указано на второй линии код лишь некоторые мусора значение, большой вопросительный знак, так сказать. Оно может указывать случайным ни к чему в памяти, которая , как правило, плохо. Поэтому, как только мы попали эту линию там, звезды Y равно 13, что-то плохое, что-то очень плохое составляет около случиться с Бинки. Итак, давайте посмотрим, что будет в конечном итоге происходит с Бинки здесь, в эту минуту или так посмотреть. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -Эй, Бинки. Проснуться. Это время для указателя весело. -Что это? Узнайте о указатели? О, положительный герой. -Ну, для начала, я думаю, мы понадобится пару указателей. -OK. Этот код выделяет два указателя которые могут указывать на целые числа. -Хорошо, хорошо, я вижу два указателя. Но они, кажется, не быть указывая ни к чему. -Это верно. Первоначально, указателей не указывает ни на что. То, что они указывают на называются pointees, и их создания является отдельный шаг. -Ах, да, точно. Я знал, что. Pointees раздельные. Итак, как вы распределяете pointee? -OK. Ну, этот код создает новый целые pointee, и эта часть множества Х , чтобы указать на это. -Эй, это выглядит лучше. Так что сделайте это что-то делать. -OK. Я разыменовать х для хранения 42 числа в свой pointee. Для этого трюка, мне понадобится моя магия Жезл разыменования. -Ваша волшебная палочка разыменования? Э-э, это здорово. -Это то, что код выглядит следующим образом. Я просто установить количество, и - -Эй, посмотри. Там она идет. Так делают разыменования на X следующим стрелки для доступа к pointee. В этом случае, для хранения 42 в там. Эй, попробуйте использовать его, чтобы сохранить номер 13 через другой указатель, у. -OK. Я просто пойду сюда, чтобы у и получить число 13 создана. А затем взять палочку разыменования и просто - Ух ты! -О, привет. Это не сработало. Скажем, Бинки, я не думаю, разыменовании Y является хорошей идеей, Поскольку настройка pointee является отдельной стадии. И я не думаю, что мы когда-либо делали это. -Хм. Хороший вопрос. -Да, мы выделили у указателя. Но мы никогда не установить его на указывать на pointee. -Хм. Очень наблюдательны. -Эй, вы ищете Хорошо там, Бинки. Вы можете это исправить, так что у пунктов к тому же, как pointee х? -Конечно. Я буду использовать мою волшебную палочку присваивания указателя. -Разве что будет проблема, как раньше? -Нет. Это не касается pointees. Это просто меняет один указатель, чтобы указать к тому же, как другой. -О, я вижу. Теперь у указывает на том же месте, х. Так что ждите. Теперь у фиксировано. Она имеет pointee. Таким образом, вы можете попробовать палочку разыменования снова отправить по 13. -OK. Здесь идет. -Эй, посмотри на это. Теперь разыменовании работ по у. И потому, что указатели делятся что один pointee, они оба видят 13. -Да. Обмен. Какая разница. Так что мы будем теперь меняются местами? -О, смотри. У нас нет времени. -Но - -Просто помните, три Указатель правил. Номер один, основная структура является то, что у вас есть указатель. И он указывает к pointee. Но указатель и pointee раздельные. А распространенная ошибка заключается в создать указатель, но забудьте дали pointee. Номер два, разыменования указателя начинается на указатель, следуя своему стрелкой на доступ к его pointee. Как мы все знаем, это работает только, если есть является pointee, которая возвращается к Правило номер один. Номер три, присваивание указателя один указатель и изменяет его, чтобы указать на pointee же как еще один указатель. Таким образом, после назначения, два указателя будет указывать на тот же pointee. Иногда это называется обмен. А ну, вот и все, на самом деле. Прощай, прощай, сейчас. [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] DAVID МАЛАН: Так больше на указатели, больше на Бинки на следующей неделе. Увидимся в понедельник.