[Powered by Google Translate] [Linggo 4, patuloy na] [David J. Malan - Harvard University] [Ito ay CS50. - CS50.TV] Ito ay CS50, at ito ay ang katapusan ng linggo 4. Kaya ilang mabuting balita at ilang masamang balita. Walang panayam sa Lunes, ang problema hindi magtakda ng susunod na linggo. [Mag-aaral pagpalakpak] Hindi ka upang i kung saan ito ay pagpunta. Ngunit kami ay may ito sa halip sa susunod na Miyerkules, at mayroon ding bawat ang syllabus 1 Biyernes panayam susunod Biyernes upang maaari naming manatili sa track. Ngunit lahat ay kumuha gaya ng dati, kaya hindi mag-alala. At may pagtatangi sa pagsusulit ng 0 kung ano ang gagawin namin patungo sa pagtatapos ng linggo ay post sa homepage cs50.net kurso ng paliwanag kung anong uri ng mga inaasahan ay dapat mayroon ka pagdating sa unang pagsusulit. Sa pangkalahatan, ito ay maramihang mga pagpipilian, totoo maling, maikling sagot, maikling coding problema. Hindi ka pagpunta sa inaasahan upang ipatupad ang katumbas ng isang problema na gusto mong makita sa isang pset, kung saan mayroon kang isang computer at debugger at tulad, ngunit ay may maliit na coding problema. At sa katunayan, ang pinakamahusay na gabay upang makakuha ng ideya ng kung ano CS50 pagsusulit ay tulad ng ay pumunta sa cs50.net, pumunta sa Pagsusulit link, at maaari mong makita ang mga nakaraang ilang taon sa halaga ng mga pagsusulit. Lamang mapagtanto na kurikulum ay hindi palaging ang parehong sa mga nakaraang taon. Minsan idagdag namin, minsan ibawas, kaya kung mong makita ang ilang mga paksa sa isa sa mga lumang pagsusulit na mayroon kang mga ideya kung ano ang pinag-uusapan ng, alinman namin ay masaklawan o na hindi namin masaklawan. Ngunit sa ang form ng mga review, ito Linggo, Lunes, at Martes pati na rin bilang isang kurso-malawak na pagsusuri sa sesyon sa Linggo gabi - oras at lokasyon na inihayag sa homepage ng kurso - mo ang lahat ng pagkakataon upang suriin sa Fellows ng pagtuturo sa kurso materyal para sa taong ito, sa seksyon at bilang isang buong klase, at ang mga ito ay kumuha gaya ng dati pati na rin. Ayos lang. Kaya nang walang karagdagang linggal, isang komento sa pass / mabigo at idagdag / drop. Maaaring nakakita ka ng aking mga tala sa nakaraang gabi, at talaga ito ilang karagdagang muling pagtiyak na kung ikaw ay kabilang sa mga partikular na mas mababa kumportable o saanman sa pagitan at ikaw ay pakiramdam ng kaunti lamang sa paglipas ng iyong ulo, Napagtanto na ay talagang masyadong normal, at may sapat na istraktura ng suporta sa lugar, isa ng kung aling mga oras ng opisina mga layunin sa pagpapabuti ang lahat ng higit pa bawat aking email huling gabi, at Napagtanto masyadong na isang pagpipilian tulad ng pass / mabibigo para sa isang klase tulad nito talaga ay nilalayong bilang isang mekanismo sa sa gilid ng isang kurso tulad nito, sa gayon ay muli kung ikaw ay paggastos ng mga 10, 15, 20 oras lamang sinusubukan upang makakuha ng ilang pset sa trabaho at alam mo na ikaw ay 90-95% ng paraan doon ngunit hindi mo mahanap ang ilang mga bug na mapahamak, sa isang pass / mabigo ang modelo na uri ng okay. Ang ideya ay na may mekanismo na na maaari mong pagkatapos ay pumunta focus sa iyong iba pang mga psets o matulog o anumang ito ay na nais mong mag-focus sa. Kaya Napagtanto na mayroon kang hanggang ito darating na Martes - technically ika-5 Monday, ngunit ito ay isang holiday, kaya ito darating na Martes - upang lumipat mula sa pass / hindi gradong o vice versa. At kung ikaw ay talagang sa bangin at iniisip drop sa kabuuan, mangyaring mahuli ako pagkatapos ng panayam o drop sa akin ng isang tala. Ikagagalak naming hindi bababa sa chat bago kang mag-bid paalam. Ayos lang. Kaya't nagsimula kaming paglalaan ng mga gulong ng pagsasanay off huling beses. Sa partikular, nakatutok kami sa string. String ay isang bagay na ipinahayag sa library ng CS50, partikular sa file na iyon na tinatawag na cs50.h kung saan magsisimula kami upang tingnan ito linggo at susunod. Ngunit string ay talagang lamang pagpapagaan ng isang bagay na ng kaunti mas arcanely inilarawan bilang magpasinda *. Magpasinda hindi kami pamilyar sa. Ito ay lamang ng isang solong character. Ngunit ang * ng Lunes naitala kung ano? >> [Mag-aaral] Ang isang pointer. Ang isang pointer. At kung ano ang isang pointer? >> [Mag-aaral] isang address. Ito ay tulad ng isang address, isang lokasyon sa memorya. Ano ang isang address o lokasyon o memory? Muli, ang lahat sa atin ay may laptop na may kalesa o 2 gigabytes ng RAM malamang mga araw na ito, at na nangangahulugan na mayroon kang isang bilyong o 2 bilyong mga byte halaga ng memorya. At hindi ito ay talagang mahalaga kung ano ang pisikal na kamukha, ngunit sa pananampalataya na maaari mong NUMBER lahat ng mga indibidwal na bytes na ang iyong sariling laptop ay may - ito ay byte 0, ito ay byte 1, ito ay byte 2 bilyong - at iyon mismo kung ano ang computer ng isang. Kapag maglaan ka ng espasyo para sa isang solong character, halimbawa, ito malinaw naman ay may upang mabuhay sa isang lugar sa memorya ng iyong computer, at marahil ito sa bilang ng byte 12345, at na ang isang lugar hanggang dito sa memorya ng iyong computer. At ang address na karakter ay 12345. Ngayon, sa linggo 0 pamamagitan ng ngayon sa gayon malayo, hindi namin talagang cared kung saan sa bagay memorya ay naka-imbak dahil namin karaniwang gamitin ang mga simbolo, variable, at array upang aktwal na makakuha ng sa aming mga data. Ngunit tulad ng Lunes at ang lahat ng higit pa ngayon, ngayon ka na magkaroon ng ang lahat ng mga mas makahulugan na mga kakayahan sa pagsulat programa talagang manipulahin ang memorya ng isang computer gayunpaman nakikita mo magkasya, para sa parehong mahusay na layunin at masamang, bug pagiging isang napaka-karaniwang resulta sa puntong ito sa pag-aaral ng mga bagay na ito. Ngunit ano ang talagang ibig sabihin sa isang pansamantalang trabaho *? Hayaan ng magpatuloy bumalik sa - at magpapadala kami bumalik sa Binky tulad ng ipinangako ngayon. Natin pumunta sa isang simpleng halimbawa dito. Hayaan akong i-save ang file na ito sa bilang compare.c, at ipaalam sa akin lamang makakuha ng ilang mga template code dito kaya isama stdio.h, hayaan mo akong ring bigyan ang aking sarili ay kinabibilangan ng cs50.h. Na ako mag-zoom in hanggang doon. Hayaan ang simulan ang pagsusulat sa akin pangunahing int, pangunahing (walang bisa), at ngayon ay nais kong gawin ang isang bagay tulad nito: printf ("Bigyan mo ako ng string:") at pagkatapos ay ko bang gamitin ang string s ay makakakuha GetString upang makakuha ng isang string mula sa gumagamit, at pagkatapos ay ako pagpunta sa tanungin ang user para sa isa pa. ("Bigyan mo ako ng isa pang string:") at ako pagpunta upang hilingin sa kanila sa pamamagitan ng GetString upang makakuha ng na. Tatawag ako ito t dahil t nauuna matapos s at s ay isang magaling na pangalan para sa isang string kung medyo generic na. Kaya GetString, at ngayon ko lang nais na gawin ang isang katinuan check at ako pagpunta sa sabihin kung ang (mga == t) pagkatapos lamang ako pagpunta sa sabihin sa user printf ("Ikaw-type ang parehong bagay \ n!"); tao ako pagpunta sa i-print ang isang bagay tulad ng ("Ikaw-type ng isang bagay na iba't ibang! \ n") o anumang pangungusap ay. Kaya ang isang bagay tulad na. Pagkatapos tulad ng dati, kukunin ko na bumalik ng 0 na lang signified na walang masamang nangyari, at ako pagpunta upang magpatuloy at makatipon at patakbuhin ang program na ito. Ngunit sa Lunes namin tumakbo sa programang ito, at aktwal na Sinabi na ang HELLO ay hindi HELLO at paalam ay hindi paalam. Ang pag-uugali na namin nakita ng kaunti pa tulad nito. Hayaan ang mga pumunta sa akin sa aking pinagmulan directory, zoom in dito, at sabihin huwag gumawa ihambing. Inipon okay. Ipaalam sa akin patakbuhin ihambing. Bigyan mo ako ng isang string: HELLO. Bigyan mo ako ng isa pang string: HELLO. Nai-type mo ang isang bagay na iba't ibang! Well, hayaan mo akong subukan ang isang bagay na simple tulad ng 50, 50. Nai-type mo ang isang bagay na iba't ibang! hi, hi. Kaya malinaw, ang isang bagay ay pagpunta sa dito. Ngunit ano ang paliwanag para sa kung bakit? Tila, line 12 ay ganap na dysfunctional. Ano ang pangunahing problema dito? Oo. >> [Mag-aaral] paghahambing ng address. Oo, eksakto. Aktwal na ito ng paghahambing ng mga address kung saan HELLO at HELLO ay naka-imbak. Hindi ito ng paghahambing ang mga titik HELLO muli at muli, dahil kung ano talaga ang nangyari, ang lahat ng oras na ito kami ginagamit GetString - Pisara na ito ay muli memorya ng aming computer, at sabihin nating tumawag ako GetString matapos ang deklarasyon ng variable s. Ano ang aking memory hitsura? Sabihin mang sabihin na mga ganito ang hitsura. Isang parisukat. At medyo magkano ang anumang oras ko na iginuhit ng isang piraso ng memorya sa screen kung 32 bit ko na pagguhit ng mga parisukat tulad nito dahil sa katunayan sa appliance, isang pointer, isang address, 32 bit. Ang parehong bilang isang int. Na maaaring mag-iba batay sa computer system. Yaong mo na vaguely pamilyar sa ang katunayan na ang iyong Mac o PC 64 bit, na aktwal na Nagpapahiwatig na ang iyong computer ay gumagamit ng 64-bit na payo, 64-bit na address, at bukod sa ang mga upsides ng na ang iyong computer maaaring magkaroon ng higit pa RAM kaysa sa nakalipas na panahon. Long kuwento maikli, bumalik sa araw kapag computer ginagamit lamang 32 bit upang kumatawan ng mga address, ang pinakamalaking bilang ng mga byte maaari mong kumatawan sa kasong iyon ay kung ano kung mayroon kang 32 bit? Kaya 4 bilyon, kanan, dahil ang 2 sa 32 4 na bilyong. Ang bilang na ito ay umuulit na sa kurso. Kaya kung mayroon ka lamang 32 bit, ang pinakamataas na bilang maaari mong bilangin halos 4 bilyon. Ngunit iyon ay isang pangunahing limitasyon ng mga computer hanggang sa ilang taon na ang nakakaraan dahil kung maaari mo lamang ang bilang ng mataas na bilang bilang 4 bilyong, hindi mahalaga kung bumili ka ng 8 gigabytes ng RAM o kahit 5 gigabytes ng RAM; hindi ka maaaring bilangin na mataas, kaya ito ay walang silbi. Maaari mo lamang i-access ang mga unang 3 o 4 gigabytes ng memory ng iyong computer. Iyon ay mas mababa ng isang isyu ngayon, at maaari kang bumili ng MacBook pros at Dells may 8 gigabytes ng RAM o ng mas maraming mga araw na ito. Ngunit kung magtalaga ko medyo lamang sa programang ito ng pointer, ang pointer ng tinatawag na mga, maaaring magmukhang ganito sa screen dahil sa katunayan kailangan namin upang alisan ng balat pabalik ang layer na ito. Panatilihin ko ang sinasabi ng string, ngunit bilang ng Lunes, string talaga magpasinda *, ang address ng ilang mga karakter. Kaya sabihin na pagsasanay wheel off kahit na patuloy naming paggamit ng GetString sa ngayon. Kaya ipinahayag ko na s, at ito ay isang tipak ng memory, 32 bit. Ano ang in dito sa memorya sa pamamagitan ng default? >> [Hindi marinig na mag-aaral tugon] Ano iyon? >> [Mag-aaral] Basura. >> Basura. Eksakto. Kung programmer ka sa hindi ilagay ang isang halaga sa isang variable, na alam kung ano ito ay? Minsan makakakuha ka ng masuwerteng at 0, na uri ng gandang, malinis default na halaga, ngunit bilang namin nakita Lunes, minsan kumpletong katarantaduhan, ilang talagang malaking positibo o negatibong numero na dumating mula sa kung saan? Oo. >> [Mag-aaral] Ang function na bago. >> Oo. Madalas ang function na Nakakuha tinatawag na bago dahil tandaan, tawagan ka ng mga function sa memory, kumuha ito higit pa at mas maraming espasyo mula sa ibaba pataas, at sa lalong madaling bilang ang return ng function na, ang memorya na maipo-reused ng susunod na tao ay makakakuha ng tinatawag na, na gamit ang iyong parehong hiwa ng memorya. At kung ikaw ay kaliwa basura doon, ang mga nakaraang halaga, maaari naming pagkakamali s bilang may ilang mga halaga kapag talagang hindi namin ilagay ang anumang doon. Kaya aming RAM sa puntong ito ay ganito ang hitsura. Ngayon sa kanang bahagi ng linya 7 kami ay pagtawag GetString, na namin ang paggawa ngayon para sa mga linggo, ngunit kung ano ang GetString talaga ginagawa? GetString nakasulat sa pamamagitan ng CS50 kawani ng kaunti intelligent sa na sa lalong madaling ang user ay nagsisimula ng pag-type ng mga susi at hit Ipasok, GetString figure kung gaano karaming mga keystroke ang ginawa ng user hit, kung gaano karaming mga character ang kailangan kong maglaan ng RAM para sa. At kung saan ang RAM na nanggagaling mula sa, na nakakaalam? Ito ay isang lugar sa 2 gigabytes o watnat ng memory ng iyong computer. Ngunit sabihin ipagpalagay na ang computer nahanap na puwang para sa mga salita HELLO dito mismo. Ang salita na aking nai-type ay H-E-L-L-O. At kung gumuhit namin ito bilang isang pagkakasunud-sunod ng mga character, maaari naming gumuhit ito tulad nito. Ngunit kailangan kong gawin ng 1 extrang bagay. Ano ang nabibilang sa dulo ng anumang string sa C? Ang null karakter, na isulat namin bilang \ 0. Ito ay technically ang bilang 0, ngunit ang backslash ang gumagawa ang lahat ng malinaw na na ito ay literal ang bilang 0, ang integer 0; hindi, para sa Halimbawa, quote-magpanipi 0 na maaari mong i-type sa keyboard. Kaya ito ay HELLO. At kung ano ang sinasabi namin sa Lunes na katangian tulad ng GetString ay aktwal na ibinabalik ang lahat ng mga mga linggo? Hindi ito nagbabalik ng isang string per se dahil na hindi talaga na ang ibig sabihin dahil ang mga string ay hindi umiiral. Uri ng katha sa CS50 library. Ano ay talagang isang string, mas technically? >> [Mag-aaral] ang unang character. Eksakto. Medyo lamang ang address ng unang character na ang gumagamit-type. Kaya kung ang aking salita HELLO nagtatapos ito sa byte numero 123 at pagkatapos ay sa byte numero 124, 125, 126, at iba pa, kung ako lamang ang aking numero bytes mula 0 sa up, kung ano talaga GetString ay bumabalik literal ang bilang 123. Kaya kung ano ay makakakuha ng ilagay sa mga ang numero 123, hindi ang titik H, hindi ang salitang HELLO, medyo lamang ang address kung saan ko mahanap ang unang titik ng HELLO. Ngunit iyon ay hindi tila mas sapat. Tinanong ko para sa isang string, hindi isang character. Kaya kung paano namin o computer alam na ELLO uri ng ay kasama ang H? Ano ang uri ng kasunduan na mayroon kami? Oo. [Mag-aaral] mapigil ang nagsasabi sa mismong upang mahanap ang ilang higit pang mga character. >> Mismong. May ito tao-computer na convention na kung saan kapag ikaw ay pagharap sa string, na kilala ngayon bilang magpasinda bituin, mo lamang upang malaman kung kung saan ang dulo ng bawat string sa buhay sa pamamagitan ng talagang lamang iterating sa paglipas ng ito sa isang para sa loop, isang habang loop, anumang, kaya na kapag nakita mo ang dulo ng string maaari mo na ngayong magpakilala mula sa, oh, ang buong salita ay HELLO. Mga may bago programming karanasan maaaring malaman sa Java Maaari mo lamang tawagan. haba at sa iba pang mga wika, maaari mong tawagin ang haba o katulad na. Iyon ay dahil sa maraming wika, lalo na ng mga bagay na tinatawag na object-oriented wika, ang haba ng isang bagay ay uri ng encapsulated sa loob ng piraso ng data mismo, mas gusto namin encapsulated mga ID at pangalan at mga bahay sa loob ng isang mag-aaral sa Lunes. Ngunit C ay mas mababa sa antas ng. Walang mga bagay o klase, kung narinig mo na ang mga term na iyon bago. Ang kailangan mo talaga ay memory address. Kaya ito ay uri ng makaluma paraan ng kumakatawan ng mga kawili-wiling mga istraktura ng data. Mayroon kang isang panimula halaga tulad ng address ng unang character at pagkatapos ay ilang arbitrary convention na ang lahat ay sumasang-ayon na sundin. Kaya paano string haba ipinatupad, ang naming ipanukala? Strlen, strlen, na ang ilan sa inyo ay ngayon ginagamit ng ilang beses. Medyo simple, i-right? Ito ay tulad ng 2 linya ng code. Medyo mas para sa loop ng uri, maaaring may isang karagdagang lokal na variable. Ngunit strlen lamang sa isang pointer at pagkatapos ay simulan ang naghahanap para sa \ 0. At sa lalong madaling nahahanap nito ito, maaari itong ibalik ang kabuuang bilang ng mga hakbang na ito ay kinuha sa na string. Upang maaari naming magpakilala mula sa kung ano ang napupunta sa susunod na. Ipagpalagay pagkatapos ko idedeklara t bilang ko na ginawa sa linya 10. Ito ay ilang mga basura na halaga. Sino ang nakakaalam sa unang? Ngunit sa kanang bahagi ng linya ng 10 ako pagtawag GetString muli. Sino ang nakakaalam kung saan ito nagtatapos? Sabihin mang sabihin na ang operating system nahanap na room para sa ito sa ganitong paraan sa paglipas dito. Mangyayari kong coincidentally type muli ang H-E-L-L-O, at upang maaari naming gumuhit ng ang parehong uri ng larawan. Ngunit ang katunayan na ako redrawn ang larawang ito ay sinadya dahil iyon ay isang ibang HELLO kaysa sa isang ito. Kaya dito ito ay maaaring lokasyon 456, ito ay 457, at iba pa. Kaya kung ano ay makakakuha ng ilagay kung saan ang tandang pananong nang isang beses ay? Sa kasong ito 456. Namin ang pagpili ng mga numerong ito mang dahil talagang matapos ngayon hindi namin ay pagpunta sa pakialam kaya magkano ang tungkol sa kung ano ang address ng anumang. Ang pinapahalagahan namin na maaari naming malaman ang address ng ilang mga piraso ng data tulad ng HELLO. Kaya talagang kung ano ang karamihan sa mga tao ay gawin sa computer science kapag pakikipag-usap tungkol sa mga address memory at pakikipag-usap tungkol sa mga payo partikular, sa halip na abala sa pag-uunawa ng 123 - na nagmamalasakit kung saan ang mga bagay-bagay na ito talaga, lamang namin alam na ito ay sa ilang numerical address - pasimplehin namin ang mundo at sabihin na s ay tumuturo sa na character na at t ay tumuturo sa na character na. At ang katotohanan na ito ay isang arrow medyo intensyonal dahil literal na ngayon mga pagturo sa H at t na tumuturo sa iba pang mga H dahil sa pagtatapos ng araw, hindi ito ay mahalaga kung ano ang address, ngunit ang kahit na mayroon kaming kakayahan upang ipahayag ang address na iyon na may ilang piraso ng code. Hindi namin talagang manipulahin ang mga address na ito pa lamang kaya ipapakita namin makita kung saan maaari naming pasukan at uri-uriin ng gawin ang mga bagay na may mga payo, ngunit sa ngayon sa linya 12 literal kung ano ang halaga ay namin ng paghahambing ayon sa kuwentong ito sa linya 12? Namin sinasabi na 123 katumbas na katumbas ng 456? At na ang tiyak na hindi ito ang kaso. At kahit conceptually, ang pointer na ito ay siguradong hindi ang parehong bilang na ito dahil tinatawag mo GetString dalawang beses, at GetString hindi subukan sa sobrang matalino, hindi ito subukan Napagtanto, oh, nai-type mo HELLO 5 minuto ang nakalipas; ipaalam sa akin magbibigay sa iyo ng parehong pointer bilang Nagbigay ako sa iyo bago, ito lamang allocates isang bagong tipak ng memory sa bawat oras na tawagan ka. Kaya kung paano namin ayusin ang problemang ito? Kung mas mataas na antas na gusto ko upang ihambing ang string HELLO at HELLO - Wala akong pakialam tungkol sa mga payo - paano ko pumunta tungkol sa pagsagot sa tanong, ay ang user na i-type ang mga parehong bagay? Ano ang kinakailangan dito? Oo. [Mag-aaral] Gumamit ng isang function. >> Maaari ko bang gamitin ang isang function ng kahon. Maaari ko bang gamitin ang isang function na tinatawag na strcmp, s-t-r-c-m-p, lamang ang dinaglat na bersyon ng sinasabi string ihambing. At kung pumunta kami sa, halimbawa, ihambing 2, na kung saan ay kabilang sa mga handouts ngayon, Gawin ko eksakto na. Ko iningatan ang lahat ng iba pa sa parehong mula sa linya 1 sa down sa 26 o kaya, at ngayon mapansin Ang bahagi na ito ay nagbago ng kaunti lamang. Natin balewalain linya 28 para sa isang sandali at tumutok lamang sa isang ito. Ano ang naming sabihin sa Lunes na ginagawa ang Ihambing ang STR? Nito pinangangasiwaan ang proseso ng pagkuha ng 2 pointer, s at t sa kasong ito, uri ng halos paglalagay nito daliri sa mga 2 titik, at kung ano ang dapat nitong gawin ang isang bagay tulad ng isang habang loop o para sa loop, at sinasabi nito ang mga ito sa parehong? Kung gayon, gumagalaw ang mga daliri o ang mga payo pasulong. Sigurado mga ito ang parehong, ang mga ito ang parehong, ang mga ito ang parehong, mga ito ang parehong, ang mga ito ang parehong? At ooh, ako sa dulo ng string sa parehong mga at t. Hindi ko nahanap ang anumang mga contradictions. Oo, ang mga string na ito ay ang parehong. At kung ano ang STR ihambing return kung 2 string sa parehong, tila? Zero. Kaya 0 mahusay na sa kasong ito dahil kung ito nagbabalik -1 o +1, na nangangahulugan na s lamang ang mangyayari sa darating bago t ayon sa alpabeto o pagkatapos t. At bakit na kapaki-pakinabang na magkaroon ng isang function na nagsasabi sa iyo kung aling mga string ay bago o pagkatapos sa isang diksyunaryo? [Mag-aaral] Naghahanap. >> Paghahanap at pag-uuri-uri. Kaya maaari mong gawin ang mga bagay tulad ng binary paghahanap o bubble-uuri o sumanib-uuri kung saan mayroon kang upang ihambing ang mga bagay. Kaya malayo na namin ang uri ng cut ilang sulok at lamang uusapang tungkol sa pag-uuri-uri sa konteksto ng mga numero dahil ito ay maganda at madaling pag-uusapan, ngunit maaari kang tiyak na ihambing ang mga string, mansanas at saging, dahil kung ang mansanas ay kilala sa darating bago saging, katulad, maaari mong ilipat ang mga string sa paligid sa memory tulad ng Rob ginawa sa pagsasama-uuri sa video at ginawa namin dito sa entablado sa pagpili ng uri, pagpapasok ng uri, at bubble-uuri. Kaya kung saan pa ang maaari naming gawin ito? Hayaan ang subukan ito. Hayaan uri ng kalimutan na aralin para sa isang sandali at subukan ngayon at kopyahin 1.c upang gawin ang mga sumusunod. Sa linya 21 ako sinasabi ng naka-print ng isang bagay, pagkatapos Nakakuha ako ng isang string mula sa gumagamit, pagkatapos Lalabas na ako ito. Hindi talaga namin ang nakuha sa ito ugali, ngunit sabihin na ngayong gawin ito. Natin aktwal alisan ng balat pabalik ang layer na ito. Talaga ito magpasinda *. Tao talaga ito magpasinda *. Kaya kung ano ang ibig sabihin na check kung mga == null? Ito ay lumiliko out na kapag tumawag ka ng isang katangian tulad GetString o mas pangkalahatang lamang hilingin sa isang computer upang bigyan ka ng ilang mga memorya, isang bagay na maaaring magkamali. Maaari kang na mabaliw at hilingin sa computer para sa isang terabyte ng memory sa pamamagitan ng pagtatanong para sa mga trillions ng byte ng memorya na lang hindi umiiral sa computer, ngunit GetString at iba pang mga function ay nangangailangan ng ilang mga paraan ng sumisigaw sa iyo kung hiniling mo para sa masyadong maraming. At ang paraan GetString ito ay kung tatanungin mo ang para sa higit pang memory kaysa sa computer, kahit na sobrang, sobrang mababa posibilidad dahil wala sa amin ay i-type ang isang trilyon character at pagkatapos ay pindutin ang Enter, ngunit mababa ang posibilidad bagaman maaari itong maging, gusto ko pa rin upang suriin ito kung sakali, at ang mga espesyal na halaga na GetString, sagot, at iba pang mga function babalik kung may maling naganap null sa lahat ng mga cap. At ano ang null? Null lamang kaya ang mangyayari kumakatawan sa isang pointer. 0 memory address. Ang mundo ay nagpasya na mang, kung ito ay memorya ng aking computer - alam mo kung ano? - kami ay pagpunta sa nakawin ang 1 byte lang ng memory sa bawat computer, at ito ay lokasyon 0. Kami ay pagpunta sa bigyan ito ng isang palayaw ng Null, at kami ay pagpunta sa nangangako na hindi aktwal na namin ilagay ang totoong data doon dahil lamang namin mang kailangan ng isang espesyal na halaga, 0, aka null, upang maaari naming sumigaw sa mga gumagamit kung ang isang bagay napupunta mali. Kung hindi man hindi mo maaaring malaman ang 0 bang ilagay ang isang bagay dito o ang ibig sabihin may nangyaring mali? Mayroon kaming sa lahat na sumang-ayon na null ay nangangahulugan na walang ay ibinalik, walang aktwal na address ay ibinalik. Ngayon, dito lang ako sa paghango ng aking tao convention ng ko bumalik 1 mula sa pangunahing kung ang isang bagay napupunta mali. Iyon ay dahil ang return convention pangunahing ay upang bumalik ang 0 kung magandang, 1 o ilang iba pang mga halaga kung masamang. Ngunit GetString at anumang function na deal sa memory return null kung ang isang bagay napupunta masamang. Okay. Sa kasamaang-palad, linya 27, sobrang simple bagaman ito ay, ganap na nabigo upang kopyahin ang string. Bakit? Maaari naming makita ito tulad ng sumusunod. Ako kine-claim sa linya 27 sa paggawa ng isang kopya ng mga at pagtawag ito t. Kaya hindi ako na humihiling ng gumagamit para sa 2 string oras na ito; lang ako sinasabi ang halaga sa mga dapat na ilagay sa t pati na rin. Kaya ngayon lang upang ipakita kung gaano sirang ito ay, sa linya 29 pasulong kung ano ang ako ginagawa? Una Lalabas na ako kung ang haba ng t ay mas malaki kaysa sa 0. Ang ilang string doon. Gumagamit ang nai-type ng isang bagay. Ano ang linya 32 ginagawa, tila? [Hindi marinig na tugon ng mag-aaral] >> Karapatan. Maaari mong uri ng magpakilala ang mga ito mula sa kung ano ang sinabi ko ito ginagawa. Ngunit technically, kung ano ang ito ginagawa? t [0] kumakatawan sa kung ano ang? [Mag-aaral] Ang 0 karakter. >> [Malan] Ang 0 karakter. O, mas tao tulad, ang unang character sa t, anumang na, H siguro sa kasong ito. At toupper ginagawa kung ano ang nakasulat. Ito capitalizes ang 0 karakter ng t at ito ay nagbabago dito. Kaya ito ay nangangahulugan 0 character ng t, gawin itong uppercase, at ilagay ito pabalik sa parehong lokasyon na iyon. Kaya kung type ko kumusta sa lowercase, ito ay dapat baguhin ang lowercase h sa isang kabisera H. Ngunit ang problema ay na sa linya 35 at 36 kung ano ako tungkol sa gawin ay i-print para sa amin s at t. At kung ano ang iyong kutob ng loob? Ano ako aktwal na pagpunta upang makita kung ako na nai-type sa halo sa lahat ng maliit na? Kung ano ang nangyayari upang naka-print? >> [Hindi marinig na mag-aaral ng tugon] >> Ano na? [Mag-aaral] Big H at ang natitira maliit. >> Ang malaking H at ang iba pa sa maliit na kung saan, s o t? [Mag-aaral] Parehong. >> Parehong. Eksakto. Kaya sabihin makita kung ano ang nangyayari sa dito. Hayaan akong magpatuloy at makatipon ito. Ito ay COPY1, kaya COPY1. Ayos lang. Mag-zoom in Ipaalam sa akin sige at patakbuhin COPY1, Ipasok, Sabihin ang isang bagay: kumusta sa lowercase. Sa malaking titik ang kopya, ngunit ito tila sa malaking titik ang orihinal pati na rin, dahil kung ano ang mangyayari ngayon sa kuwentong ito? Sa linya 27 Hindi ko aktwal na tila kopyahin ang string, ngunit kahit na maaaring intuitively mo umasa na ang kaso, kung sa tingin mo tungkol sa ang larawang ito, kung ano talaga ko tapos? Kalahati ng larawan ay pareho. Kaya sabihin pagulungin pabalik sa panahon upang t ay hindi pa umiiral sa kuwento. Maaari S umiiral sa kuwento, ngunit natin lowercase kumusta oras na ito. Kaya hayaan mo akong ayusin kung ano ang ko aktwal na-type. Sa kasong ito dito mayroon kaming h-e-l-l-o. Susubukan naming gumuhit ang mga ito bilang isang pagkakasunud-sunod ng mga character, ilalagay ang aking mga linya ng separator dito at ang aking \ 0. Kaya ito ay kung saan kami ay sa lalong madaling linya 1 sa pamamagitan ng 24-ish, bigyan o tumagal, na pinaandar. Ito ang larawan ng aking memorya. Kapag nakuha ko sa linya 27, ano ang mangyayari? Tulad bago, kumuha ako ng pointer, na makikita ko gumuhit bilang sa square na ito. Ito ay tinatawag na t. At ano ang halaga nito bilang default? Sino ang nakakaalam? Ang ilang mga halaga ng basura. Kaya bibigyan ko abstract na ang layo bilang isang tandang pananong. At sa lalong madaling ang kanang bahagi ng linya 27 executes, ano ako ng paglalagay sa loob ng t? Ang parehong bagay na sa s. Kaya kung namin para sa isang sandali alisin ang abstraction ng arrow at sabihin namin, oh, ito ay address ng memorya ng pagkarga 123, kapag sinabi mong t nakakakuha ng mga, semicolon, literal naglalagay ka ng 123 dito. Ngayon kung namin uri ng pasimplehin muli ang ating mundo sa pamamagitan ng mga larawan, kung ano ang talagang nagawa mo na lamang naidagdag isa pang arrow sa iyong mundo na nakaturo mula sa t ang parehong eksaktong string. Kaya kapag sa linya 31 at 32 ko aktwal na pumunta tungkol sa pagbabago ng mga t [0], kung ano ang t [0] tila magkasingkahulugan na may ngayon? s [0] Kaya na ang lahat na nangyayari. At kahit na ang ganitong uri ng pakiramdam ng isang maliit na mababang antas at arcane at ang ganitong uri ng pakiramdam ng tulad marahil intuitively na ito ay dapat lamang na nagtrabaho - Ko na gumawa ng mga kopya ng mga bagay bago at ito ay nagtrabaho - kung aktwal mong isipin ang tungkol sa kung ano ang string isang talagang, ito ay isang pansamantalang trabaho *. Well, ano iyon? Ang address ng ilang mga karakter. Pagkatapos ay marahil ito ay ginagawang higit pang kahulugan na kapag sinubukan mong gawin ang isang bagay sobrang tila simple tulad nito, ang lahat ng iyong ginagawa ay pagkopya ng memory address. Hindi ka aktwal na paggawa ng anumang sa mga string mismo. Kaya kahit na mayroon kang mga ideya kung paano mo malutas ang problemang ito sa code, mataas na antas, conceptually, kung ano ang kailangan naming gawin upang gumawa ng salamat tunay na kopya ng mga, tila? Oo. >> [Mag-aaral] Bigyan ito ng isang bagong lokasyon? >> Mismong. Kailangan namin upang magbigay ng isang bagung-bagong lokasyon ang t. Kailangan naming sa paanuman lumikha ng isang mundo kung saan makuha namin ang isang bagong tipak ng memory, na para lamang sa kapakanan kalinawan kukunin ko na gumuhit kanan sa ibaba ang isang ito, ngunit hindi ito kailangan upang maging doon. Ngunit kailangan nito na ang parehong laki, kaya ako gumuhit ng mga vertical na linya sa parehong lugar. Ito ang masarap na kung ito ay ang lahat ng basura sa una. Na nakakaalam kung ano ang doon? Ngunit ang hakbang 1 na ninyo ako bilang karaming memory Kailangan ko upang magkasya ang isang kopya ng halo, pagkatapos malaman kung paano upang kopyahin ang h dito, e dito, ang l dito at iba pa. Ngunit ito ay dapat na pakiramdam ng kaunti halata kahit na ang ilan sa mga detalye ay pa rin abstract. Upang kopyahin ang string na ito sa ito, ito lamang para sa loop o habang loop o isang bagay na kung saan mo na maging ang lahat ng mga mas pamilyar. Kaya sabihin subukan ito. Hayaan akong pumunta sa copy2.c. Sa copy2.c kami ay may halos ang parehong programa maliban sa linya 27. Mukhang ng kaunti complex, ngunit kung masira namin ito piraso sa pamamagitan ng piraso, sa kaliwang bahagi ay ang parehong. Magpasinda * t lumilikha ang bagay na ito sa memory, kahit na may isang tandang pananong dahil wala kaming ideya kung ano ang doon sa pamamagitan ng default. Sa kanang bahagi ngayon ipinapakilala namin ang isang bagong function, malloc, para sa memory maglaan, ninyo ako memory, at tumatagal tila ito kung gaano karaming mga argumento, kung gaano karaming mga bagay sa loob ng panaklong? Narinig ko murmurings ng 1 at 2, ngunit ito ay may 1. Walang kuwit, na nangangahulugan na may 1 bagay sa loob ng panaklong. Kahit na may ibang mga panaklong, hayaan mo akong i-highlight kung ano ang nasa loob ng ng pinakamalayo panaklong, at ito expression: (Strlen (s) + 1) * sizeof (pansamantalang trabaho). Kaya kung sa tingin namin ang aktwal na ito sa pamamagitan ng, ito ay sinasabi ninyo sa akin ang haba ng mga. Bakit Ako, bagaman, ang pagdaragdag ng 1 papunta sa haba? >> [Hindi marinig na mag-aaral tugon] Eksakto. Kailangan namin ng espasyo para sa tao na ito sa buntot, ang ika-anim na character na ay walang Ingles na kahulugan ngunit may espesyal na program kahulugan. Kaya kailangan namin ng + 1 para sa dahil strlen babalik ang mga tao na inaasahan ng haba, halo o 5, hindi ito magbibigay sa iyo ang karagdagang character null. Kaya ko bang mano-manong magdagdag ng ito sa + 1. At pagkatapos na ito, * laki ng (magpasinda), hindi namin nakita ito bago. Na ito ay hindi technically isang function. Ito ay isang espesyal na keyword na lamang ay nagsasabi sa iyo kung ano ang laki ng ilang mga uri ng data sa isang computer dahil sa katotohanan, ang ilan sa atin ay may 32-bit na computer. Mayroon akong isang medyo lumang computer sa bahay, at Ginagamit lamang ng 32 bits upang kumatawan ang mga payo. At kaya kung ginawa ko ang laki ng isang uri ng data, maaaring ito ay 32 bits. Ngunit kung gumagamit ako ng aking bagong magarbong computer na, maaari ba akong makakuha ng isang halaga ng 64 bit para sa isang bagay tulad ng isang address. Kaya sa kasong ito, sobrang safe, hindi namin pagpunta sa hard code sa isang bagay tulad ng - na rin, kung ano ang laki ng isang pansamantalang trabaho ayon sa kung ano ang namin ang sinabi sa ngayon? Namin na medyo mas pasalita sinabi na 1 byte, at na kung medyo mas tunay na sa buong board. Ngunit muli, ang mga pagpapalagay ay may posibilidad na maging masama. Humantong sila sa maraming surot software kung ang mga tao na gamitin ang iyong software sa mga paraan na hindi mo binalak. Kaya natin abstract ito ang layo at mas generically sabihin Kailangan ko ito maraming mga chunks ng memory at ang bawat tipak ng memory ay dapat katumbas sa laki ng isang character, na kung saan ay sa katunayan katumbas sa 1 sa kasong ito, ngunit ito ay isang mas pangkalahatang paraan ng pagsusulat ng mga ito. Kaya kung ang salita ay kumusta, kung gaano karaming mga byte ang malloc tila maglaan para sa halo? [Mag-aaral] Anim na. >> Six. Nang eksakto tulad ng maraming bilang may namin ang mga marka ng tanong sa screen. At pagkatapos ay kumuha ng hulaan ngayon batay sa iyong pag-unawa ng GetString kung ano ang malloc malamang na bumalik? >> [Mag-aaral] isang address. Isang address ng kung ano? Ng unang tipak ng memory. Wala kaming ideya kung ano ang doon dahil sa ilang ibang mga function na maaaring ginagamit ang memory na ito dati. Ngunit malloc, tulad ng GetString, nagbabalik ang address ng unang byte ng memorya na ito ay magtabi para sa iyo. Gayunpaman, kung ano ang hindi ito gumagawa ng fill in blangko na ito na may isang character na backslash null dahil ito ay lumiliko out maaari mong gamitin ang malloc upang magtalaga ng anumang: ints, string, array, sa kamay, mag-aaral ng mga istraktura. Maaari mong gamitin ang malloc ganap generically. Hindi ito pinapahalagahan o upang malaman kung ano ang iyong paglaan ng memory para sa. Kaya magiging mapangahas para sa malloc maglagay ng \ 0 sa dulo ng bawat tipak ng memory ito ay nagbibigay sa iyo ng dahil ito \ 0 bagay ay isang convention para sa mga string. Hindi ito ginagamit para sa mga ints, hindi ito ay ginagamit para sa kamay, ito ay hindi ginagamit para sa mga mag-aaral. At kaya ang gotcha may malloc na pasanin ay ganap na sa iyo ang programmer tandaan kung gaano karaming mga byte inilalaan at hindi kailanman gumamit ng isang para sa loop o isang habang loop at pumunta lagpas sa hangganan ng tipak ng memorya mo na ibinigay. Ilagay ang isa pang paraan, sa lalong madaling maglaan ka ng memory, hindi mo maaaring tanungin ang operating system, oh, sa pamamagitan ng ang paraan, kung gaano kalaki ng isang tipak ng memorya ay ito? Ito ay ganap na nakasalalay sa iyo upang tandaan kung kailangan mo ng halagang iyon. Kaya sabihin makita kung paano kong magpatuloy sa gamitin ang memory. Sa linya 28 at 29 bakit ako ginagawa ito? Lamang kabuuang katinuan tseke. Baka sakaling may nangyaring mali, hinihiling ko para sa ilang mabaliw halaga ng memory o ako kaya maraming bagay na tumatakbo sa computer na may lamang ay hindi sapat na memorya, isang bagay tulad na, ako ng hindi bababa sa gusto mong suriin para sa null. Sa katotohanan, ang karamihan sa mga computer ay nagbibigay sa iyo ng ilusyon na ang bawat programa maaaring gamitin ang kabuuan ng iyong RAM, ngunit gayon pa man, kung ang mga uri ng gumagamit sa ilang mga nakatutuwang mahaba string siguro dahil hindi sila ng isang masamang tao at aktwal nila sinusubukan ng pag-crash ang iyong programa o paupahang karomata ito, gusto mong hindi bababa sa suriin ang return halaga ng malloc at kung ito ay katumbas null. At kung ito, sabihin lamang quit ngayon dahil hindi ko alam kung ano ang gagawin sa kasong iyon. Paano ko kokopyahin ang string? Mayroong ilang mga paraan upang gawin ito. May STR kopyahin ang mga function sa C, ngunit ito ay napaka-simple para sa amin upang gawin ito ang luma paraan. Unang hayaan mo akong malaman kung ano ang haba ng mga. Maaaring ilagay ko ito sa loop ngunit sa halip lang ako ilagay ito dito para sa kalinawan. Kaya n ngayon nag-iimbak ang haba ng orihinal na string, na tila 5. Pagkatapos sa aking para sa loop ako iterating mula 0 sa hanggang sa n, at sa bawat pag-ulit ako ng paglalagay ng mga [i] sa loob ng t [i]. Kaya na kung ano ang ipinahiwatig ko sa aking 2 daliri pagturo sa string bago. Bilang ito para sa loop iterates tulad nito, ako pagpunta sa pagkopya ng h sa dito, e papunta dito, l sa dito dahil ito ay mga, ito ay t. At pagkatapos ay sa wakas, sa linya 35 kung bakit ako ginagawa ito? Kailangan ko upang matiyak na ako nagtatapos ang string t. At ginawa ko ito sa ganitong paraan upang maging napaka-tahasang. Ngunit ipanukala, isang tao, kung magagawa mong, isang iba't ibang mga paraan ng paggawa nito. Hindi ko talagang kailangan sa line 35. May isa pang paraan upang gawin ito. Oo. >> [Hindi marinig na mag-aaral ng tugon] >> Sabihin ito louder. [Mag-aaral] Mas mababa sa o patas sa. >> Mismong. Maaaring namin lamang sabihin mas mababa sa o katumbas sa n, na sa pangkalahatan ay masamang dahil halos palaging kapag kami ng hanggang sa isang katumbas ng bagay na namin ang pagbibilang pumunta kami ng 1 hakbang Masyadong malayo. Ngunit tandaan, kung gaano karaming mga byte naming maglaan? Inilalaan namin ang strlen ng mga, kaya 5 + 1 para sa isang kabuuang 6. Kaya sa kasong ito ay maaaring naming gawin ang isang bagay tulad nito kaya na namin ang pagkopya hindi lamang ang kumusta kundi pati na rin ang \ 0 sa pinakadulo. Bilang kahalili, maaari naming gamitin ang isang function na tinatawag STR kopya, strcpy, ngunit hindi halos bilang magkano masaya. Ngunit iyon lamang ang lahat ng ginagawa nito sa ilalim ng hood. Pagkatapos bilang wakas, gawin namin ang parehong bagay tulad ng dati. Ko mapakinabangan ang t at pagkatapos ay inaangkin ko na ang orihinal na kamukha ito at ang kopya Mukhang na. Kaya sabihin subukan ito ngayon. Hayaan akong pumunta sa dito. Gawing COPY2. Susubukan naming mag-zoom in at patakbuhin COPY2. Ako i-type sa halo sa lowercase, at sa katunayan ako makakakuha ng lowercase kumusta na tulad ng orihinal ngunit kabisera Kumusta para sa kopya. Ngunit hindi ako tapos pa. Kailangan kong gawin 1 huling bagay dito. 46 at 47 ay malinaw na pagbabakante memorya, ngunit kung ano ang na aktwal na ibig sabihin? Ano ako paggawa, sa tingin mo, sa pamamagitan ng pagtawag sa line 46 at linya 47? Ano ang epekto na mayroon? Oo. [Hindi marinig na mag-aaral tugon] >> Mismong. Ikaw ay nagsasabi sa operating system, hey, salamat para sa memory. Maaari mo na ngayong gamitin ang mga ito para sa ibang tao. At narito ang isang perpektong halimbawa ng mga halaga ng basura. Lang ginamit ko ang memory na ito upang isulat ang salitang kumusta sa 2 lugar, dito, dito, dito, at dito. Kaya ito ay h-e-l-l-o-\ 0. Tumawag ngunit pagkatapos ko line 46 at linya 47, at alam mo kung ano ang mangyayari doon sa mga tuntunin ng larawan? Aktwal, maghintay, ang larawang ito ay ang lumang. Kapag ginawa namin ang kopya, ang tao na ito ay aktwal na tumuturo dito, kaya natin alisin ang mga numero at lamang abstract ang layo muli ng aming mga arrow. Ano ang mangyayari sa ang larawang ito kapag tumawag ako libreng? [Hindi marinig na mag-aaral ng tugon] >> Hindi kahit. Kung tumawag ako ng libre sa mga at t - uri ng nanlilinlang ng tanong - ang larawang ito ay hindi magbago sa lahat dahil sa pagtawag sa mga at pagtawag t lamang nagsasabi sa operating system, hey, maaari mong gamitin muli ang memory na ito, ngunit hindi ito baguhin ito upang null o ilang mga espesyal na character, hindi ito baguhin ito, hindi ito baguhin ang h o e o l o l o sa o sa alinmang lugar sa anumang bagay. Sa mga tuntunin ng larawan, sa lalong madaling tumawag ka ng libre, walang pagbabago. At sa ganyang bagay ay namamalagi sa pinagmulan ng mga halaga ng basura dahil kung pagkatapos ko sa ibang pagkakataon sa programang ito hilingin ang operating system para sa higit pang memory sa GetString o malloc o isang bagay tulad na at operating system na, sigurado, mayroon akong 12 bytes ng memorya lamang napalaya, gamitin ang mga ito, kung ano ang iyong na ipinasa? Ka pagpunta sa ipinasa ng tipak ng memorya na namin karaniwang gumuhit na may mga marka ng tanong, ngunit kung ano ang mga pinag-uusapan mark? Mangyari sila h-e-l-l-o, h-e-l-l-o. Ito ang aming bagong mga halaga ng basura sa lalong madaling magbakante mo na memory. May isang tunay na implikasyon ng mundo dito. Nangyayari ito gawin sa RAM, ngunit ang iyong computer aktwal na gawin ang parehong bagay sa disk. Susubukan naming makipag-usap tungkol dito sa partikular na may isang hinaharap na problema set na nakatutok sa forensics. Ngunit ano ang aktwal na mangyayari kung mayroon kang ilang mga sensitibong financial file sa iyong desktop o ilang pahapyaw na JPEG at i-drag ito sa iyong basurahan, kung ano ang mangyayari kapag mong i-drag ang mga ito sa basura o sa recycle bin? Kang alam kung ano ang ako ng pakikipag-usap tungkol sa. [Tawa] Ano ang mangyayari kapag drag mo na katibayan na sa iyong recycle bin o basurahan? [Hindi marinig na mag-aaral ng tugon] Well, kaya maingat. Ano ang mangyayari kapag ginawa mo na? Ang maikling sagot ay walang, karapatan? Pahapyaw o sensitibong file ay pa rin lamang upo doon sa isang lugar sa iyong hard drive. Karamihan sa atin ng hindi bababa sa natutunan ang mahirap na paraan na kailangan mo upang alisan ng laman ang iyong basurahan o ang iyong recycle bin sa aktwal na tanggalin ang mga file. At sa katunayan, kapag ikaw ay i-right click o Kontrolin click sa iyong basurahan maaari o pumili ng File, Empty Basura o anumang at alisan ng laman ang aktwal na basura ang maaari o recycle bin, kung ano ang aktwal na mangyayari pagkatapos ang larawang ito? Karagdagang wala. Kaya walang aktwal na mangyayari sa disk. At kung namin lamang pansamantalang lumayo sa paksa at isulat - I'll lamang gamitin ang likod ng ito. Kaya ngayon kuwento ay nagbabago mula sa RAM, na kung saan programa umiiral habang nagpapatakbo ka ng mga ito, sa disk, na kung saan sila ay naka-imbak ang mahabang panahon kahit na ang kapangyarihan napupunta out, sa ngayon - at kami na bumalik na ito sa hinaharap - sabihin lang magpanggap na ito ay kumakatawan sa mahirap na biyahe sa loob ng iyong computer dahil pabalik sa araw na ginamit nila sa pabilog disk, tulad ng tumbahin disk. Kaya kung mayroon kang ilang mga sensitibong Excel file, maaaring tumagal ito tipak ng memorya sa disk ng iyong computer, at ako pagguhit ng parehong arbitrary 1s at 0s. Kapag mong i-drag ang file tulad na sa iyong basurahan o recycle bin, literal walang mangyayari dahil Apple at Microsoft na nagpasya lamang basura ang maaari at recycle bin ay talagang lamang ng isang pansamantalang placeholder. Siguro kalaunan ang OS ay alisan ng laman ito para sa iyo, ngunit karaniwan, hindi ito gawin, hindi bababa sa hanggang sa ikaw ay talagang mababa sa espasyo. Gayunpaman, kapag pumunta ka sa walang laman na basura o walang laman ang recycle bin, katulad, walang mangyayari sa ang larawang ito. Ang lahat na mangyayari sa ibang lugar sa iyong computer, may ilang uri ng talahanayan. Ito ay uri ng tulad ng isang maliit na impostor sheet na sinasabi na, sabihin nating, resume.doc, upang ang iyong resume sa isang file sa Microsoft Word na ginagamit upang mabuhay sa lokasyon 123 sa iyong hard disk, hindi sa memory at hindi sa RAM ngunit sa iyong hard disk, at iyong pahapyaw buhay sa JPEG sa 456, at ang iyong mga file sa Excel naninirahan sa 789 o kung saan man. Kapag tinanggal mo ang mga file sa pamamagitan ng aktwal na tinatanggalan ng laman ang basurahan o sa recycle bin, Ang larawan na ito ay hindi magbago. Ang 0s at 1s sa iyong hard drive ay hindi pumunta kahit saan. Ngunit ang table na ito, ito maliit na database ng mga uri, ang pagbabago. Kapag tinanggal mo ang iyong resume, na parang ang file ay tinanggal sa ilang mga kahulugan, ngunit ang lahat ng mga computer na ay ay kalimutan kung saan ang bagay na naninirahan sa iyong hard drive. Ay buo pa rin ang 0s at 1s na sumulat ang iyong resume o anumang ng iba pang mga file. Kaya kung ginawa mo ito sinasadyang, mayroon pa rin ng non-zero posibilidad na maaari mong makuha ang iyong data gamit ang Norton Utilities o ilang commercial software na layunin sa buhay ay upang makahanap ng 0s at 1s na uri ng na naulila, nakalimutan dito ngunit ang natitira dito, sa gayon na maaari mong makuha ang iyong data. O forensic investigators sa pulis o FBI ay aktwal na hard drive at aktwal na hitsura para sa mga pattern ng 0s at 1s na mukhang mga JPEG, hitsura ng Excel file, at bawiin ang mga ito na paraan kahit na ang computer ay nakalimutan kanila doon. Kaya ang tanging paraan na talagang tanggalin ang data, bilang namin talakayin sa hinaharap, ay mag-iskoba o punasan ang file o hard disk sa pamamagitan ng - Hindi ikaw talaga ay maaaring mapupuksa ng 0s at 1s dahil kung hindi man gusto mong magsimula sa isang gigabyte na hard biyahe at gusto mong magtapos sa isang megabyte hard drive kung Patuloy ang pagtanggal, literal, 0s at 1s. Kaya kung ano ang nais mong gawin kung gusto mo talagang upang masakop ang iyong mga track at ang pangunahing problema ay na mayroong pa rin 0s at 1s sa disk? Nakikita ko may gesticulating na nais mong pisikal masira ang aparato. Na gagana. [Tawa] Ngunit kung na ang uri ng isang mamahaling solusyon, kung ano ang maging mas makatwirang? Oo. >> [Mag-aaral]-overwrite ang mga ito. >>-Overwrite ang mga ito sa kung ano? >> [Mag-aaral] Iba pang mga data. Iba pang data. Maaari mo lamang patungan ang iyong disk na may 0s o 1s o lahat ng 0s, lahat ng 1s. At na talaga kung ano ang ilan sa ang software ginagawa. Maaari kang bumili ng software o kahit na makakuha ng libreng software, at kahit na binuo sa Mac OS mga araw na ito, mas mababa ito sa Windows, ay ang kakayahan upang secure na burahin. Aktwal na, kung gusto mong ang lahat ng homran ngayon kung mayroon ka ng Mac at gawin ito, kung mayroon kang ilang mga bagay-bagay sa iyong basurahan, maaari mong gawin Secure Empty Basura, na ginagawa eksakto na. Sa halip na lang burahin ang mga file dito, hindi ito burahin ang 0s at 1s dito, sa halip, ito ay nagbabago ang lahat ng ito, halimbawa, sa 0s at tuldok, tuldok, tuldok. Kaya isa sa iyong mga hinaharap psets ang talagang sinasadya mabawi ang mga data - mga litrato na nagsagawa kami ng mga tao, lugar, at mga bagay sa campus kung saan makikita namin gumawa ng isang forensic imahe ng memory card sa isang digital camera, kung saan ay ang eksaktong parehong ideya - at magkakaroon ka na hinamon upang aktwal na mahanap ang mga pattern na kumakatawan JPEG na sa iyong hard drive, tulad ng na dating mag-aaral na email ko mabasa ng ilang linggo ang nakalipas upang mabawi ang mga litrato ng kanyang kapatid na babae. Bakit hindi namin kumuha ng isang 5-minutong break na dito, at magpapadala kami pangkating muli na may higit sa memorya. Kaya narito ang kung saan ang mga bagay makakuha ng ng kaunti isip-baluktot, ngunit ito ay isang malakas na hakbang patungo sa unawa ito ang lahat ng higit pa. Narito ang isang programa na tinatawag na pointers.c. Kabilang sample code ngayon. Pansinin na sa unang ilang linya, 19 sa pamamagitan ng 22, ang lahat ng ginagawa namin ay isang bagay tulad ng GetString at bumabalik na isang address, pag-iimbak ang mga ito sa mga. Mula ngayon para sa pset kahit 3 kung gusto mong ngunit pset 4 at sa kung saan maaari kang magsimula na gawin ang mga gulong ng pagsasanay off ang iyong sarili, walang dahilan upang magpanggap na string umiiral na ito. Ito ay tiyak na okay lang simulan ang sinasabi ng magpasinda *. Bilang isang bukod, sa online na mga sanggunian at sa mga libro ay maaaring madalas mong makita ang star sa tabi ng variable. Maaari mo ring makita ang mga puwang sa paligid ng magkabilang panig nito. Ang lahat ng mga pagtakbo tama. Sa ngayon, bagaman, makikita namin ilagay sa pamantayan sa diskarteng ito upang gumawa ng sobrang malinaw na magpasinda * ay tulad ng sinasabi ng pointer sa karakter. Na ang uri ng data. At pagkatapos ay ang pangalan ng variable ay s sa kasong ito. Kaya namin nakuha string at namin na tinatawag na ito s. At pagkatapos ay down na dito mapansin na ako ginagawa talagang kaunti ng pagdaya. Ito ay tinatawag na pointer aritmetika, na kung saan ay uri ng sobrang simple. Lamang nangangahulugan idagdag at ibawas ang mga numero sa payo. Ngunit ito ay aktwal na gumagana. Ang program na ito ay tila mga Kopya 1 na character sa string s bawat linya tulad na ang resulta ng pagtatapos - Lang namin palayawin kung saan ito ay pagpunta, gumawa ng mga payo, patakbuhin ang mga payo, hayaan mo akong mag-zoom in. Ngayon ipaalam sa akin ng uri sa isang bagay tulad ng HELLO at i-type ang Enter at mga Kopya 1 character sa bawat linya. Hanggang isang segundo ang nakalipas, ay namin nagawa ito may square bracket pagtatanda. Gusto naming magkaroon ng para sa loop at nais naming gawin printf ng mga [i] at nais naming gawin na muli at muli at muli sa backslash n sa dulo ng bawat linya. Ngunit Ang program na ito ay naiiba. Ang program na ito ay gumagamit ng, literal, aritmetika. Kaya kung ano ang nangyayari sa dito? Una sa lahat, bago ang loop na ito kahit executes, kung ano ang, lamang maging malinaw, mga aktwal? S ay? >> [Mag-aaral] isang address. >> Isang address. At ito ang address ng, sa kaso ng halo, ang unang character sa salitang iyon, na kung saan ay h. Kaya s ay, sa partikular na halimbawa, ang address ng h. Kaya kung ano ang ibig sabihin gawin s + i? Well, i nagsisimula sa 0 sa para sa loop. Ginawa namin na maraming beses. Ako ay pagpunta sa pumunta ng hanggang sa ang haba ng string, tila. Kaya sa unang pag-ulit na ito loop, i ay malinaw naman 0. Kaya expression na ito ay sinasabi ng mga + i - sa halip, mga +0--na kung malinaw naman lamang ni. Kaya kung ano ang mga * dito? Ngayon na aming ginagamit ang star sa isang bahagyang kakaibang paraan. Hayaan akong magpatuloy at mapupuksa ng t dahil tapos na kami sa pakikipag-usap tungkol sa mga t at mga kopya ng mga. Ngayon lang namin nais na sabihin sa isang kuwento na kinasasangkutan ng mga. At iba pa sa panahon na ito, pagkatapos ng pagkakaroon ng uri ng string, ating mundo ay mukhang lubos tulad ng ginawa ito bago na may lamang mga pag-iimbak ang address ng h at mas pangkalahatang pagturo sa string kumusta. Kung gagawin ko ngayon ng isang linya tulad ng * (mga + i), sabihin subukan ito. Kaya * (s + i). Ipaalam sa akin pasimplehin ito dahil ito ay 0, kaya ito ay * (mga +0). Well, maghintay ng isang minuto. Pasimplehin pa. Ito ay * (mga). Well, ngayon ang mga panaklong ay uri ng bobo, kaya ngayon sabihin lamang gawin * s. Kaya sa unang pag-ulit ng ito loop, na linya na naka-highlight, 26, medyo mas katumbas sa pag-print ito. Ano ang data uri ng * s? Sa kontekstong ito, dahil ang bituin ang mangyayari sa tabi sa mismong s, ngunit higit na partikular, dahil kami ay hindi na deklarasyon s, hindi kami ay ang paglikha ng isang variable na ito, walang pagbanggit ng magpasinda * sa linya 26, walang pagbanggit ng string ng keyword, lamang namin gamit ang isang variable na tinatawag na mga, ito lumiliko out ngayon star ay may bahagyang naiiba at, tinatanggap na, nakakalito ang kahulugan. * Dito ay nangangahulugan ng mga pumunta sa address sa s at i-print ang anumang doon. Kaya s ay dito, * s - uri ng tulad ng Chutes at Ladders, sundin ang mga arrow - dito. Kaya ito ay * s. Kaya kung ano ay makakakuha ng naka-print sa unang pag-ulit na loop sa linya 26? -Print ko% c, na placeholder para sa isang character, \ n para sa isang bagong linya. * (Mga + i) kung saan ay i 0 ay lamang ito. Kaya kung ano ang magpasinda ko ilagay sa para sa% c? H. Sa susunod na pag-ulit ng loop - maaari mong malamang na makita kung saan ito ay pagpunta - sa susunod na pag-ulit na i ay malinaw naman 1, kaya ito ay nangangahulugan ng mga +1, at pagkatapos ngayon ko kailangan ang panaklong dahil ngayon star kailangang sabihin pumunta sa memory address ng mga +1. Ano ang mga? Natin ibalik sa oras at sabihin ang arrow na ito ngayon ay hindi aktwal na ginagawa sa amin ang anumang pabor. Hayaan ang higit na partikular sabihin na ito ay itinatago ang numero 123 dahil ang simula ng string na ito kumusta, ito ay address 123, ito ay 124, at iba pa. Kaya sa pangalawang ulit na kapag ako sinasabi ng mga +1, na tulad ng sinasabi 123 +1, na kilala bilang 124, kaya kung ano ang pansamantalang trabaho ay makakakuha ng naka-print sa pangalawang ulit? E sa memory address 124. Pagkatapos + muli, 125, 126, 127, at ang loop ito thankfully hinto bago makuha namin dito dahil gumagamit ako ng strlen upang matiyak na hindi i bilangin masyadong mataas. Kaya na ay masyadong ito. Muli, ito ay tulad ng kahit na namin ay tapos na sa isang linggo ang nakalipas. Hayaan akong sumulat ang mga ito sa linya sa ibaba kahit hindi namin gusto mong gawin parehong. Ito ay kapareho ngayon upang ito. Kaya kahit s ay isang string, bilang namin ang pagtawag ito para sa linggo, s ay talagang isang pansamantalang trabaho *. Kaya kung nais namin na sobrang anal, talagang tamang isulat ang partikular na character sa ith lokasyon gamit ang mga numeric address at ito star operator, ngunit lantaran, ito ay lamang kaya magkano cleaner. Kaya ito ay hindi masama. Dahilan Walang itigil linya 27 dito, ngunit 26 ay halos pareho sa pagtakbo, at ito ay halos pareho sa pagtakbo para sa eksaktong dahilan na namin ang tinatalakay sa gayon ay malayo. At bilang wakas, 29 lamang mahusay na kasanayan. Pagtawag walang mga nangangahulugan na ka na ngayon pagbibigay ang memory na ibinigay mo GetString dahil muli, tulad ng nabanggit ko Monday, GetString para sa linggo ay nagpapakilala ng isang bug sa iyong code. Ang iyong code para sa linggo ay nagkaroon ng mga paglabas memory kung saan ka na humihiling sa GetString para sa memory ngunit hindi mo na pagbibigay ito pabalik. At iyon ay sadyang pinili namin pedagogically dahil ito ay lamang masyadong maraming mag-isip tungkol sa maagang bahagi. Ngunit ngayon ay kailangan namin ng higit pang mahusay na proporsyon. Kung hihilingin mo ang computer para sa memory, bilang ay kaso para sa GetString, na kaso tila malloc, dapat mo na ngayon para sa pset 4 pasulong ding libreng anumang tulad memorya. Mapansin ito ay naiiba mula sa sinasabi ng mga int n. Hindi mo na kailangang magbakante ito dahil hindi mo tawagan GetString at hindi mo tawagan ang malloc. At kahit na tinatawag mo ang GetInt bilang namin ay makakita, GetInt ay hindi magtalaga ng memory para sa iyo dahil maaari mong aktwal na pumasa sa paligid ng mga integer at sa kamay at karakter lamang ang paraan na namin ang paggawa para sa linggo. String, bagaman, ay espesyal dahil talagang sila ang pagdudugtong ng maramihang mga karakter. Kaya hindi lang nila naiiba mula sa mga karakter at sa kamay at ints at ang gusto. Ngunit makikita namin bumalik na bago mahaba. Anumang mga katanungan pagkatapos ay sa simula ng payo? Oo. [Hindi marinig na mag-aaral tanong] Ah, napakagandang tanong. Isa ng ilang mga bagay aktwal na ginagawa ng C para sa iyo, na maginhawa, ito figure para sa iyo kung ano ang laki ng uri ng data at pagkatapos ay ipinapakita na uri ng pagpaparami para sa iyo. Ito walang kinalaman sa kaso ng mga karakter dahil halos palaging pansamantalang trabaho ay 1 byte, kaya ito gumagana lamang. Ngunit para sa kapakanan ng talakayan, kung aktwal mong ang pag-print ng mga integer at ikaw ay sinusubukan upang i-print ang ilang mga halaga s na pagturo sa isang integer, hindi mo katulad ay kailangang gawin + 4 * i lamang dahil int ng 4 bytes. Pointer aritmetika ay nangangahulugan na C at ang tagatala ang lahat ng matematika para sa iyo. Ang mayroon kang pakialam tungkol sa ang pagbilang sa uri ng tao pakiramdam. Oo. [Mag-aaral] Kung ikaw ay ipinapahayag ng isang string sa loob ng isang loop, mayroon kang magbakante ito sa ibang pagkakataon? Magandang tanong. Kung ikaw ay ipinahayag ng isang string sa loob ng para sa loop, kailangan mo magbakante ito sa ibang pagkakataon? Kailangan mo lamang na libreng memorya na maglaan may GetString o may malloc. Kaya kung sabihin mo lang ng bagay na gusto - hayaan mo akong ilagay ang kulot tirante ngayon na may kaugnayan sa gayon ang lahat ng code ay. Kung ginawa mo ang isang bagay, kahit na buggily, tulad nito, magpasinda * t = s, hindi mo na kailangan sa libreng t dahil t ay hindi sangkot anumang pagbanggit ng malloc o GetString. Kung sa pamamagitan ng kaibahan ng ginawa mo ito, GetString, pagkatapos oo, gusto mong kailangang mga libreng t. At sa katunayan, ang iyong lamang pagkakataon upang gawin iyon ngayon sa loob ng loop, para sa parehong isyu ng saklaw na namin ang tinalakay sa nakaraan. Kung hindi mo nais na paglaan ng memorya, paglaan ng memorya, paglaan ng memorya, at sa dulo ng programa dahil nasa labas ka ng na loop, t ay hindi umiiral, ngunit hindi mo sinabi ang operating system na hindi mo kailangan na memory na ito. At bago mahaba, para sa pset 4 o 5 magpapadala kami magbigay ng kasangkapan sa iyo ng isang programa na tinatawag na Valgrind, kung saan ay katulad sa espiritu sa GDB na ito nakuha medyo ng isang arcane interface, ngunit nito layunin sa buhay ay upang makatulong sa iyo. At Valgrind ay isang programa na sa hinaharap ay maghanap sa iyong mga programa naghahanap para sa paglabas ng memory, kung mula GetString o malloc, na magsisimula kaming gamit ang lahat ng higit pa sa bilang itigil namin gamit ang CS50 library bilang magkano. Wakas namin ngayon uri ng bokabularyo at ang uri ng kaisipan na modelo sa teorya na upang malutas ang sirang programa. Kaya sa sirang programa na ito, makipagpalitan ng gumagana sa loob ng makipagpalitan ng, ngunit hindi ito aktwal na nagtrabaho sa pangunahing dahil pangunahing ang pumasa sa x at y, manariwa sa diwa, at mga ay nakapasa sa sa pamamagitan ng mga halaga, kaya na magsalita. Mga kopya ng mga ito ay ibinigay upang magpalitan. Sa pagtatapos ng makipagpalitan ng, isang at b ay sa katunayan ay palitan, ngunit siyempre x at y, bilang namin tinalakay sa Monday, ay hindi. Kaya ko magpanukala sa berde dito na ito ay talagang ang solusyon dito. At aktwal na, hayaan mo akong ilipat ang aking mga bituin lamang upang maging pare-pareho kahit, muli, pagtakbo ito ay hindi mahalaga. Sa hinaharap linggo ipapaliwanag namin kung kailan at kung bakit ito ginagawa kahit. Kaya sa berde na ngayon ang isang solusyon. Lantaran, tinitingnan nito ang isang buong maraming Messier dahil mayroon akong ang lahat ng mga bituin na ito. Hayaan akong ituro ang isang bagay. Sa tuktok na linya dito kung saan sinasabi nito na int * a at int * b sa panimula ng paggawa ng parehong bagay bilang laging ito ay may. Ito ay deklarasyon 2 argumento o parameter swap, ang unang ng kung saan ay isang int pointer tinatawag na, ang pangalawang na kung saan ay isang int pointer na tinatawag na b. Ang tanging bagay na ang bago sa puntong ito ay ang katunayan na ang isang star doon. Ano ang na ibig sabihin nito? Ay hindi isang int, b ay hindi isang int. Ang address ng isang int at b ang address ng isang iba't ibang mga int. Down dito, ito ay kung saan umamin ako C nakakakuha ng nakalilito. Ngayon sinusubukan namin gamit ang isang star, ngunit ito ay may iba't ibang kahulugan sa kontekstong ito. Dahil hindi namin deklarasyon payo bilang ay namin dito, dito namin ay dereferencing bagay. Kaya technically, ang star sa konteksto ng una, ikalawa, at ikatlong linya sa loob ng makipagpalitan ng ay ang dereference operator, na lamang ay nangangahulugan pumunta doon. Kaya lamang ng aking daliri sinundan ang arrow sa h, * Ang isang paraan pumunta sa address na iyon at mahanap ako ng int na doon. * B paraan pumunta sa address at pumasa sa akin kung ano ang doon. Kaya sabihin redraw ang larawan mula Lunes ngayon ay gumagamit ng isang stack ng mga frame, sa ibaba kung saan ay pagpunta sa pangunahing, itaas na kung saan ay magiging makipagpalitan ng, kaya na ang ating mundo ay mukhang, tulad ng Lunes, tulad nito. Narito ang isang tipak ng memorya na pangunahing pagpunta sa gamitin. Manariwa sa diwa mula Lunes na ang programa ay may 2 variable, isang tinatawag na x at tinatawag y, at ako ay ilagay ang mga numero 1 at 2 doon. Ngayon kapag tumawag ako swap tulad ng ginawa ko sa Lunes, dati kapag ginamit ko ang pulang bersyon ng programang ito, na ganito ang hitsura, Nakatanggap ako ng 2 parameter, at b, at kung ano ang namin magsulat dito at dito? Lang sa 1 at 2, literal kinokopya ng x at y. Ngayon naming baguhin na. Ngayon sa halip ng pagpasa sa ints at b namin ay pagpunta sa pumasa sa 2 address. Mga address na iyon mangyari upang ituro sa mga ints, ngunit ang mga address na iyon ay hindi ints sa kanilang sarili. Ang mga ito ay address. Ito ay tulad ng isang postal address sa halip. Kaya ngayon ay kailangan naming lamang magbigay sa aking sarili ng kaunti pa sa detalye sa screen. Ito ay memorya ng aking computer na ito lahat ng araw. Ngayon kailangan namin ng ilang arbitrary na numero scheme. Kaya sabihin lamang sabihin, sa pamamagitan lamang ng pagkakataon na ito memory address 123, 124. Sabihin lamang sabihin na ito ay 125, ito ay 126, at iba pa, ngunit na lubos na arbitrary. Kailangan lang namin ang ilang mga numero scheme sa aking memorya. Kaya ngayon kapag ako ay aktwal na pumasa sa x at y, hindi ako pagpunta sa pumasa sa x at y; Ako pagpunta sa pumasa sa postal address, kaya na magsalita, ng x at ng y kaya kung ano ay makakakuha ng naka-imbak dito at dito ay hindi 1 at 2, ngunit kung maaari mong makita ang aking maliit na teksto, kung ano ay makakakuha pumasa sa sa dito at dito? [Hindi marinig na mag-aaral tugon] >> Mismong. 123 ay makakakuha ng ilagay dito at 124 ay makakakuha ng ilagay dito. Ngayon, dahil ginamit ko ang star sa unang paraan ng line up dito sa itaas, ang aking programa lamang alam na 123 at 124, kahit na nasa malinaw naman integer na ang tao anumang maaaring mapansin, dapat silang kahulugan ng mga address, numeric address. Hindi nila at sa kanilang sarili ints, sila ang mga address, at na dahil tahasan ko ilagay ang mga bituin doon. Kaya ngayon sa aking una, ikalawa, at ikatlong linya ng aktwal na code kung ano ang mangyayari dito? Natin gumuhit ang natitirang bahagi ng larawan. Tmp ay tulad ng ito ay sa Lunes. Walang espesyal na tungkol sa tmp. Ito ay isang lokal na 32 bit variable, at sa loob ng na tila ako itinatago ang halaga ng * ng. Ngayon, kung sinabi ko lang tmp = a, kung ano ang gusto kong ilagay dito? >> [Mag-aaral] 123. 123. Ngunit hindi kung ano ang ako ginagawa. Ako sinasabi tmp = * a. Star paraan pumunta doon. Kaya dito ay, 123. Paano ko pumunta doon? Magpanggap tulad ang isang arrow. Well, may ito ay, 1. Kaya kung ano ay makakakuha ng naka-imbak sa tmp, tila? Lang 1. Kaya sa ibang salita, tmp * a, * isang paraan pumunta sa address na ay kasalukuyang sa isang, na tila 123. Okay, dito namin sa lokasyon 123, ko makita ang numero 1, kaya ako pagpunta upang ilagay ang numero 1 doon. Ngayon ano ang gagawin ko sa linya 2, * a = * b? Ito ay ng kaunti pa kasangkot dahil ngayon kung ano ang? Ito ay 123. Kaya * ay kung saan? Kung saan ako ay bago. Kaya pumunta doon. Okay. Bilang wakas, ngayon, at pagkatapos ay sa wakas na ito ay magsisimula kabuluhan, sana, * B nangangahulugan kung ano ang nasa b? 124. Kaya kailangan kong pumunta doon, na kung saan ay 2. Kaya ano ang gagawin ko bang ilagay kung saan? 2 napupunta sa dito dahil ang * b pupunta sa * isang. Kaya ko na. At maaari ka na makita, marahil, na hindi namin kaya magkano ang mas malapit sa paglutas tama ito bobo, simpleng problema para sa unang pagkakataon dahil ngayon mayroon pa rin kaming isang paggunita ng kung ano ang x ay, kami ay may 2 kopya, tinatanggap na, ng y, ngunit linya 3 ngayon sabi ni * b. Kaya dito ang b. * B paraan pumunta doon. Kaya kung saan ay ang lokasyon ng 124? Ito ay tila dito. Kaya ano ang gagawin ko bang ilagay dito? Malinaw, tmp. Kaya ngayon gagawin ko ito. Kaya Mayroon akong 1 dito at 2 dito. At ngayon kung ano ang tungkol sa lahat ng ito, ang 123, ang 124, at ang 1? Sa lalong madaling makipagpalitan babalik, ang memory na ito ay kasing ganda ng mawawala dahil sa lalong madaling makipagpalitan babalik, operating system libreng gamitin na memorya muli sa hinaharap. Lamang memorya pangunahing sa ilalim ng ang tinatawag na stack sticks sa paligid. At kaya ngayon namin sa wakas ay may isang gumaganang bersyon. Hayaan akong pumunta sa swap.c, at mapansin ang mga sumusunod. Sa tuktok ng programa binago ko ang aking prototype na int * a at int * b. Kaya ang tanging bagay na ako ay nagbago upang pumunta mula sa pula, na ay hindi maganda, berde, na ay mabuti, ay Nagdagdag ako ng mga bituin na ito ngayon. Ngunit pagkatapos ay down na dito sa swap mismo ako ay kopyahin, i-paste kung ano ang sa slide. Mayroon akong isang bituin dito, bituin dito - na tumutugma sa prototype - at pagkatapos ang lahat ng mga bagay na ito ay mayroon na ngayong bituin maliban sa tmp dahil ang paggamit ng isang pansamantalang variable, walang bagong doon. Kailangan ko lang pansamantalang imbakan para sa isang int. Kaya hindi namin kailangan ng star doon. Kailangan lang namin ang bituin sa gayon maaari naming cross ang ganitong uri ng mga arbitrary na hangganan sa pagitan ng mga 2 frame sa memorya ng aking computer. Ngunit ang isang huling bagay ay upang baguhin, at maaari mong glimpsed nito. Ano ang iba pang mga linya ay malinaw naman iba't ibang ngayon? >> [Mag-aaral] & x. Oo, kaya 25 ay ang huling linya ng code na kailangan kong baguhin para sa upang gumana. Isang linggo ang nakalipas at kahit sa Lunes linya 25 tumingin tulad nito, swap x at y, at ito ay pinaghiwa lamang dahil kung sinasabi mo makipagpalitan ng (x, y) binibigyan ng mga kopya ng x at y magpalitan, pagkatapos ito ay ginagawa nito bagay, ngunit hindi ka kailanman aktwal pagbabago x at y mismo. Kaya kahit na hindi mo na nakikita character na ito bago sa mga ampersand sa code, lamang ng hula. Ano ang ampersand gawin, tila? [Mag-aaral] Kinukuha ang address. >> Dadalhin ang address. Kaya ampersand ay sinasabi ninyo sa akin ang address ng x. Sino ang nakakaalam kung saan ito ay? Mangyayari sa 123. Wala akong pakialam. Lamang magbigay sa akin ang address ng x. & Yahin ang ibig sabihin ninyo sa akin ang address ng y. At sa puntong iyon ay perpektong pare-pareho ang kuwento na may larawan iginuhit namin ng ilang sandali ang nakalipas. Kaya ko makikita umamin payo, tiyak na para sa akin kapag ako ay nag-unang nagsimula pag-aaral na ito, ay tiyak isa ng ang hardest bagay sa I-wrap ang aking isip sa paligid. Ngunit Napagtanto, lalo na bilang panatilihin namin ipinapalabas na may mga ganitong uri ng bagay, kung masira mo ito sa mga napaka-simpleng uri ng intellectually hindi kawili-wili ng mga problema lamang paglipat ng numero sa paligid, ang sagot ng maraming ng pagkalito na may mga payo talagang maaaring nagmula mula sa mga napaka pangunahing mekanika. Narito ang isang address. Pumunta doon sa mga bituin. O pasalungat, narito ang isang ampersand. Malaman kung ano ang address na aktwal na. Ayos lang. Kaya kung saan ay ang lahat ng ito memory nagmumula? Iginuhit namin ang ang larawan na ito ng ilang beses, at panatilihin ko maaasahan magpapadala kami bumalik dito, ngunit dito ay ang representasyon ng memory ng iyong computer na ng kaunti pa sa may label kaysa sa aming Chalkboard dito ay. Ang teksto segment sa itaas ay kumakatawan sa kung ano ang may paggalang sa iyong programa? [Hindi marinig na mag-aaral tugon] >> Paumanhin? Sabihing muli. [Mag-aaral] Ang aktwal na programa. >> Ang aktwal na programa. Kaya 0s at 1s na iyong inipon pagkatapos pagsusulat ng C code at pagkatapos ay tumatakbo kumalatong at bumubuo ng mga 0s at 1s dulo hanggang nagsisimula nakatago doon sa memory dahil kapag ikaw ay i-double click ang isang icon sa iyong Mac o PC o magpatakbo ng isang command tulad ng Mario sa iyong maagap, ang iyong 0s at 1s mula sa disk makapag-load sa memory upang ang computer ay maaaring manipulahin ang mga ito at isakatuparan ang mga ito nang mas mabilis. Kaya nasimulan data at uninitialized data, hindi namin makipag-usap magkano ang tungkol sa mga, ngunit ang mga lamang pangkalahatang variable. Nasimulan ay nangangahulugan ng pangkalahatang variable na iyong ibinigay ng mga halaga sa; uninitialized ay nangangahulugan ng pangkalahatang variable na hindi mo pa bigyan halaga sa. Pagkatapos ay may mga kapaligiran variable na makikita ko ganap na iwagayway ang aking kamay sa, ngunit ang mga ito ay may at tindahan ng mga bagay tulad ng iyong user name at iba pang mga uri ng mga mas mababang mga detalye antas. Ngunit ang juiciest piraso ng layout ng iyong memorya ito bagay na tinatawag na stack at ang magbunton. Ng stack muli, upang maging malinaw, ang memorya na ginagamit tuwing function ay tinatawag na, tuwing may mga lokal na variable at tuwing may mga parameter na pumasa sa paligid. Ang lahat ng na mangyayari sa stack. Magbunton ay hindi namin uusapang tungkol sa, ngunit isang hula na gumagamit ng magbunton. Ng ibang tipak ng memory. Ito ay nangyayari iguguhit dito sa tuktok, ngunit na ang isang arbitrary na nakalarawan convention. Sino ang tila ginagamit memorya mula sa magbunton para sa linggo? Technically mo ngunit hindi direkta. >> [Mag-aaral] GetString. GetString at malloc. Kaya dito ang pangunahing pagkakaiba. Alam mo para sa nakalipas na ilang linggo na kung kailangan mong memorya, ipinapahayag lamang sa isang variable. Kung kailangan mo ng maraming memorya, ipinapahayag ng isang array sa loob ng iyong function na. Ngunit ang problema namin na pinananatiling nakaharap kung ipinapahayag mo mga mga variable lokal loob ng function, sa lalong madaling bilang ang return ng function na, kung ano ang mangyayari sa memory at mga variable? Basta uri nito ay hindi na sa iyo, i-right? Mayroon lamang mawala uri ng conceptually. Pa rin pisikal doon, malinaw naman, ngunit ito ay hindi na ang iyong karapatang gamitin. Ito ay malinaw naman problemang kung gusto mong sumulat ng mga function sa buhay na aktwal na magtalaga ng memory at huwag bigyan ito pabalik agad. Kaso sa point: GetString layunin sa buhay ay walang ideya nang maaga gaano kalaki ng isang string na ako i-type sa keyboard, ngunit ito nakuha upang magtalaga ng memory upang i-hold ang David o kumusta o isang buong sanaysay na ang gumagamit ay maaaring nai-type. Kaya GetString ay gumagamit ng malloc. Malloc samakatuwid ay dapat na gamit hindi ng stack; sa halip ito gamit ang bagay na tinatawag na magbunton. May walang iba tungkol sa memory. Hindi mas mabilis o mas mabagal o anumang bagay tulad na. Lang pisikal sa isang iba't ibang mga lokasyon. Ngunit ang panuntunan na ang memory na inilalaan sa magbunton hindi kailanman ay dadalhin ang layo mula sa iyo hanggang sa tawagan ka - maglaan ng hula - libreng. Sa pamamagitan ng kaibahan, ang memorya anumang hinihiling sa iyo para sa stack sa pamamagitan ng lamang na deklarasyon ng isang array o deklarasyon ng variable tulad namin na ginagawa para sa linggo, na sa pamamagitan ng default na nagtatapos sa stack. At na gumagana mahusay na 90% ng oras, ngunit sa mga okasyon ng rarer kung saan nais mong magtalaga ng memorya at panatilihin ang mga ito sa paligid, kailangan mong gumamit ng isang function tulad ng malloc. O ginamit namin ang isang function tulad ng GetString, na gumagamit ng malloc. Natin makita kung saan ito ay maaaring masira at pagkatapos ay isang pagsilip sa Binky. Susubukan naming bumalik iyon sa hinaharap. Narito ang isang napaka-simpleng programa na sa unang 2 linya ang kung ano? Sa Ingles, ano ang gagawin ng mga unang 2 linya ng code sa loob ng main? [Hindi marinig na mag-aaral ng tugon] Maingat. Hindi ito magbigay sa akin ang address ng x o y. [Mag-aaral] Binibigyan ang mga payo sa ints. >> Mahusay. Bigyan mo ako ng mga 2 pointer sa integer. Sa ibang salita, bigyan ako ng 2 chunks ng memorya na panatilihin ko ang pagguhit ngayon, kahit mabura ko ito ngayon, bilang mga parisukat. Bigyan mo ako ng mga 2 chunks ng memorya, isa na tinatawag na x, isa na tinatawag na y - mas maaga Tumawag ako sa kanila s at t - at kung ano ang uri ng na tipak ng memory? Ito ay upang mag-imbak ng isang address. Ng uri int *. Kaya ang address ng isang int kalaunan nakatira sa x, ang address ng isang int kalaunan nakatira sa y, ngunit simula, kung ano ang sa loob ng x at y? Sino ang nakakaalam? Basura halaga. Ito ay walang gawin sa payo. Kung hindi pa namin na ilagay ang isang bagay doon, na alam kung ano ang aktwal na doon? Ngayon, x. Ano ang mangyayari dito? Ito ay legit ngayon dahil x ay isang pointer. Isang int *. Kaya na nangangahulugan na maaari kong ilagay sa x address ng ilang mga tipak ng memory. Ano ang malloc bumalik? Perpekto, ito ay nagbabalik ng mga address, ang address ng unang byte sa isang buong tipak ng memorya. Gaano karaming mga byte ito tila paglaan ng, halimbawa, sa appliance? Ano ang sukat ng isang int? 4. Kung sa tingin mo sa linggo 1, hindi sobrang mahalaga na laging tandaan na, ngunit sa kasong ito ito ay kapaki-pakinabang upang malaman, 4 bytes. Kaya ito ay paglaan sa magbunton 4 bytes at bumabalik ang address ng unang mang sa akin. Ngayon, kung ano ang x ginagawa? A * x = 42 ay ginagawa kung ano ang? Kung sa puntong ito sa kuwento mayroon kaming x, na ganito ang hitsura na may ilang halaga ng basura, ito ay ngayon y na may ilang mga halaga ng basura, ngayon sa linya 3 ko na inilalaan ng 4 bytes. Ang larawan na ito ay mahalagang ganito ang hitsura. O higit na partikular, kung ito ay arbitrary address 123, ito ay kung ano ang aming kuwento sa ngayon mukhang. * X = 42 ngayon ay nangangahulugan kung ano? Iyon ay nangangahulugang ang pumunta sa 123 address at ilagay ang numero 42 doon. Hindi ko kailangan upang gumuhit ng mga linya na ito dahil hindi namin ginagawa ng mga string. Dapat lamang ko nakasulat ito tulad nito, at para lamang sa kapakanan ng pagpapakita, 42 bilang isang int uri ng tumatagal ng maraming espasyo, 4 bytes. Kaya na kung ano ang nangyari doon, ngunit may problema ngayon. * Y = 13. Ano ang pagpunta sa mangyayari dito? Ang problema ay * y sa aming pinasimple mundo ay nangangahulugan na pumunta sa address sa y. Ano sa y? Ang ilang halaga ng basura. Kaya sabihin ipinapalagay na ang na ang halaga ng basura ay 5551212, isang bagay na mabaliw tulad na. * Y nangangahulugan pumunta upang matugunan ng 5,551,212. Na bang sa paglipas dito. Ito ay hindi umiiral, halimbawa. Kaya * y ay nakakakuha ng 13 paraan ay sinusubukan ko upang gumuhit ng 13 dito. Ito ay hindi umiiral. Nalampasan ko na ang segment ng pisara. Ano ang makukuha ko? Na misteriyoso mensahe ng segmentation fault dahil ako sinusubukan upang ilagay sa memory ng halaga tulad ng 13 sa isang lugar na hindi umiiral. Ang natitirang bahagi ng programa ay maaaring gumana okay, ngunit up hanggang sa puntong iyon hindi. Kaya sabihin subukan upang sabihin sa kuwentong ito. Susubukan naming bumalik sa sandaling kami uusapang tungkol hex. Natin bumalik na ito at pagtibayin na ito bagay na tinatawag Binky, kung aling manariwa sa diwa ay isang propesor ng Stanford sitting sa bahay sa paglalaro ng may claymation, upang sabihin ang kuwento ng eksakto na parehong programa. Lang tungkol sa 3 minuto ang haba. Narito mayroon namin Binky. [Lalaki speaker sa video] Hey Binky, gumising. Oras para sa pointer masaya. [Binky] Ano iyan? Alamin ang tungkol sa mga payo? Oh, mabait! [Lalaki speaker] Well, upang makapagsimula, hulaan ko kami ay pagpunta sa kailangan ng ilang mga payo. [Binky] Okay. Code na ito allocates 2 pointer na maaaring ituro sa integer. [Lalaki speaker] Okay. Well, nakikita ko sa 2 pointer, ngunit hindi sila mukhang na tumuturo sa anumang. [Binky] Tama iyon. Una, ang mga payo ay hindi tumuturo sa anumang bagay. Ang mga bagay na ituro nilang tinatawag pointees, at pagse-set up ang mga ito ay isang hiwalay na hakbang. [Lalaki speaker] Oh, kanan, kanan. Ko alam na. Mga Ang mga pointees ay hiwalay na. ER, kaya kung paano mo magtalaga ng isang pointee? [Binky] Okay. Allocates ng bagong integer pointee ang code na ito, at ang bahagi na ito ay nagtatakda ng x upang ituro dito. [Lalaki speaker] Hey, na mukhang mas mahusay. Kaya gawin itong gawin ang isang bagay. >> [Binky] Okay. Idedetalye ko dereference pointer x-imbak ang bilang 42 sa nito pointee. Para sa nanlilinlang Kailangan ko ng aking magic wand ng dereferencing. [Lalaki speaker] iyong magic wand ng dereferencing? Mabuti iyan. [Binky] Ito ay kung ano ang code kamukha. Kukunin ko na lang-set up ang numero at ... [Popping sound] [Lalaki speaker] Hey tumingin, may napupunta ito. Kaya ang paggawa ng isang dereference sa x sumusunod ang arrow upang ma-access ang 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. [Binky] Okay. Kukunin ko na lang pumunta sa paglipas dito upang y at makuha ang bilang 13-set up at pagkatapos ay gawin ang wand ng dereferencing at ... [Haging] Whoa! [Lalaki speaker] Oh hey, na ay hindi gumagana. Sabihin nating, Binky, palagay ko ay hindi dereferencing y ay isang magandang ideya dahil sa pagse-set up sa pointee ay isang hiwalay na hakbang at palagay ko ay hindi namin ginawa ito. [Binky] Hmm, magandang punto. [Lalaki speaker] Oo. Inilalaan namin ang pointer y ngunit hindi namin itakda ito upang tumuro sa isang pointee. [Binky] Hmm, napaka mapagmatyag. [Lalaki speaker] Hey, ang hinahanap magandang doon, Binky. Maaari mong ayusin ang mga ito nang sa gayon na y puntos sa parehong pointee bilang x? >> [Binky] Oo naman. Makikita ko bang gamitin ang aking magic wand ng pointer pagtatalaga. [Lalaki] sa speaker Ay na pagpunta sa isang problema tulad ng bago? [Binky] Hindi, ito ay hindi hawakan ang mga pointees. Nagbabago lamang ito ng isang pointer upang tumuro sa ang parehong bagay bilang isa pang. [Popping sound] [Lalaki speaker] Oh, nakikita ko. Ngayon y mga punto sa parehong lugar bilang x. Kaya maghintay. Ngayon y ay naayos. Ay ng pointee. Gayon ay maaari mong subukan ang wand ng dereferencing muli upang ipadala ang 13 sa paglipas. [Binky] Uh, okay. Dito napupunta. [Popping sound] [Lalaki speaker] Hey, tingnan na. Ngayon dereferencing ng mga gawa sa y. At dahil ang mga payo ay nagbabahagi na ang isa pointee, sila parehong makita ang 13. [Binky] Oo, pagbabahagi. Anuman. Kaya ay namin upang lumipat ng mga lugar na ngayon? [Lalaki speaker] Oh hitsura, hindi namin ng oras. >> [Binky] Ngunit - [Lalaki speaker] Tandaan lamang ang 3 pointer panuntunan. Numero 1, ang pangunahing istraktura ay na mayroon kang isang pointer at mga punto sa isang pointee. Ngunit ang pointer at pointee ay hiwalay, at ang karaniwang mga error ay mag-set up ng isang pointer ngunit sa kalimutang upang bigyan ito ng isang pointee. Numero 2, pointer dereferencing nagsisimula sa pointer at sumusunod ang arrow nito sa paglipas ng upang ma-access ang ang pointee nito. Bilang namin ang lahat ng alam, ito ay gagana lamang kung ang isang pointee, kung saan nakukuha ng uri ng pabalik upang mamuno ang numero 1. Numero 3, pagtatalaga ng pointer ay magtatagal ng isang pointer at nagbabago ito upang ituro sa parehong pointee ng isa pang pointer. Kaya matapos ang pagtatalaga, ang 2 pointer ay ituro sa parehong pointee. Minsan na tinatawag na pagbabahagi. At na ang lahat ng may ito talagang. Bye-bye ngayon. Ito ay Binky. Ito ay CS50. Gagamitin namin ang susunod na linggo. [Palakpakan] [CS50.TV]