David MALAN: Hello, at maligayang pagdating pabalik sa CS50. Kaya ito ay ang katapusan ng linggo apat. Lamang ng isang anunsyo unang. Kaya ng tinatawag na ikalimang Lunes ay paparating na ito darating na Lunes. Ito ang pagkakataon upang baguhin mula sa SAT / UNSAT sa isang grado ng sulat, o mula sa sulat grade SAT / UNSAT. Annoyingly, ang proseso na ginagawa ng nangangailangan ng lagda, dahil mayroon kang upang punan out sa isa sa mga kulay rosas na add / drop form. Dahil technically, ang SAT / UNSAT bersyon at ang titik bersyon grado may natatanging mga numero ng catalog. Subalit hindi sang-ayon. Lamang sumalubong sa akin o sa Rob o sa Lauren sa anumang punto. O mag-email sa amin kung ikaw ay walang mga uri ng mga gawaing isinusulat kailangan mo ngayon, at kami magiging sigurado na makatulong sa iyo na gumawa ng pag-aalaga ng bago na Lunes. Ang lahat ng mga karapatan, kaya ngayon - talaga, may isang bit ng isang echo. Kaya namin tono sa akin pababa sa isang bit? OK. Kaya ngayon, namin ipakilala ang isang paksa Kilala bilang payo. At kukunin ko na aminin na ito ay isa sa mga mas kumplikadong mga paksa na may posibilidad namin upang masakop ito sa klase, o talagang anumang panimulang kurso na gumagamit ng C. Ngunit tumagal ang aking mga salita para dito, lalo na kung ang iyong isip pakiramdam ng kaunti pang nakatungo ngayon at sa linggo na dumating. Ito ay hindi na kinatawan ng sa iyo sa pagkuha ng anumang mas masahol pa sa ito ito lamang ay nangangahulugan na ito ay isang partikular na kumplikadong paksa na nangangako ako, sa loob ng ilang linggo samakatuwid, ay tila ang lahat ng masyadong strikingly tuwiran sa pag-alaala. Ako pa rin matandaan sa araw na ito. Ako ay pag-upo sa Elliott Dining Hall, pag-upo sa tabi ng aking tf Nishat Mehta, sino ay isang residente ng Elliott bahay. At para sa ilang kadahilanan, ito topic lang nag-click. Alin ang sabihin na ako masyadong struggled may mga ito para sa ilang mga halaga ng oras, ngunit ko Gagawin ang aking makakaya upang makatulong na maiwasan ang anumang naturang pakikibaka sa isang paksa na sa huli ay lubos na makapangyarihan. Sa katunayan, ang isa sa mga paksa namin talakayin sa linggo na dumating ay na ng seguridad, at kung paano maaari mong tunay maningning na tagumpay machine sa mga paraang na hindi nilayon. At iyon exploitations ay karaniwang ang resulta ng mga bug, mga pagkakamali na namin gumawa ng mga tao sa pamamagitan ng hindi pag-unawa sa ilang ng ang kalakip na pagpapatupad mga detalye sa pamamagitan ng mga programa na kung saan ay ginawa. Ngayon upang gumawa ito tila ang lahat ng mga higit pang mga gumagamit palakaibigan, naisip ko na gusto kong i-play ang isang 10 pangalawang preview ng isang maliit claymation figure na pinangalanan Binky sino ay dinadala sa buhay sa pamamagitan ng isang kaibigan ng atin sa Stanford, propesor Nick Parlante. Kaya payagan ako na magbigay sa iyo ito teaser ng Binky dito. [Video playback] -Uy, Binky. Gumising. Ito ay oras na para sa pointer masaya. -Ano iyon? Alamin ang tungkol sa mga payo? Oh, goodie. [END-playback ng video] David MALAN: Iyon ay Stanford computer science. Kaya higit pa sa na sa darating. [Palakpakan] David MALAN: Paumanhin, Nick. Kaya isipin ang na huling beses namin natapos sa ito talagang kapana-panabik na cliffhanger kung saan ang function na ito lamang ay hindi gumagana. Hindi bababa sa intuitively, ito nadama tulad ng ito ay gagana. Simpleng pagpapalit ang mga halaga ng dalawang integer. Ngunit isipin ang na kapag kami naka-print out ang orihinal na halaga sa pangunahing, at isa dalawa, sila ay pa rin ng isa at dalawa at hindi dalawa at isa. Kaya hayaan mo akong lumipat talaga sa ibabaw ng mga appliance. At ako ay nagsulat up ng isang bit ng kalansay ng code sa makapunta dito, kung saan-claim ko na x Magiging 1, y magiging 2. Ako pagkatapos ay i-print out ang parehong ng kanilang mga mga halaga na may naka-print na f. Pagkatapos kong i-claim pababa dito na kami ay pagpunta sa swap sa kanila. Ako iniwan ng blangkong lugar dito para sa amin upang fill in ngayon sa loob lamang ng ilang sandali. Pagkatapos, pupuntahan ko i-claim na ang dalawang variable ay nai-swapped. Pagkatapos ay pupuntahan ko i-print out ang mga ito muli. At kaya sana, ang dapat kong makita 1, 2. 2, 1. Iyon ang sobrang simple layunin sa ngayon. Kaya paano namin pumunta tungkol sa pagpapalit dalawang variable? Well kung ipanukala ko dito na ang mga tasa maaaring kumatawan sa memory sa isang computer. Ito ay isang ilang mga kagat, ito ay isa pang ilang kagat. Puwede namin ang isang volunteer dumating sa up at ihalo sa amin ng ilang mga inumin, kung pamilyar? Halika sa up. Ano ang inyong pangalan? Jess: Jess. David MALAN: Jess? Halika sa up, Jess. Kung hindi tututol kayo, mayroon kaming upang ilagay ang Google Glass sa iyo upang maaari naming papanatilihing-buhay na ito. OK, salamin. Mag-record ng video. At OK, kami ay handa na upang pumunta sa Jess dito. Ayos lang. Masaya akong makilala kayo. Kaya kung ano ang nais kong gawin mo dito - kung magagawa mo, masyadong mabilis - pours lamang sa amin kalahati ng isang baso ng orange juice at kalahati ng isang baso ng gatas, na kumakatawan epektibo ang mga numero 1 sa isang tasa at 2 sa iba pang tasa. Ito ay magiging magandang footage. Tanikala: Paumanhin. David MALAN: Hindi, hindi. Ito ay ang OK. Nice. Ang lahat ng mga karapatan, kaya kami ay may apat na bytes nagkakahalaga ng orange juice. Ipapakita namin na tinatawag na ito ang halaga 1. Ngayon ay isa pang apat na bytes na halaga ng gatas. Tatawagan Pinahahalagahan ito 2. Kaya x at y, ayon sa pagkakabanggit. Ang lahat ng mga karapatan, kaya ngayon kung ang gawain sa kamay - para sa iyo, Jess, sa harap ng lahat ng iyong mga kaklase - ay upang magpalitan ng mga halaga ng x at y tulad na gusto namin ang orange juice sa iba pang mga tasa at ang gatas sa tasa na ito, kung paano maaari ka - bago aktwal mong gawin ito - pumunta tungkol sa paggawa na ito? OK, maalam na desisyon. Kaya kailangan mo ng kaunti pang memory. Kaya sabihin maglaan ng pansamantalang tasa, kung kalooban mo. At ngayon magpatuloy upang magpalitan ng x at y. Magaling. Kaya napaka na rin tapos na. Salamat sa iyo kaya magkano, Jess. Heto. Ang isang maliit na subenir. OK, kaya malinaw naman, napaka-simpleng ideya. Ganap na madaling maunawaan na kailangan namin ng kaunti higit pang mga puwang sa imbakan - sa form na ito, isang tasa - kung namin talagang nais na magpalitan ng dalawang variable. Kaya natin gawin eksakto na. Hanggang dito sa pagitan ng kung saan inaangkin ko ako pagpunta sa ay ang paggawa ng ilang pagpapalit, bibigyan ko sige at ipinapahayag Temp. At kukunin ko na itakda ito katumbas ng, sabihin nating, x. Pagkatapos ay pupuntahan ko na baguhin ang halaga ng x tulad ng Jess ginawa dito sa gatas at orange juice upang maging katumbas ng y. At ako pagpunta sa baguhin ang y upang maging katumbas upang hindi x, dahil ngayon gusto naming maging natigil sa isang lupon, ngunit sa halip Temp. Saan ako pansamantalang - o kung saan Jess Pansamantalang ilagay ang orange juice bago clobbering na tasa na may gatas. Kaya ipaalam sa akin sige ngayon at gumawa ng mga ito. Ito ay tinatawag na noswap.c. At ngayon hayaan mo akong tumakbo walang makipagpalitan. At sa katunayan ko makita, kung ako palawakin ang window Medyo, na x ay 1, y ay 2. At pagkatapos ay x 2, y ay 1. Ngunit isipin ang na sa Lunes ginawa namin bagay medyo naiiba kung saan ako sa halip ay ipinatupad ng isang lingkod function, kung ang kalooban mo, na noon ay talagang walang bisa. Tumawag ako nito magpalit. Nagbigay ako ng dalawang ito parameter, at ako tinatawag ang mga ito at isang Tumawag ako sa kanila b. Lantaran, kaya kong tumawag sa kanila x at y. Wala humihinto sa akin mula sa paggawa na. Ngunit Gusto ko magtaltalan ito ay pagkatapos medyo hindi maliwanag. Dahil isipin ang para sa Lunes na namin na-claim na mga parameter na ito ay mga kopya ng mga halaga nakapasa in Kaya lang messes sa iyong isip, sa palagay ko, kung gumagamit ka ng eksakto ang parehong mga variable. Kaya kukunin ko na sa halip tumawag sa kanila ng at b, para lamang sa kaliwanagan. Ngunit maaari naming tawagan ang mga ito pinaka- kahit ano gusto namin. At ako pagpunta sa kopyahin at i-paste epektibo ang code na ito mula up doon down sa dito. Dahil ko lang nakita na ito gumagana. Kaya na nasa medyo magandang hugis. At makikita ko babaguhin ang aking x sa isang, x aking sa isang, ang aking y sa b at ang aking y upang b. Kaya sa ibang salita, eksaktong parehong logic. Ang eksaktong parehong bagay na ginawa Jess. At pagkatapos ay ang isang bagay na kailangan kong gawin up dito, siyempre, na ngayon ang panawagan na ito function, o tawagan ang function. Kaya ako ay tinatawag ito ng pag-andar na may dalawang input, x at y, at pindutin ang I-save. Ang lahat ng mga karapatan, kaya sa panimula ang parehong bagay. Sa katunayan, marahil Ginawa ko ang programa nang hindi kinakailangan kumplikado sa pamamagitan ng Sumulat ng isang function na lang ang pagkuha ng ilang anim na linya ng code samantalang ako dati ay ipinatupad ito sa loob lamang ng tatlo. Kaya ipaalam sa akin pumunta nang mas maaga ngayon at muling paggawa ito, gumawa ng walang makipagpalitan. Ang lahat ng mga karapatan, ako screwed up dito. Dapat ito ay isang error na maaari mong tingnan ang nagiging karaniwang bilang iyong mga programa makakuha ng mas kumplikadong. Subalit mayroong isang madaling pag-aayos. Hayaan ang mga mag-scroll sa akin back up dito. At kung ano ang unang error akong nakikitang? Implicit deklarasyon. Ano ang ginagawa na karaniwang nagpapahiwatig? Oh, Nakalimutan ko ang prototype. Nakalimutan ko ang upang turuan ang mga tagatala na makipagpalitan ng ay paalis na umiiral kahit na siya Hindi umiiral sa pinakadulo simula ng programa. Kaya lang ako pagpunta sa sabihin walang bisa, makipagpalitan, int, isang int b, tuldok-kuwit. Kaya hindi ako pagpunta sa reimplement ito. Ngunit ngayon na tumutugma ito sa kung ano ang pababa dito. At notice, ang kawalan ng isang tuldok-kuwit dito, na kung saan ay hindi kinakailangan kapag pagpapatupad. Kaya ipaalam sa akin gumawang muli ito, gumawa ng walang makipagpalitan. Karamihan mas mahusay na hugis. Patakbuhin walang makipagpalitan. At ang diyablo. Ngayon kami ay bumalik kung saan namin sa Monday, kung saan ang bagay ay hindi magpalit. At ano ang intuitive paliwanag para sa kung bakit ito ang kaso? Oo? MAG-AARAL: [hindi marinig]. David MALAN: Mismong. Kaya isang at b ay mga kopya ng mga x at y. At sa katunayan, anumang oras ka nakapunta pagtawag ng isang function kaya malayo na nagpapasa ng mga variable tulad ng ints - tulad ng makipagpalitan ay umaasa dito - ka guys na pagpasa sa mga kopya. Ngayon na nangangahulugan na ito ay tumatagal ng ilang sandali ng panahon, isang split second, para sa mga computer upang kopyahin ang mga piraso mula sa isa variable papunta sa mga piraso ng isa pa. Ngunit hindi iyon tulad ng isang malaking pakikitungo. Ngunit ang mga ito ay gayunman isang kopya. At kaya ngayon, sa konteksto ng makipagpalitan, Ako ay sa katunayan matagumpay pagbabago ng isang at b. Sa katunayan, sabihin gawin ng isang mabilis na kaliwanagan ng isip check. I-print ang f ay isang% i, bagong linya. At sabihin na plug sa isang. Ngayon sabihin gawin ang parehong bagay sa b. At sabihin gawin ang parehong bagay dito. At ngayon, hayaan mo akong kopyahin ang mga parehong linya muli sa ilalim ng pag-andar pagkatapos ng aking tatlong linya ng mga kawili-wiling sana pinaandar, at mag-print ng isang at b pa muli. Kaya ngayon sabihin gawin ito, gumawa ng walang makipagpalitan. Hayaan akong gumawa ng terminal na window ng bit taller, sa gayon maaari naming makita higit pa sa mga ito nang sabay-sabay. At tumakbo walang makipagpalitan. x ay 1, y ay 2. isang ay 1, b ay 2. At pagkatapos, ay isang 2, b ay 1. Kaya ito ay gumagana, tulad ng Jess ginawa dito sa loob ng makipagpalitan. Ngunit siyempre, ito ay walang epekto sa mga variable sa main. Kaya nakita namin ang isang nanlilinlang kung saan kami maaaring ayusin ito, tama? Kapag ikaw ay nahaharap sa mga ito scoping isyu na ito, maaari mo lamang magtikin at gumawa x y at kung anong uri ng variable sa halip? Maaari kang gumawa ng mga ito global. Ilagay ang mga ito sa pinakatuktok ng file tulad ng ginawa namin, kahit na sa laro ng 15. Gumagamit kami ng isang global variable. Ngunit sa konteksto ng mga laro 15, ito ay makatwirang upang magkaroon ng isang global variable na kumakatawan sa mga board, dahil ang kabuuan ng 15.c ang lahat tungkol sa pagpapatupad ng na laro. Iyon ay kung ano ang file ay umiiral upang gawin. Ngunit sa kasong ito dito, ako pagtawag ng isang function makipagpalitan. Gusto kong magpalit ng dalawang variable. At dapat itong magsimula sa pakiramdam lamang nanggigitata kung ang solusyon sa lahat ng aming problema kapag tumakbo kami sa saklaw mga isyu ay gawin itong global. Dahil masyadong mabilis ang aming mga programa ay pagpunta sa maging lubos isang gulo. At ginawa namin na masyadong matipid bilang isang resulta sa 15.c. Ngunit ito lumiliko out mayroong isang mas mahusay na paraan nang sama-sama. Hayaan akong talagang bumalik at tanggalin ang mag-print ng f, lamang upang gawing simple ang code na ito. At ipaalam sa akin imungkahi na ito, sa katunayan, ay masama. Ngunit kung ako sa halip idagdag sa ilang mga asterisk at mga bituin, na maaari kong i-on sa halip na ito pagpapaandar sa isang bagay na talaga operational. Kaya hayaan mo akong bumalik dito at umamin sinasabi asterisk ay laging mahirap, kaya Sasabihin kong bituin. Kukunin ko na lang fess hanggang sa na ang isa. Ayos lang. At ngayon, kung ano ako ng pagpunta na gawin sa halip? Kaya una sa lahat, pupuntahan ko tukuyin na sa halip ng pagpasa sa isang int sa ang makipagpalitan ng pag-andar, ako sa halip ng pagpunta sa sabihin int star. Ngayon, ano ang nilalaman ng star ang ipahiwatig? Ito ay na paniwala ng isang pointer na Binky, ang claymation character, noon ay nagre-refer sa isang sandali ang nakalipas. Kaya kung sabihin namin int bituin, ang kahulugan ng ito ngayon ay isang na ay hindi pagpunta sa maging naipasa sa pamamagitan ng halaga nito. Hindi Ito ay pagpunta sa makokopya in Sa halip, ang address ng isang ay pagpunta sa maipasa in Kaya isipin ang na sa loob ng iyong computer ay ang maramihang mga memorya, kung hindi man kilala bilang RAM. At RAM na lamang ang buong bungkos ng mga byte. Kaya kung ang iyong Mac o iyong PC ay dalawang gigabytes, mayroon kang 2 bilyong bytes ng memorya. Ngayon sabihin lamang ipagpalagay na lamang sa panatilihin ang mga bagay na maganda at nasa ayos, namin magtalaga ng isang address - isang numero - sa bawat byte ng RAM sa iyong computer. Ang pinakaunang byte ng mga 2 bilyon ay sa pamamagitan ng numerong zero. Ang susunod na isa ay byte bilang isa, ang bilang dalawa, ang lahat ng mga paraan sa up, tuldok tuldok tuldok, sa humigit-kumulang 2 bilyong. Kaya maaari mong bilang ng mga byte ng memorya sa iyong computer. Kaya sabihin ipinapalagay na ang ginagawa ibig sabihin namin sa pamamagitan ng isang address. Kaya kapag nakita ko int star a, kung ano ang nangyayari upang maipasa sa makipagpalitan ngayon ay ang address ng isang. Hindi nito halaga, ngunit kung anumang postal nito address, sa gayon na magsalita - lokasyon nito sa RAM. At katulad para b, pupuntahan ko upang sabihin ang parehong bagay. Int, bituin, b. Bilang isang tabi, technically ang star maaaring pumunta sa iba pang mga lokasyon. Ngunit kailangan naming ilagay sa pamantayan sa pagiging star sa tabi mismo ng mga uri ng data. Kaya swap lagda ngayon ay nangangahulugan na, ibigay sa akin ang address ng isang int, at tawag na isang address. At bigyan ako ng isa pang address ng isang int at tawagan ang address na iyon b. Ngunit ngayon ang aking code dito ay upang baguhin. Dahil kung Ipinahahayag ko int Temp - na kung saan ay pa rin ng uri int - ngunit mag-imbak ako sa isang ito, kung anong uri ng halaga? Upang maging malinaw, ako paglalagay ng isang may ang code bilang nakasulat na ngayon? Ako ng paglagay ng lokasyon sa isang. Ngunit Wala akong pakialam tungkol sa lokasyon ngayon, tama? Temp umiiral lamang Jess 'ikatlong tasa umiral, kung para sa anong layunin? Upang mag-imbak ng isang halaga. Gatas o orange juice. Hindi na talaga maitago ang address ng ang alinman sa mga bagay, na nakakaramdam ng maliit na walang saysay ito sa real mundo konteksto pa rin. Kaya talaga, kung ano ang gusto kong ilagay sa Temp ay hindi ang address ng isang, ngunit ang mga nilalaman ng isang. Kaya kung ang isang ay isang numero tulad ng 123, ito ay 123 mga byte ng memorya na may lamang Nagkataong ito ang sumasakop, na ang halaga sa isang Nagkataong sumasakop. Kung gusto kong pumunta sa address na iyon, Kailangan kong sabihin bituin isang. Katulad nito, kung ako ay upang baguhin kung ano ang sa address na isang, baguhin ko ito upang simulan ang isang. Kung gusto kong iimbak sa kung ano ang sa ang lokasyon ng kung ano ang sa lokasyon sa b, star b bituin. Kaya sa maikling, kahit na ito ay hindi masyadong paglubog sa pa - at hindi ko inaasahan na gagawin ito kaya mabilis - Napag-alaman na ang lahat ng ako paggawa ay prefixing mga bituin na ito sa aking mga variable, sinasabi hindi grab ang mga halaga. Huwag baguhin ang mga halaga. Ngunit sa halip, pumunta sa mga address na iyon at kumuha ng mga halaga. Pumunta sa address na iyon at pagbabago ang halaga doon. Kaya ngayon ipaalam sa akin mag-scroll back up sa itaas, lamang upang ayusin ang linya dito, upang baguhin ang prototype upang tumugma sa. Ngunit ako ngayon ay kailangan upang gawin ang isa sa iba pang mga bagay. Intuitively, kung ako ay nagbago ang mga uri ng mga argument na makipagpalitan ay umaasa, ano pa ang kailangan kong baguhin sa aking code? Kapag tumawag ako makipagpalitan. Dahil sa ngayon, kung ano ang am Ako pagpasa sa swap pa rin? Ang halaga ng x at ang halaga ng y, o ang gatas at ang orange juice. Ngunit hindi ko nais upang gawin iyon. Ko sa halip nais upang pumasa sa kung ano? Ang lokasyon ng x at ang lokasyon ng y. Ano ang kanilang mga postal address, kaya na magsalita. Kaya upang gawin iyon, mayroong isang ampersand. Ampersand uri ng tunog tulad ng address. kaya n, ampersand, ang address ng x, at ang address ng y. Kaya ito ay sinadya na ginagamit namin ampersand kapag tumatawag ang function, at mga bituin kapag deklarasyon at kapag pagpapatupad ng mga function. At lamang sa tingin ng ampersand bilang address ng operator, at bilang star ang pumunta doon operator - o, mas maayos, ang dereference operator. Kaya na ang isang buong maraming mga salita lamang sa nating ngayon, sana, makipagpalitan ay pagpunta upang maging tama. Hayaan akong sige at gumawa ng mga - sabihin aktwal na muling pangalanan ang file, baka program na ito pa rin ang tinatawag na makipagpalitan ng no. Inaangkin ko na kami ay tumawag ito swap.c ngayon. Kaya gumawa, swap. Dot, slash, mag-swap. At ngayon, sa katunayan, ay x 1, y ay 2. At pagkatapos, x 2, y ay isa. Well sabihin makita kung hindi namin maaaring gawin ito ng Medyo naiiba ang bilang sa kung ano ang pagpunta sa dito. Una, hayaan mo akong mag-zoom in sa aming pagguhit ng screen dito. At ipaalam sa akin imungkahi para sa isang sandali - at tuwing gumuhit ko dito ay mirrored up na ngayon doon - ipaalam sa akin imungkahi na narito ang isang buong bungkos ng memorya, o RAM, sa loob ng aking computer. At ito ay magiging kagat ng numero, sabihin nating, 1. Ito ang magiging bytes number 2. At kukunin ko na gawin ang maramihang higit pa, at pagkatapos ng grupo ng mga tuldok tuldok tuldok sa nagpapahiwatig na mayroong 2 bilyong ng mga bagay na ito. 4, 5, at iba pa. Kaya doon ay ang unang limang mga byte ng memorya ng aking computer. Ang lahat ng mga karapatan? Napakakaunting out ng 2 bilyong. Ngunit ngayon ako pagpunta sa imungkahi ang mga sumusunod na. Pupunta ako sa ipanukala na x ay pagpunta sa mag-imbak ang numero 1, at y ay pagpunta mag-imbak ang numero 2. At ipaalam sa akin sige at ngayon ay kumakatawan ang mga halagang ito tulad ng sumusunod. Tayo'y gawin ito tulad ng sumusunod. Bigyan mo ako ng isa lang pangalawa. Isang segundo. OK. Gusto kong gumawa ito ng kaunti - natin gawin ito muli. Kung hindi man ako pagpunta sa at paggamit ng parehong numero, hindi sinasadyang, maraming beses. Kaya lamang kaya kami ay may iba't ibang mga numero ng pag-uusapan, sabihin tinatawag ito byte numero 123, 124, 125, 126, at tuldok tuldok tuldok. At hayaang i-claim sa akin ngayon na pupuntahan ko ilagay ang halaga 1 dito, at ang halaga 2 dito, kung hindi man ay kilala bilang x at y. Kaya ito lang kaya ang mangyayari na ito ay x, ito ay y. At sa pamamagitan lamang ng ilang mga random na pagkakataon, ang computer, sa operating system, Nangyari ito upang ilagay ang x sa lokasyon number 123. At y napunta sa lokasyon 124 - diyablo. Ang dapat kong naayos na ito. Oh tao, ko ba talagang gawin ito? Oo, gusto kong ayusin ito at b tamang tungkol sa ito ngayon. Paumanhin, bago sa ito. 127, 131, at hindi ko nais upang maging ito complex, ngunit bakit ko babaguhin ang mga numero doon? Dahil gusto ko ang mga ints sa talagang maging apat na bytes. Kaya natin maging sobrang anal tungkol sa mga ito. Kaya na kung 1 ang mangyayari sa ma-address 123, ang 2 ay magiging sa address 127 sapagkat ito lang 4 byes ang layo. Iyon lang. At ipapakita namin kalimutan ang tungkol sa lahat ng iba pang mga address sa mundo. Kaya x ay nasa 123 lokasyon, y ay nasa lokasyon 127. At ngayon, kung ano ang ginagawa ko talaga gusto mong gawin? Kapag tumawag ako makipagpalitan ng ngayon, kung ano ang talaga ang nangyari? Well, kapag tumawag ako makipagpalitan, ako ang pagpasa sa ang address ng x at ang address ng y. Kaya halimbawa, kung ang dalawang piraso ng papel ngayon ay kumakatawan sa dalawang argumento ng isang at b upang magpalitan, ano Ako pagpunta sa sumulat sa unang sa mga ito, kung saan ako pupunta na tumawag sumangguni sa bilang isang? Mismong, 123. Kaya ito inaangkin ko ay isang. Ito ang isang parameter. Ako paglagay ng address ng x sa doon. Ano iyan? Ano iyan? Hindi, hindi. Iyon ay OK. Mabuti pa rin, mabuti pa rin. Kaya ito ay isang. At ngayon sa ikalawang piraso ng papel, ito ay magiging b, at kung ano Ako pagpunta sa ay sumusulat sa ito piraso ng papel? 127. Kaya ang tanging bagay na nagbago mula noong ang aming nakaraang pagsabi ng kuwentong ito ay, sa halip na literal na 1 at 2, ako pagpunta sa pumasa sa 123 at 127. At ngayon ako pagpunta sa ilagay ang mga ito sa loob ng ng kahon na ito, ang lahat ng karapatan? Kaya itim na kahon na ngayon ay kumakatawan ang makipagpalitan ng pag-andar. Samantala, sabihin na ngayon ng isang tao ipatupad ang makipagpalitan ng pag-andar. Ayos lang ba isang tao up dito gustong magboluntaryo? Halika sa up. Ano ang inyong pangalan? Charlie. Ang lahat ng mga karapatan, Charlie. Halika sa up. Kaya Charlie ay pagpunta upang i-play ang papel na ginagampanan ng aming mga itim na kahon. At Charlie, ano ang gusto ko mong gawin ngayon ay ipatupad makipagpalitan sa paraan na, ibinigay na mga dalawang mga address, talaga ikaw ay pagpunta upang baguhin ang mga halaga. At kukunin ko na bulong sa iyong tainga kung paano patakbuhin ang TV dito. Kaya't sige, at ikaw ang itim na kahon. Abutin sa doon. Ano ang halaga mo para makita ng, at kung ano ang halaga mo makita para b? Charlie: a ay 123 at b ay 127. David MALAN: OK, eksakto. Ngayon i-pause doon para sa sandali lamang. Ang unang bagay na ikaw ay pagpunta sa gawin ngayon, ayon sa mga code - na Magpapadala ako ngayon ililis sa screen - ay magiging upang magtalaga ng isang maliit na bit ng memory na tinatawag na Temp. Kaya pupuntahan ko sige at bigyan mo na memory. Kaya ito ay magiging isang third variable na ikaw ay may access sa iyo na tinatawag na Temp. At kung ano ang iyong pagpunta sa magsulat sa Temp piraso ng papel? Charlie: payo, tama? David MALAN: OK, na rin hindi kinakailangan payo. Kaya ang linya ng code na nag ako naka-highlight sa kanang bahagi, sabihin simulan doon. Sinasabi nito ng isang bituin. Kaya isang ay kasalukuyang pag-iimbak ang bilang 123. At lamang intuitively, kung ano ang star 123 ibig sabihin nito? Ngunit partikular, kung ang isang 123, isang bituin ay nangangahulugan na kung ano? Ang halaga ng isang. O kaya naman mas casually, pumunta doon. Kaya ipaalam sa akin imungkahi na, hinahawakan ang isang sa ang iyong mga kamay, sige at ituturing na na parang ito ay isang mapa. At lumakad iyong sarili sa ibabaw ng mga computer memory, at hanapin sa amin kung ano ang sa 123 lokasyon. Mismong. Kaya naming makita sa lokasyon 123 ay kung ano ang, nang walang alinlangan? OK, kaya kung ano ang halaga ngayon ikaw ay pagpunta sa ilagay sa Temp? Mismong. Kaya sige lang at gawin iyon. At isulat ang numero 1 sa mga piraso ng papel na kasalukuyang may pamagat na Temp. At ngayon sa susunod na hakbang na ka pagpunta sa ipatupad ay magiging kung ano. Well, sa kanang bahagi ng susunod na linya ng code ay star b. b, ng Siyempre, nag-iimbak ng isang address. Iyon addresses 127. Star b ibig sabihin kung ano, casually nagsasalita? Pumunta sa lokasyon na iyon. Kaya sige lang at hanapin sa amin kung ano ang sa 127 lokasyon. OK. Siyempre, sa 127 lokasyon, pa rin ang halaga 2. Kaya ano pa ang pagpunta ngayon sa store ang kahit anong sa lokasyon sa isang? Kaya star ng paraan pumunta sa isang lokasyon. Ano ang isang lokasyon? Mismong. Kaya ngayon, kung gusto mong baguhin kung ano ang sa lokasyon na iyon - Kukunin ko sige at magpatakbo ng pambura ang mga dito. At ngayon ilagay ito pabalik sa brush. Ano ang numero mo ay pagpunta sa isulat sa na blangko ang kahon ngayon? Mismong. Kaya ito na linya ng code, upang maging malinaw - hayaan pause sa akin kung anong ni Charlie paggawa at ituro dito, ano lang siya tapos ay sumulat sa na kahon sa lokasyon 123 ang halaga na dati ay sa b. At kaya na namin ngayon ang ipinapatupad sa katunayan ito pangalawang linya ng code. Ngayon, sa kasamaang-palad, mayroong pa rin ang isang linya na natitira. Ngayon kung ano ang nasa Temp, literal? Ito ay malinaw naman ang bilang ng isa. Iyan ay hindi isang address. Ito ay lamang ng isang numero, uri ng isang variable mula sa isang linggo. At ngayon kapag sinabi mong star b, na nangangahulugang pumunta sa b address, na kung saan ay sa Siyempre dito. Kaya sa sandaling makarating doon - Kukunin ko sige at burahin kung ano ang aktwal na doon - at kung ano ang ikaw ay pagpunta sa magsulat ngayon sa 127 lokasyon? Charlie: Temp, na kung saan ay isa. David MALAN: Temp, na kung saan ay isa. At ano ang mangyayari sa Temp sa dulo? Well, hindi namin talaga alam. Hindi namin talagang pakialam. Anumang oras na namin naipatupad ang isang function na kaya sa ngayon, ang anumang lokal na variable mayroon kang ay sa katunayan lokal. At sila lamang mawala. Sila ay naka-reclaim ng operating sistema kalaunan. Kaya ang katunayan na ang Temp ay mayroon pa ring mga halaga 1 ay isang uri ng sa panimula hindi kawili-wili sa amin. Ang lahat ng mga karapatan, sa gayon ang isang pag-ikot ng papuri kung magagawa namin para sa Charlie. Tunay na magaling. Ang lahat ng mga karapatan, kaya kung ano ang higit pa ang ibig ang ibig sabihin nito maaari naming gawin? Kaya ito lumiliko out na kami nakapunta na nagsasabi ng ilang puting kasinungalingan para sa lubos ng ilang oras. Sa katunayan, ito lumiliko out na ang isang string, lahat ng oras na ito, ay hindi talaga isang pagkakasunud-sunod ng mga character per se. Ito ay uri ng ay na intuitively. Pero technically speaking, string ay isang sa uri ng data na aming ipinahayag sa loob ng ang CS50 library upang gawing simple ang mundo para sa unang ilang linggo ng klase. Ano ang isang string ay talagang ay ang address ng isang character sa isang lugar sa RAM. Ang isang string ay talagang isang numero, tulad ng 123 o 127, na ang mangyayari sa maghiwalay kung saan ang isang string ay nagsisimula sa memory ng iyong computer. Ngunit hindi ito ay kumakatawan sa string, per se, mismo. At maaari naming makita ito tulad ng sumusunod. Hayaan akong sige at buksan up ang ilang mga code na kasama ng pinagmulan ngayong araw code halimbawa. At ako pagpunta sa sige at buksan up, sabihin nating, ihambing-0.c. Ito ay isang maraming surot na programa ay pagpunta upang maipatupad ng tulad ng sumusunod. Una. Pupunta ako sa sinasabi ng isang bagay. Pagkatapos ay pupuntahan ko sige at makakuha ng isang string mula sa mga gumagamit sa susunod na linya. Pagkatapos ay pupuntahan ko ito sinasabi muli. Pagkatapos Pupunta ako makakuha ng isa string mula sa user. At notice, ako na nagpapakita ng isa sa mga mga string sa isang variable na tinatawag s, at isa pa sa mga string sa isang variable na tinatawag na t. At ngayon ako pagpunta sa i-claim, napaka makatwirang, na kung s ay katumbas ay katumbas ng t, ang mga string ay pareho. Mong i-type ang mga parehong bagay. Iba Pa, ang mga string ay hindi ang parehong bagay. Pagkatapos ng lahat, kung kami input dalawang ints, dalawang char, dalawang kamay, dalawang Doubles, alinman sa ang mga uri ng data na aming uusapang tungkol sa kaya sa ngayon upang paghambingin ang mga ito - isipin ang ginawa namin napaka-clear ng isang habang ang nakalipas na hindi mo magawa ito, dahil isang single sign katumbas ay siyempre ang pagtatalaga operator. Kaya iyon ay magiging isang bug. Ginagamit namin ang pantay pantay na pag-sign, na sa katunayan Inihahambing mga bagay para sa tunay na pagkakapantay-pantay. Pero inaangkin ko na ito ay maraming surot. Kung ako sige at gumawa ihambing zero, at pagkatapos ay huwag dot slash ihambing zero. At ako type sa, sabihin nating, kumusta. At pagkatapos ay sabihin kamustahin muli. Literal ang parehong bagay, ang computer claim ko na na-type iba't ibang mga bagay. Ngayon siguro ko lang namali isang bagay. Kukunin ko i-type ang aking pangalan sa oras na ito. Ibig kong sabihin, kumusta. Hello. Ito ay naiiba sa bawat solong oras. Well, kung bakit ay na? Kung ano talaga ang nangyayari sa sa ilalim ng hood? Well, kung ano talaga ang nangyayari sa ilalim hood ang ay ang string pagkatapos I-type sa na unang pagkakataon halimbawa ay ang salita kumusta, siyempre. Ngunit kung kami ay kumakatawan ito sa ilalim ang hood, isipin ang isang na string ay nasa isang array. At namin ang sinabi ng mas maraming sa nakaraan. Kaya kung gumuhit ko na array ganito, ako pagpunta sa kumakatawan sa isang bagay na lubos katulad ng kung ano ginawa namin ng ilang sandali ang nakalipas. At mayroong isang bagay na talagang espesyal na dito, masyadong. Ano ang tinutukoy namin ay sa sa dulo ng bawat string? Oo, ito backslash zero, na kung saan ay lamang ang paraan ng kumakatawan, Literal, 00,000,000. Eight 0 mga piraso sa isang hilera. Hindi ko alam, lantaran, kung ano ang pagkatapos nito. Iyon lang ang isang bungkos mas RAM sa loob ng aking computer. Ngunit ito ay isang array. Usapan natin ang tungkol sa array bago. At kami ay karaniwang makipag-usap tungkol sa array bilang sa pagiging lokasyon zero, pagkatapos ng isa, at pagkatapos ay dalawa. Ngunit ito lamang ay para sa kaginhawaan. At iyan ay ganap na kamag-anak. Kapag talagang nakakakuha ka ng memorya mula sa ang computer na ito, siyempre anumang 2 bilyong ilang kakaiba bytes, potensyal na. Kaya talagang sa ilalim ng hood, lahat ng oras na ito, oo. Ito ay maaaring napakahusay maging bracket zero. Ngunit kung ka kumuha sa lupa kahit na mas malalim sa ilalim ang hood, na talaga tugunan ang numero 123. Ito ang address 124. Ito ang address 125. At hindi ko magtaas oras na ito. Ito ang ngayon isa bytes bukod para sa kung ano ang dahilan? Paano malaki ay isang pansamantalang trabaho? Ang isang pansamantalang trabaho ay isa lamang byte. Ang isang int ay karaniwang apat na bytes. Kaya na ang dahilan kung bakit ko ginawa ito 123, 127, 131 at iba pa. Ngayon ay maaari ko bang panatilihin ang matematika mas simple at lamang gawin plus 1. At ito ay ngayon kung ano talaga ang pagpunta sa ilalim ng hood. Kaya kapag ikaw idedeklara ng isang bagay na tulad nito, string s, ito ay talagang - ito lumiliko out - pansamantalang trabaho star. Bituin, siyempre, ay nangangahulugan address, aka pointer. Kaya ito ang address ng isang bagay. Ano ito sa address ng? Well - Ako ang isa lamang kung sino ang makakakita sa pinakasentro mahalagang punto ako sa paggawa, o sa tingin Ako sa paggawa. Kaya string - ang malungkot bagay ay mayroon akong isang monitor doon kung saan ako maaaring nakakita na. Ang lahat ng mga karapatan, kaya string s ay kung ano ang Ipinahayag ko dati. Ngunit ito lumiliko out, salamat sa isang maliit na magic sa CS50 library, lahat ng ito oras string ay may literal naging pansamantalang trabaho star. Ang mga bituin ay nangangahulugan na muli pointer o address. Ang katotohanan na ito ay ang flanking salita pansamantalang trabaho ay nangangahulugan na ito ang address ng isang character. Kaya kung makakakuha ng string ay tinatawag na, at ako type sa H-E-L-L-O, ipinapanukala ngayon kung ano ang makakuha string literal na ibinabalik ang lahat ng oras na ito, kahit na namin sa halip oversimplified ang mundo? Ano ang ibig makakuha ng string talaga bumalik bilang nito return halaga? 123 sa kasong ito, halimbawa. Dati kami sinabi na makakuha ng string lamang ay nagbabalik ng isang string, isang pagkakasunud-sunod ng character. Ngunit iyon lamang ang isang bit ng isang maliit na kasinungalingan. Ang paraan makakuha ng string talagang gumagana sa ilalim ng hood ay ito ay nakakuha ng string mula sa user. Ito plops ang mga character na siya sa mga uri ng memorya. Ito ay naglalagay ng isang backslash zero sa dulo ng mga pagkakasunud-sunod ng mga character. Ngunit pagkatapos ay kung ano ang makakuha ng string Literal na bumalik? Ito literal ay magbabalik ng mga address ng pinakaunang bytes sa RAM na ito na ginagamit para sa na lakas. At ito lumiliko out na lamang sa pamamagitan ng pagbalik isang solong address ng unang character sa string, iyon ay sapat na para sa paghahanap ng ang kabuuan ng ang string. Sa ibang salita, kumuha ng string ay walang bumalik sa 123 at 124 at 125. Hindi nito kailangang magbigay sa akin ng isang mahabang listahan ng lahat ng mga bytes na ang aking mga string ay gumagamit. Dahil isa, ang mga ito ay ang lahat ng bumalik upang i-back. At dalawang, batay sa unang address, ako maaaring maisip kung saan ang string ay nagtatapos. Paano? Ang mga espesyal na character na walang bisa, ang backslash zero sa dulo. Kaya sa ibang salita, kung pinapasa mo ang mga - sa loob ng mga variable - ang address ng isang pansamantalang trabaho, at angkinin mo na sa dulo ng anumang string, anumang pagkakasunud-sunod ng mga character tulad namin mga kawani na tao Sa tingin ng mga string, kung ipagpalagay mo na sa dulo ng anumang naturang string mayroong isang backslash zero, ikaw ay golden. Dahil maaari mong laging mahanap sa dulo ng isang string. Ngayon kung ano talaga pagkatapos ng pagpunta sa sa programang ito? Bakit programa na ito, ihambing-0.c, maraming surot? Ano ay aktwal na ina-kumpara? Oo? MAG-AARAL: [hindi marinig]. David MALAN: Mismong. Ito ay inihahambing ang mga lokasyon ng mga string. Kaya kung ang gumagamit ay nag-type sa halo-sabay, tulad ng ginawa ko, memory maaaring magtapos up naghahanap ng ganito. Kung ang gumagamit pagkatapos ay sa mga uri kumusta muli, ngunit sa pamamagitan ng pagtawag makakuha ng string muli, c ay hindi partikular na matalino maliban kung magturo sa iyo ito upang maging matalino sa pamamagitan ng pagsusulat ng code. C - at mga computer sa mas pangkalahatang - kung type ka sa word kumusta muli, alam mo kung ano ang iyong pagpunta upang makakuha ng. Lamang ka ng pagpunta upang makakuha ng isang pangalawang array ng memorya na, oo, maging ang mangyayari pag-iimbak ng H-E-L-L-O at iba pa. Ito ay pagpunta sa hitsura ang parehong upang amin ang mga kawani na tao, ngunit ang address na ito maaaring hindi 123. Maaaring lamang kaya mangyari na ang operating system ay may ilang mga magagamit na espasyo para sa halimbawa sa lokasyon - sabihin nating ang isang bagay na di-makatwirang, tulad nito ay 200 lokasyon. At ito ang 201 lokasyon. At ito ang 202 lokasyon. Wala kaming ideya kung saan na pagpunta sa maging sa memorya. Ngunit ano ang ibig sabihin nito ay ang kung ano ang pagpunta upang ma-imbak sa huli sa s? Ang bilang 123. Ano kaya ang nangyari na naka-imbak sa t, sa di-makatwirang halimbawa? Ang bilang 200. At lahat ng ito ay nangangahulugan na pagkatapos ay malinaw naman, 123 ay hindi katumbas ng 200. At kaya ito kung kondisyon ay hindi kailanman sinusuri sa true. Dahil get string ay gumagamit ng iba't-ibang chunks ng memory sa bawat oras. Ngayon ay maaari naming makita ito muli sa isa pang halimbawa. Hayaan akong sige at buksan up kopya-0.c. Inaangkin ko na halimbawa na ito ay pagpunta sa subukan - ngunit mabibigo - upang kopyahin ang dalawang mga string tulad ng mga sumusunod. Pupunta ako sa isang bagay na sabihin sa user. Pagkatapos Pupunta ako upang makakuha ng isang string at tawagan ito s. At ngayon, ako ng paggawa ng pagsusuring ito dito. Binanggit namin ito ng back habang. Ngunit kapag maaaring makakuha ng string return null, isa pang espesyal na karakter, o mga espesyal na simbolo sabihin nating. Kung ito ay sa labas ng memorya. Halimbawa, kung ang gumagamit ay talagang pagiging mahirap at uri ng mabangis bilang ng mga character sa keyboard at hit ang Enter. Kung na bilang ng mga character lamang hindi maaari magkasya sa RAM para sa anumang mabaliw dahilan, na rin makakuha ng mga string kapangyarihan napakahusay bumalik null. O kung ang iyong programa mismo ay ginagawa ng maraming ng iba pang mga bagay at mayroong lamang hindi sapat na memorya para sa get string upang magtagumpay, maaaring ito magtapos up bumabalik null. Ngunit sabihin maging mas tumpak bilang sa kung ano ito ay. Ano ang uri ng data ni talaga? Pansamantalang trabaho star. Kaya ito lumiliko out na ngayon ng aming makakaya alisan ng balat i-back ang layer ng null. Lumiliko out, ay walang bisa - oo, nang walang alinlangan isang espesyal na simbolo. Ngunit ano ito talaga? Talagang, walang bisa lamang ang isang simbolo na namin mga kawani na tao gamitin upang kumatawan sa zero pati na rin. Kaya ang mga may-akda ng mga C, at mga computer mas pangkalahatang paraan, nagpasya taon na ang nakalipas na, alam mo kung ano. Bakit hindi namin matiyak na walang gumagamit data ay kailanman, kailanman, kailanman naka-imbak sa hindi importanteng bagay zero? Sa katunayan, kahit na sa aking mga arbitrary na halimbawa bago, hindi ko simulan ang pagnunumero bytes sa zero. Ako nagsimula sa isa. Dahil alam ko na ang mga tao sa mundo nagpasya upang inilalaan ang zero byte sa RAM ng sinuman bilang isang bagay na espesyal. Ang dahilan sa pagiging, anumang oras na nais mong magsenyas ng isang bagay na maling naganap may pagtatangi sa mga address, ibinalik mo null - kung hindi man ay kilala bilang zero - at dahil alam mo na walang legit data sa address zero, malinaw na na nangangahulugan ng error. At iyon ang dahilan kung bakit kami, sa pamamagitan ng convention, suriin para sa null at pagbalik ng isang bagay tulad ng isa sa mga kasong iyon. Kaya kung mag-scroll down na kami ngayon, ito lamang ang pagkatapos ay ang ilang mga error checking, kung sakali may nangyaring mali sa [? magpyansa?] nang sama-sama at mag-quit sa programa sa pamamagitan ng pagbalik maaga. Linyang ito ngayon ma-rewritten bilang na ito, na nangangahulugan na kung ano? Sa kaliwang bahagi, bigyan ako ng isa pang pointer sa isang character, at tawagan ito t. Ano ako pag-iimbak sa loob ng t, batay ito sa isang linya ng code? Ako pag-iimbak ng isang lokasyon. Sa partikular sa lokasyon na noon ay nasa s. Kaya kung ang gumagamit ay nag-type sa kumusta, at na una kumusta ang mangyayari sa mga end up dito, pagkatapos ay ang numero 123 ay pagpunta sa bumalik mula makakuha string at maiimbak - bilang namin sinabi nang mas maaga - sa s. Kailan ako ngayon magpahayag ng isa pang pointer sa isang pansamantalang trabaho at tawagan ito t, ano ang numero Literal na pagpunta sa hantungan t ayon sa mga kuwento? Kaya 123. Kaya technically ngayon kapwa at s t ay nagtuturo sa eksaktong parehong chunks ng memorya. Kaya't mapapansin kung ano ako ng pagpunta sa gawin ngayon upang patunayan ang programang ito ay maraming surot. Unang pupuntahan ko i-claim, may isang print f, capitalize ang kopya ng string. Pagkatapos ay pupuntahan ko na gawin ang isang maliit na error checking. Pupunta ako upang tiyakin na. Sabihin tiyakin na ang string t ay sa hindi bababa sa mas mataas sa zero ang haba, kaya mayroong ilang mga character na doon upang aktwal na sulatin sa malaking titik. At pagkatapos ay maaari mo maalala muli ang mula sa nakaraang mga halimbawa. 2 itaas - na kung saan ay sa ang ctype.h file. T bracket zero ay nagbibigay sa akin ang zero katangian ng t string. At 2 ng itaas na parehong halaga, ng Siyempre, convert ito sa uppercase. Kaya intuitively, ito naka-highlight na linya ng code ay capitalize ang unang sulat sa t. Ngunit hindi ito capitalize, intuitively, ang unang titik sa s. Ngunit kung pinag-iisipan mo nang mas maaga, kung ano Ako tungkol sa upang makita kapag nagpatakbo ako ng program na ito at i-print out ang parehong orihinal, s, at ng tinatawag na kopya, t? Talaga sila ay pagpunta sa maging ang parehong. At bakit sila ay pagpunta sa maging ang parehong? Ang mga ito ay kapwa na nagtuturo sa eksakto ang parehong bagay. Kaya sabihin gawin ito. Gumawa ng kopya zero. Ito compiles ang OK. Hayaan akong magpatakbo ng kopya zero. Hayaan akong mag-type ng isang bagay na tulad ng halo sa lowercase lahat pagkatapos ay pindutin ang Enter. At itong mga claim na pareho ang orihinal s at ang kopya ay talagang magkapareho. Kaya kung ano ang talagang nangyari dito? Hayaan akong redraw ang larawang ito lamang upang sabihin ang kuwento sa isang bahagyang kakaibang paraan. Kung ano talaga ang nangyayari sa ilalim ng hood kapag idedeklara ko ng isang bagay tulad ng pansamantalang trabaho simula s, o string s, Ako ay nakakakuha ng isang pointer - na kung saan ang mangyayari sa maging apat na bytes sa CS50 appliance at ng maraming mga computer. At ako pagpunta sa tumawag ito s. At ito ay kasalukuyang may ilang mga hindi kilalang halaga. Kapag ipinapahayag mo sa isang variable, maliban kung ilagay ang iyong sarili ng isang halaga doon, nag- nakakaalam kung ano ang doon. Ito ay maaaring maging ng ilang mga random na pagkakasunod-sunod ng mga piraso mula sa nakaraang execution. Kaya kapag ako, sa aking mga linya ng code gawin makakuha string, at pagkatapos ay i-imbak ang return halaga sa mga makakuha ng string sa paanuman - at bibigyan namin ng kalaunan alisan ng balat pabalik kung paano makakuha string gawa, kahit papaano allocates isang array na marahil kamukha isang bit tulad nito. H-E-L-L-O, backslash zero. Sabihin ipagpalagay na ito ay address 123 lang muna hindi pabago-bago. Kaya makakuha ng returns string, sa naka-highlight na linya doon, ito ay magbabalik ng mga numero ng sinabi namin, 123. Kaya kung ano ang talagang napupunta sa loob ng s dito? Well, kung ano ang talagang napupunta sa loob ng s ay 123. Subalit lantaran, nakakakuha ako ng isang maliit na nalilito sa pamamagitan ng lahat ng mga address na ito, lahat ng mga arbitrary na numero. 123, 124, 127. Kaya natin talaga gawing simple mundo sa isang maliit na bit. Kapag makipag-usap namin tungkol sa mga payo, lantaran, upang amin ang mga kawani na tao, na ano ba ang nagmamalasakit kung saan bagay ang sa memory? Iyon ay ganap na arbitrary. Ito ay pagpunta sa ay depende sa kung paano magkano RAM ang user ay may. Ito ay pagpunta sa depende sa kapag nasa araw pinatakbo mo ang programa, marahil, at kung ano ang input ng user ang nagbibigay sa iyo. Humihingi kami ng tirahan sa mga hindi mahalagang mga detalye. Kaya natin abstract layo at sabihin na, kapag nagpatakbo ka ng isang linya ng code na tulad nito, pansamantalang trabaho star s nakakakuha ng pagbalik halaga ng get string. Bakit hindi namin sa halip lamang gumuhit ng kung ano ang aming panatilihin ang pagtawag sa isang pointer na parang ito pagturo sa isang bagay? Kaya inaangkin ko na ngayon na s up mayroong isang pointer - sa ilalim ng hood ito ay isang address. Ngunit lamang ito ay tumuturo sa ang unang byte sa string na hindi ibinalik. Kung ako ngayon bumalik sa code dito, ano ang nangyayari sa sa linyang ito? Well, ito sa naka-highlight na linya ngayon, Ako deklarasyon tila isa pang variable na tinatawag na t. Ngunit ito ay din ng isang pointer, kaya ako pupunta upang gumuhit ito bilang, sa teorya, ang eksaktong parehong sukat ng kahon. At ako pagpunta sa tumawag ito t. At ngayon, kung pumunta kami pabalik sa muli ang code, kapag iimbak ko s loob ng t, ano Ako technically paglalagay sa loob ng t? Well technically, ito ay ang bilang 123. Kaya talaga dapat kong pagsusulat ang numero 123 doon. Ngunit sabihin dalhin ito mas mataas na antas. t, kung ito lamang ang pointer, intuitively, ay lamang na. Iyon lang ang na pagiging naka-imbak sa doon. Kaya ngayon sa huling kagiliw-giliw na mga linya ng code, kapag ako ay talagang pumunta tungkol sa capitalize ang zero na character sa t, ano ang nangyari? Well, t bracket zero na ngayon ang pagturo sa kung ano ang karakter, siguro? Ito ay nagtuturo sa h. Dahil t bracket zero - pagkuhang muli, ito ay lumang syntax. t bracket zero ay nangangahulugan lamang kung t ay isang string, t bracket zero ay nangangahulugan na ang pagkuha ng zero character sa na lakas. Kaya kung ano na talaga ay nangangahulugan ay pumunta sa array na ito - at oo, maaaring ito ay 123, maaaring ito ay 124. Ngunit lahat ng ito ay kamag-anak, alalahanin. Tuwing pinag-uusapan ng isang array, mayroon kaming ang bentahe ng pakikipag-usap tungkol sa kamag-anak ng mga indeks. At kaya ngayon maaari naming ipagpalagay lamang na zero t bracket ay h. Kaya kung tumawag ako 2 upper sa ito, ano iyon talaga ginagawa ay capitalize ang maliit na mga h sa uppercase H. Ngunit siyempre, kung ano ang s? Ito ay nagtuturo sa parehong darn string. Kaya ito ang lahat na hindi nangyayari sa ang code na ito sa ngayon. Kaya kung ano ang pagkatapos ay ang implikasyon? Paano namin ayusin ang mga ito ng dalawang mga problema? Paano namin upang ihambing ang aktwal na mga string? Well intuitively, paano gagawin pumunta ka tungkol sa paghahambing ng dalawang mga string para sa tunay na pagkakapantay-pantay? Ano ang ibig sabihin kung dalawang string ay pantay-pantay? Malinaw na hindi na ang kanilang mga address ay kasing-halaga sa memorya, dahil na ang isang mababang antas ng pagpapatupad ng detalye. Ang lahat ng mga character ay pareho. Kaya ipaalam sa akin imungkahi, at ipaalam sa akin ipakilala sa bersyon ng isa sa compare.c dito, kaya ihambing-1.c. Hayaan akong magpanukala na kami pa rin makakuha ng isang pointer tinatawag s, at iimbak sa mga ito bumalik halaga ng get string. Tayo'y gawin ang parehong bagay sa t. Kaya wala sa mga code ay naiiba. Pupunta ako sa magdagdag ng isang maliit na higit pang mga error na ngayon ng pagsusuri. Kaya ngayon na kami ay isang uri ng pagbabalat pabalik ito layer sa CS50 ng kung ano ang isang string talaga, kailangan namin upang maging mas anal tungkol sa pagtiyak na hindi namin abusuhin di-wastong mga halaga tulad null. Kaya lang ako pagpunta upang suriin. Kung s ay hindi katumbas null at t hindi katumbas null, na nangangahulugan na namin ang OK. Maging string ay hindi magtaas pagkuha ang alinman sa mga string. At maaari mong marahil hulaan ngayon, kung ano ay STR CMP siguro gawin? String ihambing. Kaya't kung ikaw ay programa sa java bago, ito ay tulad ng mga pamamaraan ay katumbas sa string class. Ngunit para sa mga ng sa iyo na may hindi -program bago, ito lamang ang c function. Ito ay nangyayari na dumating sa isang file na tinatawag na string.h. Iyon ay kung saan ito ipinahayag. At ihambing ang string - Ko talaga makalimutan nito paggamit, pero hindi bale na. Isipin ang maaari naming gawin tao, gumalaw ihambing. At ito ay pagpunta upang ilabas ang Linux programmer manu-manong. At, lantaran, medyo misteriyoso. Ngunit maaari ko bang makita na dito, yep. Mayroon akong upang isama string.h. At sinasabi nito dito sa ilalim paglalarawan, "ang function na string ihambing Inihahambing ang dalawang mga string ng S1 at S2. "At S1 at S2 ay tila ang dalawang argumento nakapasa in Hindi ko talaga matandaan kung ano const ay, ngunit ngayon mapansin - at maaaring nakakita ka ito na kapag mo na gamitin ang mga pahina ng tao kung mayroon ang lahat ng ito - pansamantalang trabaho na bituin lamang ang magkasingkahulugan may string. Kaya ihahambing nito ang dalawang mga string, at S1 S2, at ito ay nagbabalik ng isang integer mas kaunti sa o katumbas ng o mas malaki kaysa sa zero kung S1 ay nakita, ayon sa pagkakabanggit, upang maging mas mababa sa, o tugma, o na mas malaki sa S2. Iyon lang ang isang napaka-komplikadong paraan ng pagsabi string na ihambing returns zero kung ang dalawang mga string ay intuitively magkakahawig, character para karakter para sa character. Ito ay nagbabalik ng mga negatibong numero kung s, ayon sa alpabeto, ay dapat na dumating bago t. O kaya ay nagbabalik ng isang positibong numero kung s ay dapat na dumating pagkatapos ng t ayon sa alpabeto. Kaya ito na may simpleng mga function, maaari mong, halimbawa, isang uri-uriin buong bungkos ng mga salita? Kaya sa bagong bersyon, pupuntahan ko upang sige at gumawa ng compare1. Dot slash ihambing isa. Kukunin ko i-type sa kumusta sa lahat ng mas mababang kaso. Pupunta ako mag-type ng halo sa lahat ng maliit na muli. At ngayon thankfully ito napagtanto I-type ang parehong bagay. Samantala, kung i-type ko sa halo sa mas mababang kaso at HELLO sa itaas na kaso at paghambingin ang mga ito, ako nag-type iba't ibang bagay. Dahil hindi lamang ang mga address ibang, ngunit kami ay paghahambing ibang mga character muli at muli. Well sabihin pumunta at ayusin isa iba pang mga problema ngayon. Hayaan akong buksan up na bersyon ng isa sa kopya, na sa ngayon ay address ang isyu na ito bilang mga sumusunod. At ang isang ito ang nangyayari upang tumingin medyo mas kumplikado. Pero kung sa tingin mo tungkol sa kung ano ang problema namin kailangan upang malutas, sana ito ay magiging i-clear sa loob lamang ng ilang sandali ngayon. Kaya ang unang linya, pansamantalang trabaho simula t, sa mga tuntunin karaniwang tao ay maaaring ipanukala ang isang tao ano ang linya na ito dito ibig sabihin? Pansamantalang trabaho star t, ano na ang ginagawa? Magandang. Lumikha ng isang pointer sa ilang lugar sa memorya. At hayaan mo akong pinuhin ito nang kaunti. Ipinapahayag sa isang variable na mag-iimbak ang address ng ilang mga pansamantalang trabaho sa memory, lamang upang maging isang kaunti pa tamang. OK, kaya ngayon sa kanang bahagi kamay, nag ko hindi kailanman nakita ang isa sa mga pag-andar bago, malloc. Ngunit kung ano ang maaaring sabihin na? Paglalaan ng memorya. Memory laang-gugulin. Kaya ito lumiliko out, pataas hanggang sa ngayon, kami hindi talaga ay nagkaroon ng isang malakas na paraan ng nagtatanong sa operating system, bigyan ako ng ilang memory. Sa halip, kami ay mayroon na ngayong ng isang function na tinatawag na malloc na gumagana nang eksakto na. Kahit na ito ay isang bit ng isang kaguluhan ng isip sa ngayon, mapapansin na sa sa pagitan ng dalawang panaklong ay lamang ng pagpunta sa maging isang numero. Saan ko na nai-type na pinag-uusapan mga marka ay maaaring maging isang numero. At bilang na nangangahulugan, bigyan mo ako 10 bytes. Bigyan mo ako 20 bytes. Bigyan ako ng 100 bytes. At malloc ay gawin ang lahat upang tanungin ang operating system - Linux, sa kasong ito - hey, ang kanilang 100 bytes ng RAM magagamit? Kung gayon, bumalik mga bytes sa akin sa pamamagitan ng bumabalik ang address ng kung alin sa mga bytes, marahil? Ang pinakaunang isa. Kaya dito masyadong - at ito ay kitang-kita sa C, anumang oras handa ka pakikitungo na may mga address? Ikaw ay halos palaging pagharap sa mga unang tulad address, hindi mahalaga kung gaano kalaki isang tipak ng memory mo ay nagiging ipinasa likod, kaya na magsalita. Kaya natin sumisid in dito. Ako ay sinusubukan upang magtalaga ng kung paano maraming bytes, eksakto? Well. String haba ng s - sabihin gawin ang isang kongkreto halimbawa. Kung s ay kumusta, H-E-L-L-O, kung ano ang mga string haba ng s, malinaw naman? Kaya ito ay limang. Ngunit ako paggawa ng plus 1 sa mga iyon, bakit? Bakit gusto kong anim bytes sa halip ng limang? Ang null character. Hindi ko nais na mag-iwan off ito espesyal na character null. Dahil kapag gumawa ako ng isang kopya ng Kamusta at lamang gawin H-E-L-L-O, ngunit hindi ko ilagay na espesyal na character, ang computer Hindi maaaring magkaroon ng, sa pamamagitan ng pagkakataon, ang isang backslash zero ang doon para sa akin. At kaya kung sinusubukan ko upang malaman ang haba ng mga kopya, maaari ba akong mag-isip na ito ay 20 character ang haba, o isang milyong character ang haba kung ko lang ay hindi kailanman mangyayari upang maabot ang isang backslash zero. Kaya kailangan namin ng anim bytes upang mag-imbak H-E-L-L-O, backslash zero. At pagkatapos ay ito lamang ang upang maging napaka-anal. Ipagpalagay na nakalimutan ko kung ano ang laki ng isang pansamantalang trabaho ay. Panatilihin namin sinasabi ito ng isang byte. At ito ay karaniwang ay. Sa teorya, maaaring ito ay isang bagay na iba, sa isang iba't ibang mga Mac o isang ibang PC. Kaya ito lumiliko out mayroong operator na ito tinatawag sizeof na kung pumasa ka ito ang pangalan ng isang uri ng data - tulad ng pansamantalang trabaho, o int, o Float - ito ay magsasabi sa iyo, pabago-bago, kung gaano karaming bytes isang pansamantalang trabaho tumatagal ng hanggang sa ito partikular na computer. Kaya ito ay epektibo lamang tulad ng sinasabi ng 1 beses o beses wala sa lahat. Ngunit ako ito ginagawa para lamang maging super anal, na kung sakali isang pansamantalang trabaho ay naiiba sa iyong computer kumpara sa minahan, sa ganitong paraan matematika ay palaging pagpunta sa check out. Panghuli, pababa dito ako suriin para sa null, na kung saan ay palaging mahusay na kasanayan - muli, anumang oras kami pagharap sa mga payo. Kung malloc ay hindi magagawang magbigay ako anim byes - na kung saan ay malamang na hindi, pero kung sakali - bumalik isa kaagad. At ngayon, sige at kopyahin ang string tulad ng sumusunod. At ito ay pamilyar na syntax, kahit na sa ibang papel. Pupunta ako sa sige at makakuha ng string haba ng s at mag-imbak ito sa n. Pagkatapos ay pupuntahan ko umulit mula i katumbas zero ang hanggang sa at kabilang n, mas malaki kaysa sa o patas sa. Kaya na sa bawat pag-ulit, ko bang ilagay ang ith character ng s sa ith katangian ng t. Kaya kung ano talaga ang nangyayari sa ilalim ng hood dito? Well kung ito ay, halimbawa, ay s - at ko na nag-type sa word H-E-L-L-O at mayroong isang backslash zero. At muli, ito ay s pagturo dito. At dito ngayon ay t. At ito ay tumuturo sa ngayon isang kopya ng memorya, tama? Malloc ay nagbigay sa akin isang buo tipak ng memory. Hindi ko alam sa una kung ano ang sa anuman sa mga lokasyon na ito. Kaya Pupunta ako sa tingin ng mga ito bilang mga ang maramihang mga marka ng tanong. Ngunit sa lalong madaling simulan ko looping mula sa zero sa up sa pamamagitan ng haba ng s, t bracket zero at t bracket 1 - at makikita ko bang ilagay ito ngayon sa overhead - t bracket zero at s bracket zero ibig sabihin na pupuntahan ko ay pagkopya iteratively h in dito, E-L-L-O. Plus, dahil ginawa ko ang plus 1, backslash zero. Kaya ngayon sa kaso ng ihambing-1.c, sa dulo, kung mag-print out ko ang capitalization ng t, dapat namin makita na s ay hindi nabago. Hayaan akong sige ngayon at gawin ito. Kaya gumawa COPY1. Dot slash COPY1. Pupunta ako mag-type ng halo, ang Enter. At ngayon mapansin, tanging ang kopya Na-malaking titik. Dahil ang tunay na ako magkakaroon ng dalawang chunks ng memorya. Sa kasamaang palad, maaari mong gawin ang ilang mga kaakit-akit masamang at medyo mapanganib bagay dito. Hayaan akong makuha ang isang halimbawa dito ngayon, na nagbibigay sa amin ng isang halimbawa ng ilang iba't-ibang linya. Kaya lamang intuitively dito, ang unang linya ng code, int star x, ang deklarasyon isang variable na tinatawag na x. At kung ano ang mga uri ng data ng na variable? Ano ang data uri ng variable na? Iyon ay hindi ang cliffhanger. Ang data uri ay int star. Kaya ano ang nilalaman na ibig sabihin nito? x kalooban mag-imbak ng address ng isang int. Simple bilang na. Y ay pagpunta upang mag-imbak ang address ng isang int. Ano ang pangatlong linya code ng paggawa doon? Ito ay paglaan ng kung gaano karaming bytes, pinaka-malamang? Apat. Dahil sa laki ng isang int ay sa pangkalahatan ay apat, malloc ng apat na nagbibigay sa i-back sa akin ang address ng isang tipak ng memorya, ang unang ng kung saan ang bytes ay naka-imbak na ngayon sa x. Ngayon kami ay gumagalaw ng kaunti mabilis. Star x ibig sabihin kung ano? Ito ay nangangahulugan na pumunta sa address na iyon at ilagay kung ano ang numero doon? Ilagay ang numero ng 42 doon. Star y nangangahulugan pumunta sa kung ano ang sa y at ilagay ang numero ng 13 doon. Ngunit maghintay ng isang minuto. Ano ang y sa sa sandaling ito? Ano ang address ng y-iimbak? Hindi namin alam, tama? Hindi namin na-minsan gamitin ang pagtatalaga operator na kinasasangkutan y. Kaya y bilang ipinahayag sa ikalawang linya ng code lamang ang ilang mga basura na halaga, isang malaking tandang pananong sa gayon na magsalita. Maaaring ito ay tumuturo random sa anumang bagay sa memorya, na ay pangkalahatan masama. Kaya sa lalong madaling namin hit na linya doon, star y katumbas ng 13, isang bagay na masama, isang bagay na lubhang masama ay tungkol sa mangyayari sa Binky. Kaya sabihin makita kung ano ang nangyayari sa mga end up nangyayari sa Binky dito sa minutong ito o kaya tingnan. [Video playback] -Uy, Binky. Gumising. Ito ay oras na para sa pointer masaya. -Ano iyon? Alamin ang tungkol sa mga payo? Oh, goodie. -Well, upang magsimula, hulaan ko kami ay pagpunta sa kailangan ng ilang mga payo. -OK. Ang code na ito allocates dalawang pointer na maaaring tumuro sa integer. -OK, na rin, ko makita ang dalawang pointer. Ngunit hindi sila mukhang pagturo sa anumang bagay. -Iyan ay karapatan. Sa una, mga payo ay hindi tumuro sa anumang bagay. Ang mga bagay na ituro ang mga ito sa ay tinatawag na pointees, at pagse-set up ang mga ito ay isang hiwalay na hakbang. -Oh, karapatan, karapatan. Alam ko na. Ang pointees ay hiwalay. Kaya paano mo magtalaga ng isang pointee? -OK. Well, ang code na ito allocates ng isang bagong integer pointee, at ang bahaging ito nagtatakda x upang tumuro sa ito. -Uy, na mukhang mas mahusay. Kaya gawin itong gawin ang isang bagay. -OK. Kukunin ko dereference ang pointer x-imbak ang bilang 42 sa pointee nito. Para sa mga kahanga-hangang gawa na ito, Kailangan ko ng aking magic wand ng dereferencing. -Ang iyong magic wand ng dereferencing? Uh, mabuti iyan. -Ito ay kung ano ang code kamukha. Kukunin ko na lang i-set up ang numero, at - -Uy, tumingin. Nagkaroon ito napupunta. Kaya ang paggawa ng isang dereference sa x sumusunod ang arrow upang ma-access nito pointee. Sa kasong ito, upang mag-imbak 42 sa doon. Uy, subukang gamitin ito upang mag-imbak ang numero 13 sa pamamagitan ng iba pang mga pointer, y. -OK. Kukunin ko na lang pumunta sa paglipas dito upang y at makuha ang mga numero ng 13-set up. At pagkatapos gawin ang wand ng dereferencing at lang - aba! -Oh, hey. Iyon ay hindi gumagana. Sabihing, Binky, Hindi sa tingin ko ang dereferencing y ay isang magandang ideya, dahil sa pagse-set up ang pointee ay isang hiwalay na hakbang. At palagay ko ay hindi kailanman namin ginawa ito. -Hmm. Magandang punto. -Oo, inilalaan namin ang pointer y. Ngunit kami ay hindi kailanman itakda ito upang tumuro sa isang pointee. -Hmm. Tunay na mapagmasid. -Uy, ang hinahanap mo magandang doon, Binky. Puwede ninyo bang ayusin ito upang ang y punto sa parehong pointee bilang x? -Oo naman. Makikita ko bang gamitin ang aking magic wand ng pointer pagtatalaga. -Ay na pagpunta sa maging isang problema tulad ng bago? -Hindi. Hindi ito pindutin ang pointees. Ito lamang nagbabago isa pointer upang ituro upang ang parehong bagay bilang isa pa. -Oh, nakikita ko. Ngayon y punto na tumuturo sa parehong lugar bilang x. Kaya maghintay. Ngayon y ay naayos na. Mayroon itong pointee. Kaya maaari mong subukan ang wand ng dereferencing muli upang magpadala ng higit sa 13. -OK. Narito napupunta. -Uy, tumingin sa na. Ngayon dereferencing gawa sa y. At dahil ang pointer ay namamahagi na ang isa pointee, sila parehong makita ang 13. -Oo. Pagbabahagi. Anuman. Kaya kami makapupunta lugar lumipat ngayon? -Oh, tumingin. Humihingi kami ng out ng oras. -Ngunit - -Tandaan lamang ang tatlong pointer panuntunan. Numero ng isa, ang pangunahing istraktura ay na mayroon kang isang pointer. At sa ibabaw ng mga punto sa isang pointee. Ngunit ang pointer at pointee ay hiwalay. At ang mga karaniwang mga error ay upang set up ng isang pointer, ngunit sa kalimutan na ibinigay pointee isang. Numero ng dalawang, pointer dereferencing nagsisimula sa pointer at sinusunod nito arrow sa ibabaw upang ma-access nito pointee. Bilang namin ang lahat ng alam, ito ay gagana lamang kung may ay isang pointee, na kung saan ay makakakuha ng pabalik sa mamuno bilang isa. Numero ng tatlong, pointer pagtatalaga tumatagal isa pointer at mga pagbabago ito upang tumuro sa ang parehong pointee bilang isa pang pointer. Kaya matapos ang pagtatalaga, ang dalawang pointer kalooban tumuturo sa parehong pointee. Minsan na tinatawag na pagbabahagi. At iyon ang lahat doon ay upang ito, talagang. Hindi importanteng bagay hindi importanteng bagay ngayon. [END-playback ng video] David MALAN: Kaya higit pa sa mga payo, higit pa sa Binky susunod na linggo. Gagamitin namin ang nakikita mo sa Lunes.