DAVID Malan: Saluton, kaj bonvenigas reen al CS50. Do tio estas la fino de semajno kvar. Nur unu anonco unua. Do la tn kvina lundo estas veni tien venas lundon. Ĉi tiu estas la ŝanco por ŝanĝi de SAT / UNSAT al letero grado, aŭ de letero lernojaro SAT / UNSAT. Annoyingly, tiu procezo faras postulas subskribo, ĉar vi devas plenigi unu el tiuj rozoj add / guto formoj. Ĉar teknike, la SAT / UNSAT versio kaj la letero lernojaro versio havas malsamajn katalogo nombroj. Sed ne estas granda interkonsento. Nur venis al mi aŭ al prirabu aŭ al Lauren en ajna punkto. Aŭ retpoŝtu al ni se vi ne havas la speco de paperoj vi bezonas hodiaŭ, kaj ni Estos certe helpos vin preni prizorgis ke antaŭ lundo. Bone, do hodiaŭ - fakte, ekzistas iom de eĥo. Ĉu ni tono min iomete? Akcepti. Do hodiaŭ, ni enkondukas temon konata kiel montriloj. Kaj mi agnoskas ke tio estas unu el la pli kompleksaj temoj kiuj ni emas kovri en ĉi tiu klaso, aŭ vere neniu enkonduka kurso, kiu uzas C. Sed gardu mian vorton por ĝi, aparte se via menso sentas iom pli fleksita hodiaŭ kaj en la semajnoj venonta. Ĝi ne estas reprezentanto de vi ricevas iu malbona en ĉi tio nur signifas ke ĝi estas aparte kompleksa temo ke mi promesas, kelkajn semajnojn sekve, similos tro okulfrape simpla en retrospekta. Mi ankoraŭ memoras ĝis la nuna tago. Mi sidis en Elliott Dining Hall, sidis apud mia TF Nishat Mehta, kiu estis loĝanto de Elliott domo. Kaj por iu kialo, tiu temon nur klakoj. Kiu estas diri, ke mi tro baraktis kun ĝi por iu kvanto de tempo, sed mi faros mian plejeblon por helpi eviti tiajn lukto kun temo kiu finfine estas sufiĉe potenca. Fakte, unu el la temoj ni diskutos en la semajnoj veni estas ke de sekureco, kaj kiel vi povas reale eksplodi maŝinoj en manieroj kiu ne estis intencita. Kaj tiuj ekspluatadoj estas tipe la rezulto de cimoj, erarojn, ke ni homoj faras por ne kompreni iujn de la subkuŝanta realigo detaloj vojo kiu programoj estas realigitaj. Nun fari ĉi ŝajnas des pli uzanto amika, mi pensis ke mi volonte ludos 10 dua antaŭvido de iom Claymation figuro nomita Binky kiu estis alportita al vivo de nia amiko en Stanford, profesoro Nick Parlante. Do permesu al mi doni al vi tiun teaser de Binky tie. [VIDEO reprodukto] -He, Binky. Veki. Estas tempo por puntero amuzo. -Kio estas tio? Lernu pri indikoj? Ho, goodie. [FINO reprodukto de vídeo] DAVID Malan: Tio estas Stanford komputiko. Do pli en la venonta. [Aplaŭdo] DAVID Malan: Pardonu, Nick. Do memoru ke lasta tempo ni finis la ĉi tio vere ekscita cliffhanger per kio tiu funkcio simple ne funkcias. Almenaŭ intuicie, li sentis kiel ĝi devus funkcii. Simple interŝanĝi la valorojn de du entjeroj. Sed memoru, ke kiam ni presas el la originalaj valoroj en ĉefa, kaj du, ili ankoraŭ unu kaj du kaj ne du kaj unu. Do mi vere ŝanĝi super la aparato. Kaj mi redaktis iom de skeletaj kodo antaŭi tie, kie mi asertas ke x estos 1, y estos 2. Mi tiam presi ambaŭ de liaj valorojn kun presitaj f. Mi do asertas cxi tie, ke Ni tuj interŝanĝi ilin. Mi lasis malplenan lokon tie por ni plenigi hodiaŭ en nur momento. Tiam, mi iros al postuli, ke la du variabloj estas interŝanĝitaj. Tiam mi tuj presi ilin denove. Kaj tial mi esperas, mi devus vidi 1, 2. 2, 1. Tio estas la super simpla celon nun. Nu do kiel ni irad swapping du variabloj? Nu, se mi proponas tie ĉi, ke tiuj tasoj povus reprezenti memoro en komputilo. Jen kelkaj pikoj, ĉi Estas alia malmultaj mordas. Ĉu ni volontulo veni tien kaj miksi nin iuj trinkaĵoj, se familiara? Venu supren. Kio estas via nomo? Jess: Jess. DAVID Malan: Jess? Venu supren, Jess. Se vi ne gravas, ni devas meti la Google Vitra sur vi tiel ni povas senmortigi ĉi. OK, vitro. Gravuri video. Kaj Bone, ni estas bonaj por iri kun Jess tie. Ĉio bone. Nice to meet you. Do kion mi ŝatus vi faras ĉi tie - se vi povus, sufiĉe rapide - nur verŝas ni duono glason da oranĝa suko kaj duono glason de lakto, reprezenti efike la nombroj 1 en unu taso kaj 2 en la aliaj taso. Ĉi tuj estos bona materialo. Jess: Pardonu. DAVID Malan: Ne, ne. Ĝi estas okej. Nice. Bone, do ni havas kvar bitokoj valoro de oranĝa suko. Ni nomis ĝin la valoro 1. Nun alia kvar bajtojn valoro de lakto. Nomos gxin taksos 2. Do x kaj y, respektive. Bone, do nun se la tasko ĉe manon - por vi, Jess, antaŭ ĉiuj de via samklasanoj - Estas por interŝanĝi la valorojn de x kaj y tiaj ke ni deziras ke la suko de oranĝo en la aliaj kaliko kaj de la lakto en ĉi tiu kaliko, kiel povus vin - antaŭ vi reale fari it - irad faras tion? OK, saĝaj decido. Do vi bezonas iom pli da memoro. Do ni rezervu temporal taso, se vi volas. Kaj nun procedi por interŝanĝi x kaj y. Bonega. Do tre bone farita. Thank you so much, Jess. Jen vi estas. Iom memoraĵo. Bone, do evidente, super simplan ideon. Tute intuicia ke ni bezonas iom pli stokado spaco - en ĉi tiu formo, taso - se ni vere volas interŝanĝi tiujn du variabloj. Do ni faru precize tion. Ĝis ĉi tie en inter kie mi asertas mi tuj estos faranta iu swapping, mi instruos vin antaŭeniri kaj deklari temp. Kaj Mi starigis gxin egala al, ni diru, x. Tiam mi tuj ŝanĝos la valoro de x nur kiel Jess faris tie kun la lakto kaj oranĝa suko esti egala al y. Kaj mi tuj ŝanĝos y al esti egala por ne x, ĉar nun ni estus metitaj en rondo, sed prefere temp. Kie mi provizore - aŭ kie Jess provizore metis la oranĝa suko antaŭ clobbering ke kaliko kun la lakto. Do lasu min iri antaŭen nun kaj faros tion. Ĝi nomiĝas noswap.c. Kaj nun mi kuros sen interŝanĝa. Kaj efektive mi vidas, se mi pligrandigi la fenestro iomete, por ke x estas 1, y estas 2. Kaj tiam x estas 2, y estas 1. Sed memoru ke lunde ni faris tion, iom malsame per kiu mi anstataŭ implementado helpanto funkcio, se vi volas, ke estis fakte nula. Mi vokis ĝin interŝanĝi. Mi donis ĝin du parametrojn, kaj mi nomis ili kaj mi nomis ilin b. Sincere, mi povus nomi ilin x kaj y. Estas nenio haltante min, por fari tion. Sed mi volas argumenti estas tiam iom ambigua. Pro memoro por lundo, ke ni asertis ke tiuj parametroj estis kopioj de la valoroj pasis in Do ĝuste salatoj kun via menso, mi pensas, se vi uzas ĝuste la sama variabloj. Do mi devos anstataŭ nomi ilin kaj b, nur por klareco. Sed ni povus nomi ilin plej ion ni volas. Kaj mi tuj kopii kaj almeti efektive tiu kodo de tie supre malsupren en ĉi tie. Ĉar mi ĵus vidis, ke ĝi funkcias. Do jen en sufiĉe bona formo. Kaj mi ŝanĝos mian x al mia x al mia y al b kaj mia y al b. Do alivorte, ĝusta sama logiko. La ĝusta sama afero ke Jess faris. Kaj tiam la afero mi devos fari supren ĉi tie, kompreneble, estas nun alpreĝi ĉi funkcio, aŭ nomas tiun funkcion. Do mi nomos tiun funkcion kun du enigoj, x kaj y, kaj sukceson Save. Bone, do funde la sama aĵo. Fakte, mi verŝajne faris la programon nenecese kompleksa por skribi funkcio kiu estas simple preni iuj ses linioj de kodo dum mi antaŭe estis implementado ĉi tio en nur tri. Do lasu min iri antaŭen nun kaj refari tiu, ne interŝanĝa. Bone, mi ŝraŭbita ĉi tien. Tio devus esti eraro, ke vi povus vidi pli komune kiel via programoj akiri pli kompleksa. Sed estas facila embaraso. Lasu min rulumi reen ĝis ĉi tie. Kaj kio estas la unua eraro mi vidas? Implicitan deklaron. Kion tio tipe indikas? Ho, mi forgesis la prototipo. Mi forgesis instrui la tradukilon, ke interŝanĝo tuj ekzistas kvankam li Ne ekzistas en la komenco de la programo. Do mi simple volis diri malplena, interŝanĝa, int, de int b, punktokomo. Do mi ne tuj reimplement ĝin. Sed nun egalas kio estas cxi tie. Kaj avizo, la foresto de punktokomo ĉi tie, kiu ne estas necesaj kiam apliki. Do lasu min refari tion, faru interŝanĝa. Multe pli bona formo. Kuru neniu interŝanĝa. Kaj damn it. Nun ni estas dorso kie ni estis en lundo, kie la afero ne interŝanĝi. Kaj kio estas la intuicia ekspliko cxar kial ĉi tiu estas la kazo? Jes? Lernanto: [inaudibles]. DAVID Malan: Ĝuste. Do a kaj b estas kopioj de x kaj y. Kaj fakte, iam vi estis nomante funkcio tiel malproksime, ke pasas variabloj kiel ints - same kiel interŝanĝa atendas tie - you guys estis pasanta en kopioj. Nun tio signifas ke ghi prenas iom de tempo, la dua partio, por la komputilo kopii la bitoj de unu variablo en la bitojn de la alia. Sed tio ne estas tiom granda interkonsento. Sed ili estas tamen kopion. Kaj tial nun, en la kunteksto de interŝanĝa, Mi fakte sukcese ŝanĝanta a kaj b. Fakte, ni faros rapidan prudento kontroli. Presi f a estas% i, novan linion. Kaj ni konekti al. Nun ni faru la samon kun b. Kaj ni faru la samon ĉi tie. Kaj nun, lasu min kopii tiujn samajn liniojn denove ĉe la malsupro de la funkcio post miaj tri linioj de interesaj povus esti ekzekutitaj, kaj presi kaj b plue. Do nun ni faru tion, faru interŝanĝa. Lasu min fari la fina fenestro iom pli alta, tiel ke ni povu vidi pli pri tio samtempe. Kaj kuri sen interŝanĝa. x estas 1, y estas 2. a estas 1, b estas 2. Kaj tiam, estas 2, b estas 1. Do ĝi funkcias, kiel Jess faris ĉi tie ene de interŝanĝa. Sed kompreneble, ĝi estas havi nenian efikon sur la variabloj en ĉefa. Do ni vidis lertaĵo per kiu ni povus ripari tion, ĉu ne? Kiam vi alfrontas ĉi scoping afero, vi povus simple liberigas kaj fari x kaj y kia variabloj anstataŭ? Vi povus fari ilin tutmonda. Metu ilin en la plejsupro de la dosiero kiel ni faris, eĉ en la ludo de 15. Ni uzas malloka variablo. Sed en la kunteksto de la ludo 15, ĝi estas racia havi tutmondan variablo kiu reprezentas la tabulo, ĉar la tuteco de 15.c estas ĉio pri apliko de tiu ludo. Tion la dosiero ekzistas por fari. Sed en tiu kazo ĉi tie, mi estas nomante funkcio interŝanĝa. Mi volas interŝanĝi du variabloj. Kaj ĝi devas komenci senti nur fuŝa se la solvon por ĉiuj niaj problemoj kiam ni kolizios atingo demandoj estas fari ĝin tutmonda. Ĉar tre rapide nia programo estas tuj fariĝis sufiĉe salaton. Kaj ni faris tion tre ŝpareme kiel rezulto en 15.c. Sed rezultu ke estas bona maniero entute. Lasu min reale reiri kaj forigi la presi f estas, nur por faciligi tiun kodon. Kaj lasu min proponas ke tiu ja estas malbona. Sed se mi anstataŭ aldoni en iu asteriskoj kaj la steloj, Mi povas anstataŭ turni ĉi funkcio en kiu estas fakte operacio. Do lasu min reiri tien kaj akcepti dirante asteriskoj estas ĉiam malfacila, do mi dirus steloj. Mi nur Fess ĝis tiu. Ĉio bone. Kaj nun, kion mi povos fari anstataŭ? Do unue: mi iros al precizigi ke anstataŭ pasante int en la interŝanĝa funkcio, mi estas anstataŭ de dironta int stelo. Nun, kion signifas la stelo indiki? Tiu estas, ke nocio de puntero ke Binky, la Claymation karaktero, estis raportante al antaŭ momento. Do, se ni diras int stelo, la signifo de ĉi nun, ke ne tuj estos pasis tra lia valoro. Tio ne tuj estos kopiitaj in Pli ĝuste, la adreso de a estas tuj estos pasis in Do memoru, ke ene de via komputilo Estas tuta amaso de memoro, alie konata kiel RAM. Kaj tio RAM estas nur tutan faskon da bajtoj. Do, se via Mac aŭ via PC havas du gigabajtoj, vi havas 2 miliardoj bajtoj da memoro. Nun ni simple supozu, ke nur por subteni la aĵojn bela kaj bonorda, ni atribui adreson - nombro - al ĉiu bajto de RAM en via komputilo. La unua bitoko de tiuj 2 biliono estas por numero nulo. La sekva estas bajto numero unu, numero du, la tuta vojo supren, dot dot punkto, al proksimume 2 milionoj. Do vi povos kalkuli la bajtoj de memoro en via komputilo. Do ni supozu, ke tio estas kion ni signifi per adreso. Do kiam mi vidas int stelo a, kio okazas esti aprobitaj en interŝanĝa nun estas la adreso de al. Ne lia valoro, sed estu lia bildkarto adreso estas, por tiel diri - lia situo en RAM. Kaj simile por b, mi tuj diri la samon. Mez, stelo, b. Kiel flanken, teknike la stelo povis iri en aliaj lokoj. Sed ni normigi sur la stelo estas dekstra flanko de la datumtipo. Do interŝanĝi subskribo nun signifas, donu al mi la adreso de int, kaj alvoko ke adreson al. Kaj donu al mi alian adreson de int kaj invitas ke adreso b. Sed nun mia kodo tie devas ŝanĝi. Ĉar se mi deklaras int temp - kiu estas ankoraŭ de tipo int - sed mi stoki en ĝi, kian valoron? Por esti klaraj, mi metante al kun la kodo kiel skribita ĝuste nun? Mi metas la situo en al. Sed mi ne zorgas pri la situo nun, ĉu ne? Temp ekzistas nur Jess 'tria tason ekzistis, por kiu celo? Stoki valoro. Lakto aŭ oranĝa suko. Ne vere stoki la adreso de ĉu de tiuj aferoj, kiuj sentas iom sensenca en ĉi tiu reala mondo kuntekston ĉiuokaze. Do vere, kion mi volas meti en temp ne estas la adreso de a, sed la enhavo de. Do, se a estas numero kiel 123, tio estas la 123rd bajto de memoro, ke nur hazarde estas okupanta, ke la valoro en hazarde estas okupanta. Se mi volas iri al tiu adreso, Mi bezonas diri stelo al. Simile, se mi ŝanĝus kio estas ĉe la adreso a, mi ŝanĝos ĉi por komenci. Se mi volas gardi en kio estas en la situo de kun kio estas en la loko je b, stelo b stelo. Do mallonge, eĉ se tiu ne estas sufiĉe enprofundigi en ankoraŭ - kaj mi ne volas atendi kiu estus tiom rapide - rimarki, ke ĉiuj mi faras estas prefixing tiujn stelojn al miaj variabloj, proverbo ne kaptu la valoroj. Ne ŝanĝu la valoroj. Sed ĝuste, iru al tiuj adresoj kaj akiri la valoron. Iru al tiu adreso kaj ŝanĝo la valoron tie. Do nun lasu min rulumi reen ĝis la supro, nur por ripari ĉi tiu linio tie, al ŝanĝi la prototipo por kongrui. Sed mi nun bezonas fari unu alia afero. Intuicie, se mi ŝanĝis la tipoj de argumentoj kion interŝanĝa atendas, kion alian mi bezonas ŝanĝi en mia kodo? Kiam mi vokas interŝanĝa. Ĉar nun, kio estas Mi pasis por interŝanĝi ankoraŭ? La valoro x kaj la valoro de y, aŭ la lakto kaj la oranĝa suko. Sed mi ne volas fari tion. Mi anstataŭ volas Iam en kio? La situo de x kaj la situo de y. Kio estas ilia poŝta adresoj, por tiel diri. Do fari tion, estas kaj-simbolo. Ampersand klaso de sonoj kiel adreso. tial n, ampersand, la adreso de x, kaj la adreso de y. Do ĝi estas intenca, ke ni uzas ampersands nominte la funkcio, kaj la steloj al la deklari kaj kiam realiganta la funkcio. Kaj ĝuste pensi signon kiel la adreso de operatoro, kaj stelo kiel la iri tien operatoro - aŭ, pli ĝuste, la dereference operatoro. Do tio estas tuta loto de vortoj nur por diri, ke nun, mi esperas, interŝanĝa tuj esti ĝusta. Lasu min antaŭeniri kaj realigi - ni fakte renomigi la dosieron, por ke tiu programo ankoraŭ nomi neniu interŝanĝa. Mi asertas, ke ni nomas ĝin swap.c nun. Do, interŝanĝi. Dot, oblikvo, interŝanĝi. Kaj nun ja, x estas 1, y estas 2. Kaj tiam, x estas 2, y estas unu. Nu vidu, se ni ne povas fari ĉi tion iom malsame kiel al kio okazas ĉi tie. Unue, lasu min zomi en nia desegnante ekrano tie. Kaj lasu min proponi dum momento - kaj ĉiufoje kiam mi desegnas tie estos spegulita tien nun - mi proponas ke jen tutan faskon da memoro, aŭ RAM, interne de mia komputilo. Kaj ĉi tio estos mordo numeron, diru, 1. Ĉi tiu estos bitokoj numero 2. Kaj Mi faros tutan faskon pli, kaj tiam faskon da dot dot dots al indikas ke ekzistas 2 milionoj pri tiuj aferoj. 4, 5, kaj tiel plu. Do estas la unuaj kvin bitokoj de mia komputilo memoro. Ĉio bone? Tre malmultaj el 2 miliardoj. Sed nun mi tuj proponi la jena. Mi tuj proponas ke x estas tuj stoki la numeron 1, kaj y tuj stoki la numero 2. Kaj lasu min iri antaŭen nun kaj reprezentas tiujn valorojn kiel sekvas. Ni faras tion kiel sekvas. Donu al mi nur unu sekundo. Unu sekundo. Akcepti. Mi volas fari ĉi iom - ni tion denove. Alie Mi tuj kaj uzante la samaj nombroj, senintence, plurfoje. Do ĝuste tial ni havas malsamajn numerojn paroli, ni nomas tion bajto numeron 123, 124, 125, 126, kaj dot dot dot. Kaj lasu min asertas nun ke mi iros al meti la valoro 1 tie, kaj la valoro 2 ĉi tie, alie sciata kiel x kaj y. Do ĝuste tial okazas, ke tiu estas x, ĉi tiu estas y. Kaj ĝuste per iu hazarda hazardo, la komputilo, la mastruma sistemo, okazis meti x je situo numeron 123. Kaj y finis je situo 124 - damn it. Mi devus esti fiksita ĉi. Ho viro, mi vere volas fari ĉi tion? Jes, mi volas ripari tion kaj b pozitiva pri ĉi tiu hodiaŭ. Pardonu, nova ĉe ĉi. 127, 131, kaj mi ne volas esti ĉi kompleksa, sed kial mi ŝanĝi la nombroj ekzistas? Ĉar mi volis la ints al fakte kvar bajtoj. Do ni estu super anal pri tio. Por ke se 1 pasas al adresita 123, la 2 tuj estos ĉe adreso 127 ĉar ĝi estas nur 4 byes for. Jen ĉio. Kaj ni forgesos pri ĉiuj de la aliaj adresoj en la mondo. Do x estas en loko 123, y estas en situo 127. Kaj nun, kion fari mi efektive volas fari? Kiam mi vokas interŝanĝa nun, kio estas efektive okazas? Nu, kiam mi vokas swap, mi pasis en la adreso de x kaj la adreso de y. Do ekzemple, se tiuj du pecoj de papero nun reprezentas la du argumentoj a kaj b por interŝanĝi, kion mi tuj skribos sur la unua el tiuj, kiun mi tuj vokos referi al kiel? Precize, 123. Do tio mi asertas estas. Ĉi tiu estas la parametro a. Mi metas la adreson de x en tie. Kio estas tio? Kio estas tio? Ne, ne. Tio estas okej. Ankoraŭ bone, ankoraŭ bona. Do tiu estas. Kaj nun la dua peco de papero, tiu tuj estos b, kaj kion mi tuj estos skribi sur ĉi tiu peco de papero? 127. Do la sola afero, kiu estas ŝanĝis ekde nia antaŭa rakonto de ĉi tiu historio estas, anstataŭ laŭvorte 1 kaj 2, mi tuj pasos en 123 kaj 127. Kaj mi nun tuj metos tiuj ene de ĉi tiu skatolo, en ordo? Por ke nigra skatolo nun reprezentas la interŝanĝa funkcio. Dume, ni nun havas iu apliki la interŝanĝa funkcio. Ĉu iu ĉi tien kiel volontulon? Venu supren. Kio estas via nomo? Charlie. Bone, Charlie. Venu supren. Do Charlie tuj ludos la rolo de nia nigra skatolo. Kaj Charlie, kion mi ŝatus ke vi faru nun estas apliki interŝanĝa en tia maniero kiu, donita de tiuj du adresoj, vi fakte tuj ŝanĝi la valorojn. Kaj mi flustri en via orelo kiel ruli la televido tie. Do iru antaŭen, kaj vi estas la nigra skatolo. Atingi tien. Kio valoroj vi vidas por, kaj kio valoroj vi vidas por b? Charlie: a estas 123 kaj b estas 127. DAVID Malan: OK, ĝuste. Nun paŭzo ekzistas por nur momento. La unua afero, kiun vi faros nun, laŭ la kodo - kiu Mi nun tiri supren sur la ekrano - tuj estos atribui iom iom da memoro nomata temp. Do mi tuj iros antaŭen kaj doni al vi, ke memoro. Do tiu tuj estos la tria variablo ke vi havas atingebla al vi nomis temp. Kaj kion vi intencas skribi en la temp peco de papero? Charlie: Pointers, ĉu ne? DAVID Malan: Bone, bone ne nepre montriloj. Do la linio de kodo, ke mi havas reliefigis dekstre mana flanko, ni komencu tie. Ĝi diras stelo al. Do nuntempe stokante la nombro 123. Kaj ĝuste intuicie, kion faris stelon 123 signifi? Sed konkrete, se a estas 123, stelo de signifas kion? La valoro de a. Aŭ pli hazarde, iru tien. Do mi proponas ke, tenante la a en via mano, iru antaŭen kaj trakti ke kvazaŭ ĝi estas mapo. Kaj iros mem transiris al la komputilo memoro, kaj trovi nin kio estas ĉe situo 123. Ekzakte. Do ni vidas en situo 123 Estas kio, evidente? Bone, do kion valoro nun vi tuj metos en temp? Ekzakte. Do iru antaŭen kaj fari tion. Kaj skribi la numero 1 en la peco de papero kiu estas aktuale titolita temp. Kaj nun la sekva paŝo, ke vi tuj apliki tuj estos kion. Nu, sur la dekstra flanko de la sekvanta linio de kodo estas stelo b. b, de Kompreneble, stokas adreson. Tio adresoj 127. Stelo b signifas kio, hazarde parolanta? Iru al tiu loko. Do iru antaŭen kaj trovi nin kio estas ĉe situo 127. Akcepti. Kompreneble, en loko 127, ankoraŭ estas la valoro 2. Do kion vi iras nun tendencas al kion ajn estas ĉe la situo en? Do stelo rimedon iri al la situon al. Kio estas la situo de? Ekzakte. Do nun, se vi volas ŝanĝi kio estas en tiu loko - Mi iros antaŭen kaj ruli la eraser estas ĉi tie. Kaj nun remetis ĝin sur la peniko. Kio nombro vi intencas skribi en tiu blanka skatolo nun? Ekzakte. Do ĉi tiu linio de kodo, por esti klara - lasu mi paŭzo kio Charlie faras kaj atentigi tie, kion li ĵus farita estas skribi en tiun skatolon je situo 123 la valoro kiu estis antaŭe je b. Kaj tial ni nun implementado ja tiu dua linio de kodo. Nun bedaŭrinde, ekzistas ankoraŭ unu linio restanton. Nun kio estas en temp, laŭvorte? Estas evidente la numero unu. Tio ne adreson. Estas nur numeron, ia variablo de semajno unu. Kaj nun, kiam vi diras stelo b, tio signifas iru al la adreso b, kiu estas de Kompreneble ĉi tie. Do iam vi ricevas tie - Mi iros antaŭen kaj viŝi kio estas reale tie - kaj kion vi estas tuj skribos nun situo 127? Charlie: Temp, kiu estas unu. DAVID Malan: Temp, kiu estas unu. Kaj kio okazas al temp en la fino? Nu, ni ne vere scias. Ni ne vere gravas. Ajna tempo ni implementado funkcio ĝis nun, neniu lokajn variablojn vi havas estas efektive loka. Kaj ili simple malaperos. Ili rekuperita de la mastruma sistemo fine. Do la fakto ke temp ankoraŭ havas la valoro 1 estas speco de funde neinteresa al ni. Bone, do ronda da aplaŭdoj se ni povis por Charlie. Tre bone farita. Bone, do kion faras pli tio signifas ke ni povas fari? Do rezultas ke ni estis rakontante kelkajn blankajn mensogoj por sufiĉe tempo. Efektive, ĝi rezultas ke ĉeno, ĉio ĉi momento, ne estas vere vico de signoj per si mem. Ĉio estas ke intuicie. Sed teknike parolante, kordo estas datumtipo, ke ni deklaris ene de la CS50 biblioteko por simpligi la mondo por la unuaj semajnoj de klaso. Kia string vere estas la adreso de gravulo ie en RAM. Kordo estas vere nombro, kiel 123 aŭ 127, kiu okazas al demarcar kie a string komencas en via komputilo memoro. Sed ĝi ne reprezentas la kordo, per, mem. Kaj ni povas vidi ĉi tion kiel sekvas. Lasu min kaj malfermu iu kodo kiu estas inter hodiaŭa fontkodon ekzemploj. Kaj mi tuj iros antaŭen kaj malfermi ĝis, ni diru, komparu-0.c. Tio ĉi estas kalesxon programo kiu tuj esti implementado kiel sekvas. Unua. Mi intencis diri ion. Tiam mi tuj iros antaŭen kaj akiri kordo de la uzanto en tiu sekva linio. Tiam mi tuj diros ĝin denove. Tiam mi iros por atingi alian kordoj de la uzanto. Kaj avizo, mi montras unu el la kordoj en variablo nomita s, kaj alia de tiuj kordoj en variablo nomas t. Kaj nun mi iras al postuli, tre prudente, ke se s egalas egalas t, la ŝnuroj estas la sama. Vi tajpas la saman aferon. Alie, la kordoj estas ne la sama aĵo. Post ĉiu, se ni enigo du ints, du signoj, du flosoj, du duobloj, iu el la datumtipoj ni parolis pri ĝis nun por kompari ilin - Recall ni faris tre klara tempon ke vi ne fari tion, ĉar sola egala signo estas kompreneble la atribuo operatoro. Do kiu estus eraro. Ni uzas la egalaj egala signo, kio efektive komparas aĵoj por vera egaleco. Sed mi asertas ĉi estas kalesxo. Se mi iras antaŭen kaj fari kompari nulo, kaj do skalara oblikvo kompari nulo. Kaj mi tajpas en, ni diru, saluton. Kaj tiam diru saluton denove. Laŭvorte la sama afero, la komputilo asertas mi tajpis malsamaj aĵoj. Nun eble mi simple mistyped ion. Mi tajpas mian nomon ĉi tiu tempo. Mi volas diri, saluton. Saluton. Estas malsamaj ĉiun solan fojon. Nu, kial estas tio? Kio vere okazas sub la kapuĉo? Nu, kio vere okazas sube la kapuĉo estas la kordo tiam Mi tajpis en tiu unua momento ekzemple estas la vorto saluton, kompreneble. Sed se ni reprezentas ĉi sube la kapuĉo, memoru, ke cxeno estas en tabelo. Kaj ni diris tiel en la estinteco. Do se mi desegnas tiu tabelo kiel ĉi tio, mi iri por reprezenti iun sufiĉe simila al kion ni faris antaŭ momento. Kaj estas vere io speciala ĉi tie ankaŭ. Kion ni determini estis ĉe la fino de ĉiu kordo? Jes, tiu backslash nulo, kiu estas nur la maniero reprezenti, laŭvorte, 00000000. Ok 0 bitoj en unu vico. Mi ne scias, sincere, kio estas post tio. Tio estas nur plenmano pli RAM ene de mia komputilo. Sed tio estas tabelo. Ni parolis pri arrays antaŭe. Kaj ni tipe paroli pri matricoj kiel situo nulo, tiam unu, tiam du. Sed tio estas nur por oportuneco. Kaj tio estas tute relativaj. Kiam vi efektive atingi memoron de la komputilo, estas kompreneble neniu 2 miliardoj iuj neparaj bajtoj, potenciale. Do vere sub la kapuĉo, tiu tuta tempo, jes. Tiu povus tre bone esti krampo nulo. Sed se vi fosas eĉ pli profunda sube la kapuĉo, tio estas vere trakti numeron 123. Jen adreso 124. Jen adreso 125. Kaj mi ne firmigu ĝis tiu tempo. Tiuj estas nun unu bitokoj aparte pro kio? Kiom grandaj estas char? A char estas nur unu bajto. An int estas tipe kvar bajtoj. Tial estas kial mi faris 123, 127, 131 kaj tiel plu. Nun mi povas gardi la math simpla kaj nur faru plus 1. Kaj jen estas nun kio vere tuj sur sub la kapuĉo. Do kiam vi deklaras iun kiel ĉi tio, kordo s, ĉi tiu estas fakte - rezultas - char stelo. Stelo, kompreneble, signifas adreso, aka puntero. Do estas la adreso de io. Kio estas la adreso de? Nu - Mi estas la sola kiu povas vidi la tre Grava punkto mi faras, aŭ pensi Mi faras. Do kordo - la malĝoja afero estas Mi havas monitoron Dekstre, kie mi povus esti vidinta tion. Bone, do string s estas kion Mi deklaris antaŭe. Sed rezultas, danke al iom magio en la CS50 biblioteko, ĉiuj ĉi tempo ŝnuro havas laŭvorte estis char stelo. La stelo denove signifas puntero aŭ adreson. La fakto ke ĝi estas flanqueándola la vorto char signifas tio estas la adreso de gravulo. Do se akiri kordoj estas nomita, kaj mi tajpas en H-E-L-L-O, proponas nun kio akiri kordo laŭvorte estis reveni ĉiuj ĉi tiu tempo, ecx kvankam ni prefere trosimpligita la mondo? Kion akiri string reale revenu kiel lia reveno valoro? 123 en ĉi tiu kazo, ekzemple. Ni antaŭe diris, ke atingi kordo simple resendas kordo, sekvenco de gravuloj. Sed tio iom de blanka mensogo. La maniero akiri ŝnuro vere laboras sub la kapuĉo estas ricevas kordoj de la uzanto. Ĝi plops la karakteroj kiuj li aŭ ŝi tipoj en memoro. Ĝi metas backslash nulo je la fino de tiuj vico de signoj. Sed tiam kion signifas akiri kordo laŭvorte reveni? Ĝi laŭvorte redonas la adreson de la tre unua bajtoj en la RAM ke ĝi uzis por tiu forto. Kaj ĝi rezultas ke nur reveninte sola adreso de la unua gravulo en la ĉenon, tio estas sufiĉa por trovi la tuteco de la kordo. En aliaj vortoj, get kordo ne havas reveni 123 kaj 124 kaj 125. Ĝi ne devas doni al mi longan Listo de ĉiuj bitokoj ke miaj ŝnuroj estas uzanta. Ĉar unu, ili ĉiuj estas malantaŭo al malantaŭo. Kaj du, bazita sur la unua adreso, mi povas diveni kie la kordo finiĝas. Kiel? La speciala nula karaktero, la backslash nulo je la fino. Do, en aliaj vortoj, se sekvinberoj ĉirkaŭ - ene de variabloj - la adreso de char, kaj vi supozos ke je la fino de ĉiu linio, ĉiu vico de signoj kiel ni homoj pensi pri kordoj, se vi supozas ke fine de tia ĉeno ekzistas a backslash nulo, vi estas ora. Ĉar vi povas ĉiam trovi la finon de ŝnuro. Nun kio vere tiam tuj en ĉi tiu programo? Kial estas ĉi programo, kompari-0.c, kalesxo? Kio estas fakte esti komparitaj? Jes? Lernanto: [inaudibles]. DAVID Malan: Ĝuste. Oni komparas la lokoj de la kordoj. Do, se la uzanto tajpas en saluton fojo, kiel mi agis, memoro povus fini rigardante kiel ĉi tio. Se la uzanto poste tipoj en saluton denove, sed nomante akiri kordo denove, c estas ne estas aparte lerta se vi instruas ĝin esti ruza per skribanta kodo. C - kaj komputiloj pli ĝenerale - se vi tajpas en la vorto saluton denove, vi scias kion vi ricevos. Vi nur ricevos duan tabelo de memoro, ke, jes, okazas esti stokante H-E-L-L-O kaj tiel plu. Ĝi tuj serĉos la sama al ni homoj, sed tiu adreso povus ne esti 123. Eble ĝuste tiel okazi, ke la mastruma sistemo havas kelkajn havebla spaco ekzemple en loko - diru ion arbitraj, kiel tiu estas situo 200. Kaj jen estas situo 201. Kaj jen estas situo 202. Ni ne havas ideon kie tio tuj estos en la memoro. Sed kion tio signifas estas ke kio estas tuj estos stokitaj finfine en s? La nombro 123. Kio okazas al esti stokita en t, en ĉi arbitra ekzemplo? La nombro 200. Kaj cxiuj, kiuj signifas do estas evidente, 123 ne egalas 200. Kaj tiel ĉi se kondiĉo neniam taksas al vera. Ĉar get string uzas malsamajn pecoj de memoro ĉiufoje. Nun ni povas vidi ĉi denove en alia ekzemplo. Lasu min kaj malfermu kopio-0.c. Mi asertas ke ĉi tiu ekzemplo tuj provu - sed malsukcesos - kopii du kordoj kiel sekvas. Mi intencis diri ion al la uzanto. Mi tiam tuj akiri kordo kaj nomas ĝin s. Kaj nun, mi faras ĉi ĉekon tie. Ni menciis tiun momenton dorso. Sed kiam oni eble string reveno nula, alia speciala karaktero, aŭ speciala simbolo Diru. Se ĝi estas el memoro. Ekzemple, se la uzanto estas vere esti malfacila kaj tipoj atroz nombro da signoj en la klavaro kaj sukcesojn Eniru. Se tiu numero de karakteroj nur ne povas konformi RAM por ajn freneza Tial, bone akiri kordoj povus tre bone reveni nula. Aŭ se via programo mem faras multan de aliaj aĵoj kaj tie estas nur Ne sufiĉas la memoro por get kordo sukcesos, ĝi povus fini supren reveni nula. Sed ni esti pli preciza pri kio tio estas. Kio estas s la datumtipo vere? Char stelo. Do rezultas nun ni povas senŝeligi apogi la mantelo de nula. Rezultas, nula estas - jes, evidente speciala simbolo. Sed kio estas vero? Vere, nula estas nur simbolo, ke ni homoj uzas por reprezenti nulo kiel bone. Do la aŭtoroj de C, kaj komputiloj pli ĝenerale, decidis jarojn ke, vi scias kion. Kial ni ne garantias ke neniu uzanto datenoj estas eterne, eterne, iam stokita ĉe bye nulo? Fakte, eĉ en mia arbitra ekzemplo antaŭe, mi ne komencu kalkuli la bajtoj je nulo. Mi komencis je unu. CXar Mi sciis, ke homoj en la mondo decidis rezervi la nula bajto en ies memoro RAM kiel io speciala. La kialo estas, iam ajn vi volas signalas ke iu iris malbone rilate al adresoj, vi revenis nula - alie sciata kiel nulo - kaj ĉar vi scias, ke tie estas neniu Legit datumojn al adreso nulo, klare tio signifas eraron. Kaj jen kial ni, per konvencio, kontrolu por nulaj kaj reveno ion kiel en tiuj kazoj. Do, se ni rulumu malsupren nun, ĉi tio estas nur tiam iu eraro kontrolanta, ĉiaokaze io estis malbone kun [? garantiaĵo?] entute kaj forlasis la programon per reveni frue. Ĉi tiu linio nun povus esti reskribita kiel tiu, kiu signifas kion? Maldekstre mana flanko, donu al mi alian puntero al gravulo, kaj nomas ĝin t. Kion mi provizon ene de t, bazita sur ĉi tiu linio de kodo? Mi stokante a loko. Specife la situo kiu estis en s. Do, se la uzanto tajpas en saluton, kaj tiu unua saluton okazas por fini ĉi tie, tiam la nombro 123 estas tuj revenis el akiri String kaj stoki - kiel ni diris antaŭe - en s. Kiam mi nun rakontos alian sagon al oni char kaj nomas ĝin t, kion nombro estas laŭvorte tuj finos en t laŭ la rakonto? Do 123. Do teknike nun ambaŭ s kaj t notas al la ĝusta samajn pecojn de memoro. Do rimarkas kion mi faros nun al pruvi ke ĉi tiu programo estas kalesxo. Unue mi iros al postuli, kun impreso f, capitalizando la kopio de la kordo. Tiam Mi faros iom Eraro checking. Mi iros por certiĝi. Ni certigu ke la kordo t estas en Almenaŭ pli granda ol nulo en longeco tial ekzistas iuj karaktero tie por fakte profiti. Kaj tiam vi eble memoras tiun el antaŭaj ekzemploj. 2 supran - kiu estas en la ctype.h dosiero. T krampo nulo donas al mi la nulo karaktero de la kordo t. Kaj 2 supra de tiu sama valoro, de Kompreneble, konvertas ĝin al majuskle. Do intuicie, ĉi emfazita linio de kodo estas capitalizando la unua letero en t. Sed gxi ne capitalizando, intuicie, la unua litero en s. Sed se vi pensas antaŭe, kion mi por vidi kiam mi kuros ĉi programo kaj presi ambaŭ la originalo, s, kaj la tiel nomataj kopio, t? Ili estas vere tuj estos la sama. Kaj kial ili tuj estos la sama? Ili ambaŭ montras al precize la sama afero. Do ni faru tion. Faru kopion nulo. Ĝi kompilas OK. Permesu al mi kuri kopio nulo. Lasu min tajpi iun kiel saluton en ĉiuj minuskla tiam batis Eniru. Kaj asertas ke ambaŭ la originala s kaj la kopio estas ja identaj. Do kio vere okazis tie? Lasu min redesegni tiu bildo nur por rakonti la historion en iomete malsama maniero. Kio vere okazas sub la kapuĉo kiam mi deklaras ion kiel char komenco s, aŭ kordo s, Mi prenanta puntero - kio okazas al esti kvar bitokoj en la CS50 aparato kaj en multaj komputiloj. Kaj mi tuj nomas tiun ejon. Kaj tion nuntempe havas iu nekonata valoro. Kiam vi deklaras variablon, se vi vi mem metas valoron tie, kiu scias, kio estas tie. Ĝi povus esti iu hazarda vico de bitoj de la antaŭa ekzekuto. Do, kiam mi, en mia linio de kodo fari akiri ŝnuro, kaj poste stokas la reveno valoro en s akiri string iel - kaj ni fine senŝeligas reen kiel akiri kordo verkoj, iel atribuas al tabelo kiu probable aspektas iom kiel ĉi tio. H-Kaj-L-L-O, backslash nulo. Ni supozu, ke tio estas adreso 123 ĝuste unua konsekvenca. Do nepre string revenas, en la emfazita linio tie, ĝi redonas la numeron ni diris, 123. Do kio vere iras ene de s here? Nu, kio vere iras ene de s estas 123. Sed sincere, mi ricevas iom konfuzita de ĉiuj el tiuj adresoj, ĉiuj el tiuj arbitraj nombroj. 123, 124, 127. Do ni vere simpligi la mondo iom. Kiam ni parolas pri indikoj, sincere, al ni homoj, kiu la heck zorgas kie aĵoj estas en memoro? Tio estas tute arbitra. Ĝi tuj dependos de kiom multe virsxafo la uzanto havas. Ĝi tuj dependas de kiam en la tago vi ruli la programaron, eble, kaj kio enigo la uzanto donas al vi. Ni logxis en negrava detaloj. Do ni abstrakta for kaj diri ke, kiam vi kuras linion de kodo kiel oriento, char stelo s ricevas la reveno valoro de get kordo. Kial ni ne anstataŭ ĝuste desegni kion ni teni nomante puntero kvazaŭ ĝi estas montrante iun? Do mi asertas nun ke s supren estas puntero - sub la kapuĉo ĝi estas adreso. Sed ĝi estas ĝuste montrante la unua bitoko en la ĉeno kiu estas estinta revenis. Se mi nun revenu al la kodo tie ĉi, kio okazas ĉe ĉi tiu linio? Nu, en ĉi emfazita linio nun, Mi deklarante ŝajne alia variablo nomas t. Sed estas ankaŭ pointer, do mi tuj desegni ĝin kiel, en teorio, la ĝusta samgrandaj skatolo. Kaj mi tuj nomas ĝin t. Kaj nun se ni reiru al la kodo denove, kiam mi stoki s ene de t, kion mi teknike metante ene de t? Nu teknike, tiu estis la numero 123. Do vere mi devus skribi la nombro 123 tie. Sed ni prenu ĝin pli alta nivelo. t, se ĝi estas nur pointer, intuicie, estas ĝuste tio. Tio estas ĉio tio, kio estas stokita en tie. Do nun en la lastaj interesaj linioj de kodo, kiam mi vere irad capitalizando la nula karaktero en t, kio okazas? Nu, t krampo nulo estas nun notas al kio karaktero, supozeble? Ĝi estas indikante h. Ĉar t krampo nulo - memoras, tiu estas maljuna sintakso. t krampo nulo nur signifas se t estas ĉeno, t krampo nulo signifas atingi la nula karakteron en tiu forto. Do kion tio vere signifas estas iri al tiu tabelo - kaj jes, tiu povus esti 123, povas esti tiu 124. Sed estas tute relativaj, memori. Kiam ajn parolas tabelo, ni havas la avantaĝo de parolas relativa indeksoj. Kaj tial ni nun povas nur supozi ke t krampo nulo estas h. Do se mi nomas 2 supra sur ĝi, kio tio estas vere faras estas capitalizando la minuskla h al majuskle H. Sed kompreneble, kio estas s? Ĝi montris la saman Darn kordo. Do tio estas ĉio tio, kio estis okazante en ĉi tiu kodo ĝis nun. Do kio estas do la implico? Kiel ni ripari tiujn du problemojn? Kiel ni komparu al reala kordoj? Nu intuicie, kiel farus vi ĉirkaŭiras komparas du kordoj por vera egaleco? Kion tio signifas se du kordoj estas egalaj? Klare ne ke iliaj adresoj estas egali en memoro, ĉar tio estas malalta nivelo efektivigo detalo. Ĉiuj signoj estas la samaj. Do mi proponas, kaj lasu min enkonduki en la versio de compare.c ĉi tie, do kompari-1.c. Permesu al mi proponi ke ni ankoraŭ akiri pointer nomita s, kaj vendejo en tio la redoni valoro de get kordo. Ni faros la samon kun t. Do neniu el la kodo estas malsamaj. Mi tuj aldonos iom pli eraron kontrolinte nun. Do nun ke ni estas speco de senŝeligante reen ĉi tavoloj en CS50 de kia kordo efektive estas, ni devas esti pli anal pri certigi ke ni ne trouzi nevalida valoroj kiel nula. Do mi simple tuj kontroli. Se s ne egala nula kaj t ne egala nula, tio signifas ke ni estas okej. Get kordo ne firmigu ĝis atingi ĉu de tiuj ŝnuroj. Kaj vi povas eble diveni nun, kion ne STR CMP supozeble faras? String kompari. Do se vi havas programon en java antaŭ, ĉi tio estas kiel la egalaj metodo en la kordo klaso. Sed por tiuj el vi, kiuj ne havas planita antaŭ, ĉi tio estas nur c funkcio. Ĝi okazas veni en dosiero nomata string.h. Tie estas kie ĝi estas deklarita. Kaj string kompari - Mi fakte forgesis lian uzadon, sed ne gravas tio. Memoru ke ni povas fari homo, instigi kompari. Kaj jen tuj alportu la Linukso programistoj manlibro. Kaj estas, sincere, iom kamufla. Sed mi povas vidi ĉi tie ke, yep. Mi devas inkluzivi string.h. Kaj ĝi diras ĉi tie sub priskribon, "la kordo Komparu funkcio komparas la du kordoj S1 kaj S2. "Kaj S1 kaj S2 estas ŝajne la du argumentoj pasis in Mi ne vere memoras kio const estas, sed nun rimarkas - kaj vi vidas cxi tiun jam kiam vi jam uzas la paĝoj de man se vi havi ĉion - ke char stelo estas simple sinonimo kun kordoj. Do ĝi komparas la du kordoj, S1 kaj S2, kaj denove entjero malpli ol aŭ egala al aŭ pli granda ol nulo se S1 estas trovita, respektive, por esti malpli ol, aŭ kongruas, aŭ esti pli granda ol S2. Tio estas nur tre kompleksa maniero diri ke kordo kompari revenas nulo se du kordoj estas intuicie identa, karaktero por karakteron por karaktero. Denove negativa nombro se s, alfabete, supozas veni antaux t. Aŭ redonas pozitiva nombro se s supozas veni post t alfabete. Do kun tiu simpla funkcio, povis vi, ekzemple, ordigi tutan faskon da vortoj? Do, en tiu nova versio, mi tuj por antaŭeniri kaj realigi compare1. Dot oblikvo kompari unu. Mi tajpas en saluton en ĉiuj minuskloj. Mi tuj tajpi en saluton en la tuta minuskla denove. Kaj dankeme nun rimarkas Mi tajpis la saman aferon. Dume, se mi tajpas en saluton en suba kazo kaj SALUTON en majusklo kaj kompari ilin, mi tajpis malsamaj aferoj. Ĉar ne nur estas la adresoj malsamaj, sed ni komparas malsamaj karakteroj denove kaj denove. Nu ni iru kaj fiksi unu alia problemo nun. Permesu al mi malfermi versio unu el kopio, kiu nun direktas ĉi tiu afero kiel sekvas. Kaj ĉi tiu tuj rigardi iom pli kompleksa. Sed se vi pensas pri kio problemo oni bezonas solvi, espereble tio estos certe en nur momento nun. Do tiu unua linio, char komenco t, en lego de terminoj povus iu proponi kio estas tiu linio tie signifas? Char stelo t, kio estas tio faras? Bona. Krei puntero al iu loko en memoro. Kaj lasu min rafini gxin iomete. Deklari variablon kiu stokas la adreso de iu char en memoro, nur esti iom pli ĝentila. Bone, do nun la dekstra flanko, mi havas neniam vidis unu de tiuj funkcioj antaŭe, malloc. Sed kio povus signifas? Atribuo de memoro. Memoro atribuo. Do rezultas, ĝis nun, ni ne vere havis potencan vojo de petante la mastruma sistemo, donu al mi iom memoro. Pli ĝuste, ni nun havas funkcion nomita malloc kiu faras ĝuste tion. Kvankam tio estas iom de distro ĝuste nun, rimarki ke en inter la du parentezoj nur tuj estos numeron. Kie mi tajpis en demando markoj povas esti numero. Kaj tiu numero signifas, donu al mi 10 bajtoj. Donu al mi 20 bajtoj. Donu al mi 100 bajtoj. Kaj malloc faros lian best demandas la mastruma sistemo - Linukso, en ĉi tiu kazo - bona, estas ilia 100 bitokoj de RAM disponebla? Se jes, revenu tiuj bajtoj al mi per redonante la adreso de kiu el tiuj bitokoj, eble? La tre unua. Do jen ankaŭ - kaj tio estas superreganta en C, iam vi kontraktanta kun adresoj? Vi preskaŭ ĉiam traktas la unua tia adreso, kiel ajn granda eron de memoro vi esti enmanigis dorso, por tiel diri. Do ni plonĝi en ĉi tie. Mi klopodas destini kiel multaj bajtoj, ekzakte? Nu. String longo de s - ni fari konkretan ekzemplon. Se s estas saluton, H-E-L-L-Ho, kio estas la korda longeco de s, evidente? Do ĝi estas kvin. Sed mi faras plus 1 en tio, kial? Kial mi volas ses bitokoj anstataŭ kvin? La nula karaktero. Mi ne volas forlasi cxi tiun speciala nula karaktero. Ĉar se mi faras kopion de Saluton kaj nur faru H-E-L-L-Ho, sed mi ne metas tiu speciala karaktero, la komputilo ne havu, por hazardo, backslash nulo tie por mi. Kaj do se mi provas eltrovi la longeco de la teksto, mi povus pensi, ke ĝi estas 20 signojn longa, aŭ de miliono signojn longa se mi simple neniam okazi bati backslash nulo. Do ni bezonas ses bitokoj por stoki H-Kaj-L-L-O, backslash nulo. Kaj tiam ĉi tio estas nur esti super anal. Supozu ke mi forgesos, kion la grandeco de char estas. Ni parolas tiele ĝi estas unu bajto. Kaj ĝi kutime estas. En teorio, ĝi povus esti io malsama, en malsama Mac aŭ malsamaj PC. Do rezultas tie estas tio operatoro vokis sizeof ke se vi transpasxas la nomo de datumtipo - kiel char, aŭ int, aŭ float - ĝin rakontos al vi, dinamike, kiom da bajtoj a char prenas sur tiu aparta komputilo. Do tiu estas efektive nur kiel diri fojojn 1 aŭ fojoj nenion. Sed mi faras ĝin nur por esti super anal, ke ĉiaokaze oni char diferencas en via komputilo kontre mia, tiamaniere la matematiko estas ĉiam tuj ekiri. Fine, cxi tie mi kontroli por nula, kiu estas ĉiam bona praktiko - denove, iam ni pritraktas montriloj. Se malloc ne povis doni mi ses byes - kiu estas neverŝajna, sed ĉiaokaze - reveni unu tuj. Kaj nun iru antaŭen kaj kopii la kordo kiel sekvas. Kaj tio estas familiara sintakso, kvankam en malsama papero. Mi tuj iros antaŭen kaj akiri la kordo longo de s kaj konservas ĝin en n. Mi tiam tuj persisti de i egalas nulo ĝis kaj inkluzive de n, pli granda ol aŭ egala al. Por ke en ĉiu ripeto, mi metis la th,-a karaktero de s en la th,-a karaktero de t. Do kio vere okazas sube la kapuĉo tie? Nu, se tio, ekzemple, estas s - kaj mi tajpis en la vorto H-E-L-L-O kaj tie estas backslash nulo. Kaj denove, ĉi tiu estas s indikante tie. Kaj ĉi tie nun estas t. Kaj tion notas nun al kopion de memoro, ĉu ne? Malloc donis al mi tuta eron de memoro. Mi ne scias komence kio estas en iu el tiuj lokoj. Do mi tuj pensas pri tiuj kiel tutan faskon da demando markoj. Sed tuj kiam mi komencas looping de nulo plu supren tra la longo de s, t krampo nulo kaj t krampo 1 - kaj mi metos ĉi nun en la supre - t krampo nulo kaj s krampo nulo signifas ke mi iros al kopiado ripete h en tie, E-L-L-O. Plus, ĉar mi faris pli 1, backslash nulo. Do nun en la kazo de komparu-1.c, en la fino, se mi elprinti la kapitaligo de t, ni devus vidi, ke s estas neŝanĝita. Lasu min nun kaj faros cxi tion. Do fari copy1. Dot oblikvo copy1. Mi tuj tajpi en saluton, Enter. Kaj nun rimarkas, nur la kopion estis majuskloj. Ĉar mi vere havas du pecoj de memoro. Bedaŭrinde, vi povas fari iu bela malbona kaj sufiĉe danĝeraj aferoj ĉi tie. Lasu min eltiri supren ekzemplo tie nun, kiu donas al ni ekzemplon de kelkaj malsamaj linioj. Do simple intuicie tie, la unua linio de kodo, int stelo x, deklarante variablo nomata x. Kaj kio estas la datumtipo de tiu variablo? Kio estas la datumtipon de tiu variablo? Tio ne estis la cliffhanger. La datumtipo estas int stelo. Do kion tio signifas? x volo stoki la adreso de int. Simpla. Y estas tuj stoki la adreso de int. Kio estas la tria linio de kodo faras tie? Ĝi estas atribuo kiom da bajtoj, plej verŝajne? Kvar. Pro la grandeco de int estas ĝenerale kvar, malloc de kvar donas mi apogi la adreso de eron de memoro, la unua de kies bajtoj estas stokita nun en x. Nun ni movi iom rapide. Stelo x signifas kion? Ĝi signifas iri al tiu adreso kaj metis kio numero tie? Metu la numero 42 tie. Stelo y signifas iri al kio estas ĉe y kaj metis la numero 13 tie. Sed atendu momenton. Kio estas en y en la momento? Kio adreso estas y provizon? Ni ne scias, ĉu ne? Ni neniam iam uzi la atribuo operatoro engaĝante y. Do y kiel deklaritaj en la dua linio de kodo estas nur iuj rubo valoro, granda demandosigno por tiel diri. Ĝi povus indikante hazarde al nenio en la memoro, kiu estas ĝenerale malbona. Tuj, kiam ni batis tiu linio tie, stelo y estas 13, io malbona, iu tre malbona estas okazi al Binky. Do ni vidu kio okazas por fini pasante al Binky tie en ĉi tiu minuto aŭ tiel rigardi. [VIDEO reprodukto] -He, Binky. Veki. Estas tempo por puntero amuzo. -Kio estas tio? Lernu pri indikoj? Ho, goodie. -Nu, por komenci, mi supozas ke ni estas tuj bezonos paron montriloj. -Akcepti. Ĉi tiu kodo atribuas du montriloj kiu povas noti al entjeroj. -Bone, bone, mi vidas la du montriloj. Sed ili ne ŝajnas esti indikante nenion. -Tio estas prava. Komence, montriloj ne indikas nenion. La aferoj oni indikas nomiĝas pointees, kaj fiksante ilin estas aparta paŝo. -Ho, dekstra, rajto. Mi sciis tion. La pointees estas apartaj. Do kiel vi rezervu pointee? -Akcepti. Nu, tiu kodo atribuas nova entjeroj pointee, kaj tiu parto aroj x atentigi al ĝi. -He, kiu aspektas pli bone. Do faru ĝin fari ion. -Akcepti. Mi dereference la puntero x stoki la nombro 42 en gxian pointee. Por ĉi tiu lertaĵo, mi bezonas mian magion sceptron de dereferencing. -Via magio sceptron de dereferencing? Uh, tio estas granda. -Ĉi tio estas kion la kodo aspektas. Mi ĵus instalis la numero, kaj - -He, rigardu. Tie iras. Do fari dereference sur x sekvas la sago por aliri lia pointee. En ĉi tiu kazo, por stoki 42 en tie. Hej, provu uzi ĝin stoki la nombro 13 tra la alia puntero, y. -Akcepti. Mi nur volas transiri ĉi tie al y kaj get la numero 13 starigis. Kaj tiam prenu la sceptron de dereferencing kaj ĝuste - whoa! -Ho, bona. Tio ne funkcios. Diru, Binky, mi ne kredas ke la dereferencing y estas bona ideo, ĉar la starigadon de la pointee estas aparta paŝo. Kaj mi ne kredas ke ni iam faris. -Hmm. Bona punkto. -Jes, ni atribuis la puntero y. Sed ni neniam starigis ĝin atentigi al pointee. -Hmm. Tre observanto. -He, vi serĉas bona tie, Binky. Ĉu vi povas ripari ĝin tiel ke y punktoj al la sama pointee kiel x? -Certe. Mi uzas mian magian bastonon de pointer farita. -Ĉu tiu tuj estos problemo kiel antaŭe? -No. Ĉi tio ne tuŝas la pointees. Ĝi nur ŝanĝas unu puntero atentigi al la sama afero kiel alia. -Ho, mi vidas. Nun y poentojn al la sama loko kiel x. Do atendu. Nun y estas fiksita. Ĝi havas pointee. Do vi povas provi la sceptron de dereferencing denove por sendi la 13an super. -Akcepti. Jen iras. -He, rigardu tion. Nun dereferencing laboroj sur y. Kaj ĉar la indikoj estas dividi ke oni pointee, ili ambaŭ vidas la 13. -Jes. Dividi. Kion ajn. Do ni iras ŝaltilo lokoj nun? -Ho, rigardu. Ni estas el la tempo. -Sed - -Nur memoru la tri pointer regulojn. Numero unu, la baza strukturo estas, ke vi havas puntero. Kaj ĝi notas pli al pointee. Sed la puntero kaj pointee estas apartaj. Kaj la komuna eraro estas starigi pointer, sed por forgesu donita pointee. Numero du, pointer dereferencing startas ĉe la puntero kaj sekvas lian sago super aliri lia pointee. Kiel ni ĉiuj scias, tiu nur funkcias se Estas pointee, kiu alvenas al regi numero unu. Numero tri, pointer atribuo prenas unu puntero kaj ŝanĝoj al punkto al la sama pointee kiel alia puntero. Do post la farita, la du montriloj volo indikas la saman pointee. Foje, ke nomiĝas dividi. Kaj jen ĉio estas al ĝi, vere. Bye bye nun. [FINO reprodukto de vídeo] DAVID Malan: Do pli en montriloj, pli en Binky proksima semajno. Ni vidos vin lunde.