[MUSIC nagpe-play] David J. MALAN: Ito ay tulad ng isang freshman seminar ngayon. SIGE. Kaya na maulan out. Ito ay may kaugaliang mangyari sa Miyerkoles, ngunit ang lahat ng higit pang pagkakataon para sa mga tanong ngayon. Kaya natin simulan off aktwal na ipaalam may film sa sandali lamang. Ngunit kami ay magsisimula grandly gaya ng lagi. Ito ay CS50, at ito ay ang katapusan ng linggo 4. Kaya kung sakaling mo na pinapanood TV o isang pelikula kung saan ang mayroong ilang mga eksperto computer at sa pulis, o FBI, o ilang ahensiya ay sinusubukan upang mahuli ang ilang mga kalaban, well, na sa iyo malamang naririnig ang expression na "pagbutihin," kung saan na technician sa paanuman magically zoom in walang hanggan malayo upang makita ang mga kriminal pagkakakilanlan o ang license plate number sa kahit na ang kinang ng isang mirror o ang sinag ng mata ng isang tao. Kaya nga, sabihin kumuha ng isang pagtingin sa ilang tulad tanawin mula sa Hollywood. [Playback ng video] -OK, Ngayon sabihin makakuha ng isang mahusay na tumingin sa iyo. -Hawakan mo. Patakbuhin na bumalik. -Sandali lang. Kumanan ka. -There, Freeze na. -buong Screen. -OK, Freeze na. -Tighten Hanggang sa na, ikaw? -Vector In sa na tao sa pamamagitan ng likod na gulong. -Zoom In dito mismo sa lugar na ito. -Sa Mga karapatan na kagamitan, ang imahe maaaring pinalaki at hasa. -Ano yan? -Ito Ay isang programa ng pagpapahusay. -Maaari Mong malinaw na up anumang? -Hindi Ko alam. Mapahusay natin ito. -Enhance Section A6. -I Pinahusay ang mga detalye, at- tingin ko ay may sapat na upang mapahusay, palabasin ito sa aking screen. -I Pinahusay ang pagmuni-muni sa kanyang mata. -Hayaan Ay tumakbo na ito sa pamamagitan enhancement video. -Edgar, Maaari mong pagbutihin ito? -Hang On. -I've Ay nagtatrabaho sa pagmuni-muni. Reflection -isang ni. -Reflection. -Mayroong Isang salamin ng mukha ng tao. -Ang Pagmuni-muni. -Mayroong Isang pagmuni-muni. -Zoom In sa mirror. -Maaari Mong makita ang isang salamin. -Maaari Mong mapahusay ang imahe mula dito? -Maaari Mong mapahusay kanya dito right? -Maaari Mong mapahusay ito? Maaari mong mapahusay ang mga ito? -Maaari Naming mapabuti ito? -Maaari Mong mapahusay ito? -Hold Sa isang segundo, kukunin ko mapapabuti. -Zoom In sa pinto. -Times 10. -Zoom. -Move In. Higit pang-. -Maghintay, Itigil. -Itigil. -Pause Ito. Pihitin amin 75 degrees sa paligid ng vertical, please. -Itigil. Bumalik sa bahagi tungkol sa mga pinto, muli. -Got Isang Enhancer ng imahe na maaaring bitmap? -Hey, Marahil maaari naming gamitin ang Pradeep Sen paraan upang makita sa bintana. -Ang Software ay estado ng art. -Ang Eigenvalue ay off. -Sa Mga karapatan kumbinasyon ng algorithm-- Kinuha aalis -Siya ni algorithm sa susunod na antas, at maaari ko bang gamitin ang mga ito sa mapahusay ito kunan ng larawan. -Lock On at palakihin ang z-axis. -Enhance. -Enhance. -Enhance. -Freeze At mapahusay. [END playback] David J. MALAN: Ang lahat ng mga karapatan, kaya lahat ng mga ito ay tunay na salita. Sila lamang ay may langkin magkasama sa isang paraan na hindi talaga matino. At, sa katunayan, CS50 at mga kurso tulad nito may gawi na sanhi ng kapahamakan ng isang pulutong ng TV at mga pelikula para sa iyo. Dahil kapag ang mga eksperto computer ay digma off tuntunin at sinasabi magarbong mga bagay tulad ng eigenvectors, at ang z-axis, at anumang bilang ng iba pang mga talagang mas teknikal na termino, talagang ito lamang stringing salitang-sama ang lahat ng masyadong madalas. Ay na ang isa sa aming mga pag-asa ay na, bilang isang epekto ng pagkuha courses tulad nito, ay mas maraming tao sa Ang mundo ay tunay na maaaring timbangin sa at lamang napaka bahagyang impluwensiya ang kalidad at katumpakan ng mga pelikula? Sa katunayan, sabihin kumuha ng isang pagtingin sa katotohanan. Kaya dito ay ang mga tauhan ng larawan ng Mary, isa sa aming mga Fellows ng pagtuturo. At ipagpalagay na siya ay pinaghihinalaang ng isang bagay. At gayon pa man, may isang kislap ng ilang piraso ng ebidensiya sa kanyang mata, o sa salamin ng kanyang salamin sa mata. Well, kung gagawin namin ang eksaktong bilang ng mga pelikula imungkahi, kung saan tayo mag-zoom at "mapahusay", ito ay kung gaano karaming impormasyon nasa mukha ni Maria kapag makuha mo ang isang imahe sa na orihinal na resolution. At, sa katunayan, maaari mong makita ang mga tuldok. At ang mga ito kung ano ang mga tinatawag na pixels, P-I-X-E-L-S, na kung saan ay lamang ng isang parisukat na karaniwang iyon ay isang tuldok na composes isang imahe. At bumalik sa araw, at talagang kahit ngayon sa ilang mga araw na LED TV o LCD TV, kung nakuha mo na isa sa iyong kuwarto o sa bahay, kung ikaw ay pupunta up super close na ito, at lalo na kung ito ay isang medyo mas lumang TV, maaari mong marahil kahit na makita ang mga tuldok at iyon ang gumawa ng sulat ng isang imahe. At walang mas impormasyon kaysa ito. Kami ay maaaring "mapahusay", sa kamalayan ng smoothing bagay sa loob at ang uri ng mga inferring uri ng, uri ng kung ano ang kulay ay dapat na sa tabi ni Maria sa mata upang ito ay hindi aktwal na kaya pixelated. Ngunit kung ako panatilihin ang pag-zoom in, may ay ang masamang tao sa kanyang mata. Tulad na ang lahat ng impormasyon na mayroon kami. Hindi ka maaaring lumikha impormasyon mula sa wala. May isang may hangganan lamang bilang ng bits doon. Kaya sa Problema Set 4, kung saan mayroon kang isang pagkakataon upang i-play na may ganitong uri ng daigdig. Sa Problema Set 4, makikita mong galugarin ang mundo ng mga graphics, at forensics, at ang tunay na sumulat ng code na recovers nawala mga imahe. Makikita isulat ang code na minamanipula umiiral na mga imahe at sa huli na maunawaan kung ano ang nangyayari sa ilalim ng hood. At, ito ay lumiliko out, ito ay aktwal na hindi lahat na kumplikado. Halimbawa, kung gusto naming kumakatawan sa isang smiley face kung saan may mga black pixels, o mga itim na tuldok, well, maaari naming lamang kumakatawan ang mga ito bilang tunay na isang bitmap. At kung sakaling mo ay narinig na bitmap expression, marahil Nagsisimula ito ngayon upang makagawa ng isang kaunti pa sa araw na kahulugan. Alam na namin kung ano ang isang bit ay. Ito ay 0 o 1. At ang isang mapa ay lamang ng isang bagay tulad ng isang piraso ng papel na nagbibigay sa iyo ng mga direksyon at may marahil ng isang grid ng x- at y-coordinate. Kaya dito ay isang bitmap. Ito ay isang mapa ng bits kung saan ang isang 1 ay tila pagpunta sa kumakatawan sa isang puting pixel, at isang 0 ay pagpunta sa kumakatawan sa isang itim na pixel. Ngunit kami ay tiyak na maaaring i-flip ito sa paligid. Hindi ito kaya tunay na bagay Hangga't hindi namin pare-pareho. At narito ang kung paano, sa binary-- loob ng memorya ng isang computer, o kahit na sa loob ng isang file sa iyong hard drive-- maaari mong itabi ang pinakasimpleng ng mga smiley face imahe. Ngunit kung ano tayo, siyempre, kulang sa imahe na ito? Kulay ng, tama? Ito ay isang malinaw na susunod na hakbang o enhancement upang mapabuti ito na may kulay. Kaya sa kasamaang-palad na may lamang ng isang solong bit, 0 o 1, maaari naming kumakatawan kulay. Na maaaring maging pula, o asul, o itim, o puti, o berde, o pink, o anumang mga pares ng mga kulay. Ngunit para sa kapakanan simple, bibigyan namin ng ipinapalagay lamang black and white. Kaya kung ano ang lohikal na kailangan namin kung kami nais na ipatupad ang mga kulay sa isang larawan? Ano ang gagawin namin gawin? Tulad ng kung ang mga takda sa kadahilanan dito ay na may isang bit maaari ka lamang kumakatawan sa dalawang estado, 0 o 1, puti o itim, ano ang gusto mong gawin? Madla: More data. David J. MALAN: More bits, oo mas maraming data, mas bits. At, sa katunayan, na eksakto kung paano imahe ng kulay ay kinakatawan. Sa halip na gumamit ng isang solong bit, isang 0 o 1 para sa bawat pixel, ang bawat tuldok, ikaw lamang gamitin ang maramihang. Siguro gamitin 8, marahil, mas karaniwang gamitin ang 24, at sa katunayan, sa Problema Set 4, ikaw ay i-play sa isang file format na gumagamit ng 24 bits ay karaniwang. Ngunit karamihan ng ikaw ay malamang pamilyar sa mga JPEG. Kung nakatanggap ka na kinuha isang larawan sa iyong telepono, o na-upload o nakita ang isang bagay sa Facebook, o Flickr, ang anumang bilang ng mga website batay photo-, na sa iyo marahil makikita ng isang JPEG image bago. At ito ay lumiliko out, ito ay ang file format kami ay pagpunta upang gamitin sa pset 4, kung saan ikaw ay pagpunta sa kung mabawi imahe na sinasadyang ko na tinanggal mula sa isang masama na memory card sa camera, kung gagawin mo. At ito ay lumiliko out na kahit na JPEG ay medyo sophisticated-- ito ay higit na mas sopistikadong kaysa sa mga black and white tuldok Nakita namin ang isang sandali ang nakalipas, dahil mayroong talagang fancy algorithm na ay ginagamit upang i-compress ang isang JPEG, kaya na maaari kang magkaroon ng isang talagang maganda, kalidad ng larawan ngunit gamit medyo ilang bits. At kami ay bumalik sa compression bago ang haba. Ito ay lumiliko out na ang unang tatlong bytes sa isang JPEG image-- kahit na ano ang iyong kinuha ng isang litrato mga of-- ang mga halaga ng 255, 216, 255. Sa ibang salita, kung ikaw lang makita na pattern ng bits, kinakatawan dito bilang tatlong bytes, o 24 bits kabuuang, na may mataas na posibilidad na maaari mong ipahiwatig na ikaw ay naghahanap sa ito sa ganitong unang tatlong bytes ng isang JPEG. At ito ay kung ano ang kilala bilang ang lagda ng isang JPEG. Ang isang pulutong ng mga format ng file out doon ay may posibilidad upang simulan may ilang mga pattern ng 0s at 1s, kaya Windows na iyon, at Mac OS, at iOS, at Android malaman kung anong uri ng mga file ang mga ito ay, bilang karagdagan sa mga tinatawag na file extension na ng maraming mga file na may. Kung na .jpg, na ang isa pang palatandaan sa computer. Kaya sabihin ngayon tingnan ito isang maliit na mas technically. Alam namin ang mga decimal sistema ay 0 hanggang 9. Alam namin binary ay 0 at 1. At kung sa tingin mo bumalik sa pset 0, nagkaroon kami makipagbuno sa iyo ng, para sa isang maliit na piraso, isang bagay tinatawag na hexadecimal, kung saan mayroon kang 16 digit, sa halip ng 10 o sa halip ng 2. At ang mga digit, sa pamamagitan ng convention, mga 0 hanggang 9 at pagkatapos ng isang sa pamamagitan ng f, kung saan f kumakatawan sa kung ano number decimal, tulad ng isang mabilis na kaliwanagan ng isip check? Kaya, 15. At dapat na kumakatawan sa 10, sa pamamagitan lamang ng likas na katangian ng pag-order na ko na ibinigay. Ito lamang ay isang arbitrary convention, ngunit ito ay medyo standard. Kaya kung tinitingnan namin ang pattern na ito ng tatlong bytes-- sabihin simulan lamang na tingnan ang mga ito sa isang paraan na kaayon ng kung paano karaniwang computer na siyentipiko tingnan at isipin ang tungkol sa mga file. Maaari mong tiyak na isipin ang tungkol sa file sa 0s at 1s, at decimal, ngunit sa katotohanan, kami ay madalas na gamitin ang binary o higit pang mga karaniwang hexadecimal-- pabalik mula sa pset 0. Kaya hayaan mo akong imungkahi na 255, 216, at 255 ay lamang ang mga pattern ng 0s at 1s. At maaari mong suriin ito kung ikaw nais na gawin ang matematika mula Linggo 0. Subalit, sa ngayon, ipagpalagay na lamang na ito talaga ang tama. Lamang na isulat muli akong tatlong decimal numero ng tatlong binary halaga. Ngayon kung ano ang ako pagpunta sa gawin ay magdagdag lang ng ilang mga puting espasyo, para lamang sa kapakanan pagiging madaling mabasa ni. At pansinin, ako lamang ang pagpunta upang ilipat ang mga bagay-bagay bukod. Kaya bago, pagkatapos, bago, matapos. Wala na interesante ibang ako paggawa kaysa sa pagkalat lang ang mga bagay sa labas kaya na notice bawat hanay ng mga walong bits na ngayon ang dalawang mga hanay ng mga apat na piraso. Ito ay kapaki-pakinabang dahil hexadecimal ay partikular na fashionable na dahil ang bawat hexadecimal digit 0 hanggang f, o mas partikular na 0 hanggang 15, maaaring katawanin na may eksaktong apat na bits. Sa ibang salita, sa hexadecimal kung ikaw nais na kumakatawan sa isang 0, ito ay 0000 lamang, apat na mga zero. At kung gusto mong upang kumatawan 15, ito ay 1111, na kung saan ay apat na bits. At kung gagawin mo ang matematika, kung ito ay ang lugar na iyan, ito ay ang lugar 16s, na ang pagpunta sa bigyan you-- sa halip na pagpunta to-- paumanhin, sa binary, na ang pagpunta sa magbibigay sa iyo ng 15, ang lugar na iyan, twos lugar, nakadapa at tag walo lugar. Kaya hayaan mo akong imungkahi na iyon set ng apat na piraso sa kaliwa ay kung ano ang kami ay pagpunta sa tumawag f. Ito ang pinakamalaking number mo maaari kumakatawan sa apat na piraso. At kami na malaman mula sa hexadecimal, f ay ang pinakamalaking digit sa hexadecimal. Mayroon kami ng isa pang f doon, dalawang higit pa doon. At sa ngayon, lumabas lang sa pananampalataya aking ginawa ang mga math karapatan at na ang kaliwang kalahati ng mga bits, 1101, ay ang parehong bagay tulad ng d sa hexadecimal. At sa kanang kamay, 1000, ay 8 lamang. At iyon isa madaling makita, tama? Ang 8 represents-- ay tama sa ilalim na eights lugar. Kaya kami ay may isa sa haligi ng tag walo at wala sa nakadapa, twos o iyan. Kaya ngayon mas conventionally, mga kawani na tao ay may posibilidad na magsulat ng hexadecimal digit na tulad nito, lamang squish mo ang mga ito nang sama-sama, at pagkatapos mong prefix sa kanila na may 0x. Ito ay nangangahulugan na wala na iba sa isang visual na palatandaan sa isang human-- dito ay isang hexadecimal value-- dahil hindi ito maaaring sa kabilang banda ay halata. Alin ang sasabihin, sa huli, na ang mga pattern ng mga zero at mga, o mga pattern ng hexadecimal digits equivalently na kayo pagpunta upang simulan ang naghahanap para sa sa Problema Set 4 ay this-- at ang Problema Set 4 spec ay ituturo sa pamamagitan na ito sa mas maraming mga detail-- ngunit mapagtanto bilang uri ng arcane bilang ito ay maaaring tumingin sa unang tingin, ikaw ay pagpunta sa simulan ang nakakakita ito ng maraming. At sa katunayan, kahit na sa GDB, ang debugger ipinakilala namin sa Lunes at Dan nagpapakilala sa pset 3, ay pagpunta na madalas ipakita sa iyo hexadecimal halaga dahil lamang sila ay may posibilidad na maging mas maginoo kaysa decimal o binary sa mundo ng mga computer. Ngayon ay ilagay ito sa konteksto ipaalam. Marami sa maaari mong tandaan ito larawan dito, na nagmula sa kung ano? Vista, kaya kahit na mas maaga kaysa sa na, Windows XP ginawa ito pasinaya. Kaya ito ay isang magandang tanawin. At sa katunayan, kung sundutin mo sa paligid online-- Sa tingin ko ito ay isang artikulo ng Wikipedia, kung saan ang isang tao ay tunay amazingly lumabas natagpuan ang lokasyon na ito sa mundo-set up ang kanyang camera sa tiyak na karapatan sa place-- at mukhang like-- na ito ngayon ngunit ito ay eksakto ang parehong setting. Ang larawan na ito, bagaman, ay sa isang file format na tinatawag na bitmap, b-m-p. At kami ay pagpunta sa tumagal ng isang super mabilis na sulyap sa kung ano ang ibig sabihin nito. Ngunit bitmap ay lamang ng isang iba't ibang mga paraan ng na kumakatawan sa mga imahe pa rin gamit ang pixels sa 0s at 1s, sa huli. Ngunit sa mabilis na sulyap, ito ay may isang mas kawili-wiling signature sa simula ng file. Ito ay hindi lamang ng tatlong bytes, sa halip ay mayroong isang buong grupo ng mga pattern ng mga bytes na paunang-natukoy na kahulugan. Halimbawa, sa isang lugar sa unang ilang bytes ng isang bitmap image ay magiging ang laki ng imahe, ang lapad ng imahe, ang taas ng imahe, kaya kapaki-pakinabang na metadata, kung ikaw ay. Kapaki-pakinabang na impormasyon na Photoshop o anumang graphics programa na iyong ginagamit maaaring tunay na nagmamalasakit sa. Kaya more on na ito sa Problema Itakda 4, ngunit ito ay para lamang sa mga sinasabi na sa pagtatapos ng araw ang lahat ng mga format ng file na iyong na-gamit para years-- file Microsoft Word, Numero ng mga file, mga file sa Excel, anumang bilang ng mga format ng file na maaaring magkaroon ng ilang mga kilala extension file mga 0s lang at 1s ilalim ng hood. At ang tao ay may nagpasya kung ano ang mga convention ay, kung ano ang mga pattern ng 0s at 1s kumakatawan isang Word file laban sa isang Excel file, laban sa anumang bilang ng iba pang mga format ng file. Kaya sa pset 4, magkakaroon ka ng isang pagkakataon upang i-play ang mga iyon. Ngunit ano ang ibig sabihin ng magkaroon ng isang struct. Ito ay talagang isang magandang segue ngayon sa C, na kung saan ay may lamang ng isang pares ng karagdagang mga tampok na hindi namin ay may tumingin sa pa. Ito ay isang medyo maliit na wika at isa sa mga ang magaling na tampok ang tungkol sa C ay isang struct. Halimbawa, kung ikaw ay Nais upang represent-- sabihin sabihin ang iyong nais na magkaroon ng isang variable na ay kumakatawan sa isang mag-aaral sa ilang programa. Siguro kayo ay pagsulat ng isang kurso program registration, o core shopping tool, o isang bagay na tulad ng. Ano ang mga piraso ng data na may kaugnayan sa isang mag-aaral na dumating sa isip? Tulad ng isang mag-aaral ay kinakatawan sa kung ano ang halaga? Oo? Mayroon kang isang pangalan tulad ng isang mag-aaral. Ano pa ang isang tipikal na mag-aaral ay may? Madla: [hindi marinig] David J. MALAN: Kaya, paumanhin. Madla: Age. David J. MALAN: Isang edad o birthday equivalently, yep. Ano pa? Madla: numero ng ID? David J. MALAN: Kaya ang isang numero ng ID, siguro isang numero ng telepono, marahil ng isang dorm, o bahay, o kolehiyo, o isang bagay na tulad ng. Anumang bilang ng mga piraso ng data na maaaring mayroon ka sa iyong listahan ng mga contact ay kung ano ang maaaring tukuyin ang isang mag-aaral. Kaya kung nais namin na gawin ito, sa code, maaari naming gawin ang isang bagay simple tulad nito. Maaari naming magkaroon ng isang programa upang ang Wala sabihin nating, int pangunahing (walang bisa). At kung gusto ko upang kumatawan sa isang mag-aaral na maaaring mayroon ako, halimbawa, isang string na tinatawag na pangalan para sa mag-aaral na, isang string na tinatawag dorm para sa estudyante na, siguro isang int tinatawag ID para sa estudyante na iyon. At dahil gumagamit ako ng string, ako kailangan upang bumalik at maglagay ng CS50.h. Siguro ako pagpunta sa kailangan stdio.h. Kaya hayaan mo akong preemptively gawin iyon at ako pagpunta sa tawag na ito student.c para sa ngayon at i-save ito. At ngayon maaari kong gawin ang isang bagay may mga variable na ito. At lamang kami ay pagpunta sa sumulat na bilang isang komento sa palsipikado code, dahil ito ay hindi kawili-wili ano ang ginagawa namin sa ngayon. OK, sa gayon ito ay isang programa na kahit papaano nag-iimbak ng isang mag-aaral. Ano ang gusto kong gawin kung ako nais na tindahan ng dalawang mga mag-aaral? Kaya ang aking unang katutubong ugali ay pagpunta upang ang lahat ng karapatan, maghintay ng isang minuto, kung ako ay may ibang mag-aaral kung bakit hindi ko gawin lamang string name 2, string dorm 2, int ID2. At kami tapos wala na down na ito kalsada bago at kung ano ang aming mga solusyon sa kung ano ang anyong na uri ng isang hackish copy paste trabaho dito? Madla: Ang isang array. David J. MALAN: Oo, maaari naming gamitin ang isang array. Right ito masyadong mabilis magiging mahirap gamitin. Ikaw ay may na-uri-uriin ng nagkataon simulan ang pagbibigay ng lahat ng mga variable. At ikaw, ang tao, kailangang panatilihin ang subaybayan na name2 OK tumutugma may dorm2 tumutugma sa ID2. Ito lamang ay nagiging isang gulo. Kaya ito ay isang pulutong mas madali, pagpapabalik mula sa isang ilang mga linggo nakaraan, na lamang ang pagkakaroon sa tinatawag na mga pangalan string at maaaring magbigay sa amin ng tatlong mga iyon. At pagkatapos ay marahil kami ay may string dorms at may tatlo sa mga iyon, o sa isang pare-pareho, int ids at may tatlong ng mga iyon. Ngunit kahit na ngayon nararamdaman na ito isang maliit na nanggigitata, right. Kami ay pakikipag-usap tungkol sa mga mag-aaral at pa Talaga ako tirahan sa mababang antas detalye ng pagpapatupad. Ang mag-aaral ay isang pangalan at isang dorm at ID. Bakit hindi Ipinapahayag ko lamang ng isang variable tinatawag na mag-aaral at tawagan ito s. At kung gusto ko ang isa pang estudyante, bakit hindi ko na lang tawag ito t. O kung gusto ko ang isang buong grupo ng mga mag-aaral, bakit hindi ko na lang sabihin ako ng isang buong klase ng mga mga mag-aaral, at ito ay tatlong ng mga ito. Sa ibang salita, bakit hindi ko dumating up gamit ang aking sariling uri ng data, na tinatawag na Mag-aaral, sa loob ng kung saan ay isang pangalan, ay isang ID, ay isang dorm, ay ang anumang bilang ng iba pang mga patlang. At ito ay lumiliko out ka maaaring gawin eksakto na. Kaya ay ang tampok na tinatawag na struct C. Iyan ay isang tampok na wika na ay nagbibigay-daan sa amin upang gawin ang eksaktong ito. Pupunta ako sa sige at buksan up structs.h na kung saan kami ay pagpunta upang makita ang mga sumusunod na kahulugan ng isang mag-aaral. Ito ay lumiliko out - at ang isang ito ay mas mas simple kaysa sa isa na kinasasangkutan ng isang ID ilang sandali ang nakalipas. Kung nais mong magkaroon ng ang iyong mga lutong bahay na uri ng data, at bilang karagdagan sa int, at pansamantalang trabaho at lumutang at ang lahat ng mga iba na umiiral, maaari mong gawin ito sa pamamagitan ng literal pagsulat typedef struct, pagkatapos ng ilang curly braces, sa loob ng na mo ilista ang mga variable na gusto mong iugnay gamit ang bagong pasadyang data type tulad ng isang pangalan at isang dorm, at pagkatapos matapos ang kulot tirante magbibigay sa iyo ng isang pangalan para sa bagong uri ng data. Kaya, halimbawa, ang mag-aaral. At kung ano ang magaling tungkol sa mga ito ngayon ay na kung tinitingnan namin ang nararapat na code, kombensiyon, unang sa lahat, ay upang ilagay ito sa isang file na tinatawag na isang bagay na tuldok h, ng isang header ng file, na kung saan mayroon kaming hindi nagsimula gamit ang ating sarili masyadong marami. Ngunit kami ay pagpunta upang simulan ang gamit ng lubos ng kaunti ngayon. At kung ano ang maaari naming gawin sa mga ito, sa huli, sa mga ilang linya ng code ay magpahayag ng eksakto na uri ng data, ang isang mag-aaral. At gamitin natin ito sa ngayon. Pupunta ako sa pupunta na ngayon sa isang file na tinatawag structs1.c. At tumagal ng isang pagtingin sa isang ipaalam ilang katangian dito. Kaya ang mga bagay-bagay up dito ay halos pamilyar, at bibigyan namin ng bumalik sa kung ano ang hindi pamilyar sa sandali lamang. Ito ng kurso ay kabilang ang aking sariling header ng file, na kung saan ay mga bagong pati na rin, maliban para sa pset 3 kung saan, pagpapabalik, mayroon kaming helpers.h. Kaya maaari mong isipin na #include helpers.h. Bakit parang ang aking ginagamit quotes sa halip ng angled bracket? Kapag ako pipili sa pagitan ng mga ito? Halos lagi akong parang gamitin angled bracket. At pagkatapos, ang lahat ng isang biglaang sa anim na linya gumagamit ako ng double quotes. Bakit maaaring maging? Oo? Madla: [hindi marinig] David J. MALAN: Iyan ay isang aktwal na, ano? Madla: Iyon ang sa iyong IDE. David J. MALAN: Oo, na ang dahilan sa aking aktwal na IDE. At hindi na tumira sa mga IDE ipaalam, dahil ito lamang ay isang tool na gumagamit ako. Iyan ay sa aking kasalukuyang directory, partikular. Kaya structs.h ay ang aking sariling mga file Hindi naka-install sa IDE, sa operating system mismo, sa halip ito ay sa aking kasalukuyang direktoryo. Kaya ang convention ay kung gusto mong upang isama ang iyong sariling mga header ng file, ikaw lamang gamitin ang double quotes. Ano ang tawag sa bagay na ito sa 8 linya, karaniwang pagsasalita? Ano ito? # tukuyin ang isang bagay. Ito ay kumakatawan sa constants, di ba? Kung nais mong magkaroon ng isang halaga sa iyong mga programa na gamitin mo ang isang buong grupo ng mga beses, ito ay magandang convention sa kadahilanan ito, ipinahahayag ito, na may simbolong hash tukuyin, pagkatapos, sa pamamagitan ng convention, sa lahat ng uppercase word-- na ito ay hindi mahigpit na kinakailangan, ngunit ito ay convention ng tao magsamantala constants kaya na tumalon sila sa labas sa visually-- kang space at pagkatapos ay ang halaga na gusto mong maging katumbas ng pangalan na pare-pareho ang ni. Walang tuldok-kuwit, ngunit ikaw lamang sundin ang pattern na doon. Kaya kung ano ang ako ginagawa sa aktwal na code. Kaya sabihin kumuha ng isang pagtingin sa ang mga pangunahing programa dito. Sa linya 12 dahil ako Isinama structs.h, Ako ngayon ay magically sa aking pagtatapon ng isang bagong uri ng data. Hindi ko lang magkaroon ng access sa int, at char, at float, at string, at asul at iba pa. Ako ngayon ay pag-access sa isang uri ng data na estudyante. Kaya sa linya 12, ako ng Kombinasyon ng dalawang ideas-- isa isang pasadyang uri ng data at dalawa, gamit ang isang array. At kaya sa programang ito kung Gusto ko na talagang sumusuporta tatlong iba't-ibang mga mag-aaral sa aking mga programa, ako Maaari lamang sabihin bigyan ako ng isang variable tinatawag na mga mag-aaral, ang bawat isa ay uri ng mga mag-aaral, na kung saan ay ang aking pasadyang uri ng data. At, partikular, magbigay sa akin tatlo sa mga sa aking array. Kaya ngayon kung ano ang gagawin namin sa programang ito? Narito lamang ng isang para sa loop iterating mula 0 hanggang 3, dahil na ano ang halaga ng mga mag-aaral ay. Ako pagdikta lang ang user bigyan ako ng pangalan ng estudyante. At pagkatapos ay sa 17 na linya, kami ay magkaroon ng isang halos pamilyar linya. Mayroon kaming ang aming lumang kaibigan GetString sa kanan. At kung ano ang piraso ng syntax ay tila bago, kung hindi mo pa-program sa C bago, at mga hindi ginagamit ang structs? Oo? Madla: NAME Ang. David J. MALAN: NAME Ang. Ngunit ito ay hindi masyadong maraming ng isang hakbang, dahil ngayon aaral bracket i nagbibigay sa iyo ng ang mag-aaral i-ika. At kung gusto mong sumisid sa loob ng istraktura na, gumamit ka lamang ng isang solong panahon at pagkatapos ay ang pangalan ng variable sa loob, o ari-arian sa loob na nais mong makakuha ng access sa. Sa katulad na paraan pagkatapos, kung pagkatapos ay prompt ko ang user, bigyan ako ng dorm ng mag-aaral, maaari kang katulad-imbak na string sa dorm variable sa loob ng na mag-aaral ng istraktura. At ngayon ang mga bagay makakuha ng isang maliit na pag-iisip. At ito ay pagpunta sa hitsura at marahil ng isang pulutong ng lubos sa lalong madaling panahon. Ngunit makikita mo ang mas malayo sa pset 4, upang ipaalam ang sulyap lamang sa mga ito ngayon. Ito ay lumiliko out na sa 23 na linya sa pamamagitan 38, ano ang tingin mo marahil ako ginagawa? Tinanggal ko na ang mga komento para sa ngayon, ngunit ang bersyon ng code sa online para sa reference ay ang lahat ng mga komento. Ano ang gagawin tila ako ay ginagawa? Madla: Pag-save ng file na may lahat ang mga impormasyon na ipinasok ng user. David J. MALAN: Oo, eksakto, ito ay isang bagong paraan na namin nakikita ang dalawa, isa pang katangian ng C, kung saan maaari kong lumikha ng aking sariling mga file. Kaya ngayon, halos lahat ng programa na iyong isinulat ay stateless. Sa sandaling tapos na ito sa pagtakbo, na ang lahat. Walang memory o pag-alaala ng mga ito. Walang file save. Ngunit kung mo nais na i-save ang input na may ang nangyari, tulad ng sa isang laro o sa isang programa tulad nito, ito ay lumiliko out maaari naming gawin ito. At makikita mo ito ng mas maraming sa pset 4 at sa Section. Ngunit ito 23 line mahalagang lumilikha ng isang file na tinatawag na students.csv. At maaari mong nakita ito bago. Kahit na hindi mo na-aral CS bago, CSV ay mga variable na pinaghihiwalay ng kuwit. Ito ay tulad ng isang napaka-mahinang tao bersyon ng isang Excel file, na nangangahulugan na ito ay maaaring mabuksan sa Excel at sa Apple Numero, at ito ay may mga hanay at haligi. Ngunit ito ay hindi isang may-ari format tulad ng Microsoft o Apple. Ito lang ang kuwit na naghihiwalay ang mga halaga na kami ay makita sa isang sandali. At tumagal lamang ng isang hulaan. Sa 23 line, sa pinakadulo wakas, ang aking pangalawang argumento sa bagong function na tinatawag na f bukas para sa file na bukas ay w. Ano ang maaaring w magpakilala? Oo? Madla: Hinahayaan ka nitong magsulat sa file? David J. MALAN: Ito ay nagbibigay-daan sumulat ka sa file. Kaya may isang pares ng mga variant na maaari naming plug in dito. Ngunit kung gusto mo lamang na basahin ang file, na tingnan ang mga ito at basahin ang mga ito sa memory, ikaw ay lamang gamitin ang quote magpanipi "r". Kung nais mong sumulat sa file, gumamit ka ng quote magpanipi "w". May ikakabit din at isang pares ng mga iba pang mga bagay kung gusto mong baguhin ang umiiral na mga file. Ngayon kami ay pagpunta upang panatilihin ang paningin na ito bagay, at pagkatapos kami ay bumalik sa line 24. NULL, ito ay lumiliko out, ay isang espesyal na halaga na maaaring ibalik sa pamamagitan ng ilang mga function sa kung ang isang bagay ay wala na wrong-- kung ang file ay hindi umiiral, kung ikaw na maubusan ng memory, o isang grupo ng iba pang mga error. Ngunit sa ngayon, ipaalam lamang ipalagay na ito ay lamang maginoo error checking. Dito sa linya 26, ako ng iterating mula 0 hanggang 3 sa lahat ng aking mga mag-aaral. At ito ang mga uri ng mga uri ng isang bagong pag-andar, fprintf, ngunit tumagal lamang ng isang hulaan. Kung printf ay print lamang sa isang format na string, kung ano ang ibig malamang na ibig sabihin fprintf? Madla: I-print sa isang file. David J. MALAN: I-print ang isang format na string sa isang file. Iyon ay kung ano ang mga karagdagang f ibig sabihin nito ay file. At ang bagong unang argument ay dapat ang mga variable na kumakatawan sa iyong file. Pagkatapos ay mayroon lamang kami ng isang format string tulad ng printf. At kahit na ito syntax ay bago, ito lamang nangangahulugan plug sa pangalan ng estudyante, plug-in sa mag-aaral dorm, at pagkatapos ay may fclose, isara ang file. At pagkatapos lastly-- na ito ay bago at kami ay bumalik sa ito bago long-- ako pagbabakante ng mag-aaral para sa mga dahilan na nangyari hanggang sa itaas doon. Ngunit kami ay bumalik na na bago long-- iyan ay dahil sa kung paano GetString ay aktwal na nagtatrabaho sa ilalim ng hood. Kaya sabihin kumuha ng isang mabilis na pagtingin dito. Kung nagta-type ako ls sa aking directory, paunawa na hindi ko magkaroon ng isang file na tinatawag na students.csv, lamang ay hindi doon, ay hindi umiiral. Kaya kung ngayon ako sumulat ng libro sa programang ito, gumawa structs-1,. / structs-1, at ako pagpunta upang magpatuloy at i-type sa Andi, na nakatira sa Berkeley sa Yale. Kami ay pagpunta sa may Rob na nabubuhay sa Thayer na mga araw. At ni magkaroon ng kung saan hahanapin ay, sa tingin ko, Maria ay sa Mather, kung ako ay may naalala tama. Kaya tila walang mangyari. Ngunit kung type ko ls ngayon, may students.csv. Sabihin sige at bukas students.csv. Ito ay muli ng isang napaka magaan na file format. Ngunit ko na lang ako pinagtibay ng isang convention na mayroon akong dalawang mga hanay at haligi dito. Ang unang haligi ay unang pangalan ng mga tao. Ang ikalawang hanay ay ang mag-aaral dorm, o kolehiyo, o bahay, o watnat. At ngayon ko na-save na ito permanente sa isang file. Kaya ito ay hindi lahat na kawili-wili. Ngunit ito ay lamang ng isang tuntong bato ngayon sa pagiging maka-umiiral na impormasyon permanente. Kaya tingnan natin ngayon kung ano pa ang maaari naming gawin sa mga ito at iba pang mga tampok. Ngunit una, ang anumang mga katanungan? Iyon ay isang pulutong, at iyon ay mabilis. Ngunit makikita mo ang isang maraming higit pa sa pset 4, pati na rin. Oo? Madla: Mayroon bang paraan upang magpatuloy sa pagdaragdag ng mga pangalan sa mga na file? David J. MALAN: Magandang katanungan. Mayroon bang paraan upang magpatuloy pagdaragdag ng mga pangalan sa mga na file? Oo. At, sa katunayan, kung ang dulo mo up sa muling pagbubukas ng file, nais mong gamitin ang quote magpanipi "a" para ilakip, na kung saan ay idagdag lamang ang isang bagong linya, isang bagong linya nang paulit-ulit, eksakto. Magandang tanong. Iba pang mga tanong? Oo? Madla: Kung kayo ay nagpatakbo ng mga program muli sa ngayon, ito ay panatilihin ang pagdaragdag ng mga pangalan ang maghain o ito ay magbukas ng isang bagong file? David J. MALAN: Ah, magandang katanungan. Kung nagpatakbo ka muli karapatan sa programa ngayon, siguro nai-type sa mga bagong pangalan, ito ay magdagdag sa mga file o patungan ang file? Ang huli, dahil ako hindi gamit na Magkabit mode. At dahil ako lamang taros pagbukas ng file para sa pagsulat, ito lamang ay pagpunta upang patungan ang file. Kaya ako ay sa katunayan kailangan mong gawin ay ikakabit, kung gusto kong talagang magkaroon ng isang long term database. Ngayon CSV ay kapaki-pakinabang, tapat, kahit na para tulad ng kung ikaw ay writing-- at kami ay makakita ito mamaya sa semestre kapag ginagamit namin ang mga CSV para sa ibang layunin. Kung nais mong i-store ang lahat ng mga tao na nakarehistro para sa ilang mga kaganapan, o nag-sign up para sa iyong mga mag-aaral grupo, o isang bagay tulad na, pagtatago ng data sa ganitong uri ng format ay sobrang maginhawa. Dahil literal, kung ako ay upang i-download ang file na ito. Kaya kong double-- at ni aktwal na subukan ito ipaalam kung ako ay may Excel o Numero sa dito. Pupunta ako sa right-click o i-control-click ang aking file. Oops. I-right-click o i-control-click ang aking file. Sige na, ang aking mouse ay hindi cooperating. Download-- Pupunta ako sa i-download ang lahat ng mga file dito kaya lamang kaya maaari kong sunggaban ang isang ito. At makita kung ito ay gumagana ipaalam students.csv-- unang pagkakataon Na-activate ko. Ngayon nais nilang makita ang aking mga contact. Ngayon, kailangan ko mag-register. Tingnan ang kung gaano kadali na gamitin ang mga CSV? Oo, panatilihin itong napapanahon. OK, ngayon ikaw ay handa na para sa klase namin. OK, oh, ano ang bago? OK, close. Iyon ay kabigha-bighani. OK, ngayon kami ay i-update. At ngayon, nakalimutan ito kung ano ang maghain ako orihinal na binuksan, ngunit kung ano a-- doon pumunta kami. OK, kaya ngayon kami ay may isang Excel file. Salamat. OK, kaya kung ano ang ginawa ko ay ang madaling bahagi. Siyempre ako ay maaaring magkaroon ng pre-install Excel, o Numero, o kahit anong program. Ngunit ito ay nice, dahil ngayon ko mamanipula ang data sa isang standard format. Kaya ngayon sabihin konteksto lumipat sa kung saan namin kaliwa off huling oras, kung saan ay upang simulan upang mag-alis wheels training. Ngunit una, ikaw ay hindi ginawa makita ang mga ito nang mas maaga sa tanghalian ay muling nangyayari dito sa Apoy at Ice sa Cambridge, Sitar sa New Haven. Mag-sign up sa CS50s website ASAP upang sumali sa CS50 mga mag-aaral at mga kawani. Kaya kinuha namin gulong ng pagsasanay off sa Lunes bilang follows-- string ay ipinahayag sa CS50s library para sa ilang oras. At ito ay nice, dahil ito ay nagpapahintulot sa amin upang makipag-usap tungkol sa mga variable na rin ang pagiging kumpletong salita at pangungusap at iba pa. Ngunit ito ay lumiliko out ay hindi umiiral string. Iyon ay isang kasingkahulugan lamang, o isang alias, na gumawa kami ng isang bagay na talaga ay isang maliit na mas tinatawag na teknikal isang pansamantalang trabaho *. At sa katunayan, nakita namin ang isang halimbawa ng isang programa sa Lunes na hindi kumilos na lubos na bilang namin inaasahan. Ito ay ang file, ihambing-0. At isipin na ihambing-0, kung Recompile ko program Lunes at tumakbo ihambing-0 at sa uri ng mom in lowercase, at ina sa lowercase muli. Ang programa ay iginiit ko type ng iba't ibang mga bagay, kahit mom, ang lahat sa maliliit na titik, ay kapareho ng biswal. Kaya kung ano ay ang maikling sagot para sa kung bakit sa palagay ng mga computer dalawang string ang mga ito ay iba't-ibang? Oo? Madla: [hindi marinig] David J. MALAN: Karapatan. So, ina, sa unang pagkakataon Nagta-type ako ito sa, ay ang pagiging naka-imbak sa isang lugar sa computer ang aking memory ngunit sa ibang lokasyon kaysa sa ikalawang pagkakataon type ko sa mom. Ngayon ito ay tiyak na maaaring ma-optimize. Maaaring maging matalino Ang computer at Napagtanto ito ng dalawang mga string, hey, ang mga ito ay magkapareho. Hayaan akong hindi redundantly store na ito. Ngunit mga computer ay hindi gawin iyon optimization maliban kung sabihin mo sa kanila na. Kaya, sa pamamagitan ng default, ang mga ito ay lamang ang pagpunta sa mga end up sa dalawang magkaibang lugar sa memorya. At upang maging mas malinaw, kapag namin inihambing ang dalawang string, ang unang ay tinawag s, ang pangalawa ay tinatawag na t, ano ang partikular na ay ako paghahambing dito sa 13 na linya? Oo. Madla: Ito ang lugar sa memory na ang mga variable ay tumuturo sa. David J. MALAN: Eksakto, ako ay paghahambing ng mga lugar sa memory na ang mga variable itinuturo sa. Kaya partikular, kung ang ina ay sa byte numero 1, at 2, at 3, at 4-- tandaan dahil ang backslash 0 mga pangangailangan upang maging lahat ng mga paraan sa dulo. At ang iba pang halimbawa ng mom, m-o-m, ay sa address 10, 11, 12, at 13. Ako ay paghahambing 1, address na iyon, na lokasyon sa memorya, laban sa 10, na kung saan ay malinaw naman hindi ang pareho. 1 ay hindi 10. Kaya ito ay nice sa na ito ay medyo tapat. Ngunit ito ay may problema sa abot ng Hindi namin ma-ihambing ang mga string. Kaya fundamentally-- at sa mababang antas, kung iyong nais na ipatupad isang programa upang ihambing dalawang magkahiwalay na mga salita na ang mga user ay nag-type sa para sa kalidad, gawin line nila up char para char, para lamang sa mga pangkalahatang tuntunin, kung ano ang kailangan namin upang gawin, tila? Ito ay hindi sapat lamang upang tingnan ang mga dalawang mga address. Ano ang dapat nating gawin? Oo? Madla: Ulitin pamamagitan ang string [hindi marinig]. David J. MALAN: Oo, sabihin ulitin sa pamamagitan ng string. Ni gumamit ng isang para sa loop, habang loop Ipaalam, o ano man ikaw ay pinaka-komportable sa. At kung nakuha namin ang dalawang mga string sa tabi-tabi sa memory, tingnan natin ang bawat isa na ipaalam unang character, at pagkatapos ang bawat ay pangalawang karakter, at pagkatapos ikatlo, at ika-apat, at ikalima, hanggang maabot namin kung ano ang espesyal na halaga nagbabantay? Madla: [hindi marinig] David J. MALAN: Oo, ang backslash zero, at sa puntong sa alinman string maaari naming magpasya na ang lahat. Nakarating kami naitugmang bawat solong character? Kung hindi, bumalik false. Kung gayon, nagbabalik ng tunay. At kaya na kung ano mismo ang bersyon na ito ng programa ihambing-1.c ang ginagawa. Ito ay katulad sa kung ano ang aming tumingin sa Lunes maliban na ako nakuha mapupuksa ang salita string na na ito ay walang functional impact-- lahat Ako ginagawa ngayon ay pag-alis ilang wheels visual na pagsasanay, ngunit upang makita ang malinaw na s at t ay address. At na kung ano ang bituin, ang asterisk, ito ay kumakatawan ay isang address, na kilala mas technically bilang pointer. Kaya kapag Ipinahahayag ko s on linya 9 at sabihin char * s, na ay hindi nangangahulugan bigyan ako ng isang string. Ito ay nangangahulugan na bigyan ako ng isang variable na ang layunin sa buhay ay upang mag-imbak ng isang address. Dahil ako tungkol sa upang ilagay ang address ng isang string sa mga ito. At sa katunayan, GetString, upang maging malinaw, hindi nagbabalik ng isang string. Hindi nito bumalik mom backslash zero, per se. Ano ang partikular na GetString at bumalik tiyak? Madla: [hindi marinig] David J. MALAN: Ang isang address, ang address ng unang character sa ilang mga string na ito ay nakuha. At kaya ngayon kami ay nakikita muli ang isang espesyal na keyword. At, ako alluded sa ito nang mas maaga. Ito ay magiging magandang convention na namin makita muli at muli ngayon. Lalabas na ako upang tiyakin na s ay hindi null at t ay hindi null. Dahil batay sa aking tunay mabilis na banggitin mas maaga, kung ano ang maaaring sabihin kung GetString nagbabalik hindi isang address ngunit N-U-L-L, na kung saan ay muli, ang ilang mga espesyal na halaga? Madla: Error. David J. MALAN: Ito ay isang error. May nangyaring mali. At kung ano ang karaniwang maaaring mangyari, lalo na may strings-- na maaaring ng hindi kilalang haba sa advance-- siguro ang computer ' sa labas ng memorya, siguro nai-type mo sa tulad ng isang mahabang salita o pangungusap o paste tulad ng isang malaking sanaysay may hindi lamang ng sapat na memory. At kaya hindi maaaring bumalik GetString ang address ng buong bagay, kaya ito ay bumalik lamang sa wala. At sinasabi nito ay nangyari ang isang error sa pamamagitan ng pagbalik ng mga espesyal na halaga null. Ito ay ang zero address, kaya na magsalita. Ngayon ito ay lumiliko out C ay dumating sa isang function na ang na pag-ulit. Wala kaming ipatupad na ito sa isang para sa loop o habang loop sa ating sarili. Maaari naming gamitin ang isang function, tinatawag succinctly, pukawin comp, o string ihambing, na ang layunin sa buhay ay upang gawin eksakto na. Bigyan mo itong dalawang payo, dalawang mga address, at ito ay pumunta sa mga address at pagkatapos ay ihambing ang sulat para sa sulat para sa sulat para sa kalidad, pagpapahinto lamang kapag kung ano ang totoo? Kapag intuitively dapat gumalaw comp itigil iterating, upang maging malinaw lang? Kapag ito ay umabot sa isang backslash 0 sa alinman sa string, at sa puntong ito ay maaaring magpasiya ay ang lahat ng bagay na tumugma, o nagkaroon ng isang pagkakaiba? Kaya, kung nagpapatakbo namin ito ngayon at subukan aming maliit na capitalization game, kaya gumawa ihambing-1, ./compare-1, at type mom in lowercase parehong oras. Ngayon ay ang mga parehong bagay. At kung ito ang gagawin ko muli sa lowercase at pagkatapos ay marahil uppercase. Ngayon ay sa katunayan Tinutukoy sa pagitan ng malalaki at maliliit na titik. Kaya hindi lahat na mahirap o nakapagtataka, ngunit ito ay ngayon ipaliwanag ano ang nangyayari sa ilalim ng hood. Kaya ano pa ang maaari naming kunin mula sa uri ng aral? Kaya sabihin kumuha ng isang pagtingin sa ito. Pupunta ako sa sige, at magsulat ng isang dito na tinatawag na mabilis na programa copy-0. At ngayon sabihin sige at tunay ni gawin this-- may kopya-0 ipaalam, kumuha ng isang pagtingin sa kung ano ang Mayroon akong dito. Una kong sabihin sa mga user, sinasabi ng isang bagay. Pagkatapos ay kumuha ako ng isang string at naka-imbak ko ito sa s. Pagkatapos suriin ko kung katumbas s katumbas null, bumalik lamang 1. Kaya ito ay lamang ng standard error checking. Walang mga kagiliw-giliw na ang nangyari. At sa katunayan, kung kami makakuha ng alisan ng mga error suri, ito ang hitsura ng linggo 1 code sa sandaling ito. Ngunit ko na nagsimula upang makakuha ng isang maliit na mas mahusay na tungkol sa. Ngayon sa 16 na linya, sa isang linggo na ang nakaraan, marahil kahit ilang araw o minuto na ang nakalipas, kumbaga 16 na linya ay paglikha variable na tinatawag na t isang at pagkopya s sa mga ito. At iyon ay isang ganap na ganap makatwirang takeaway. Ngunit maging mas tumpak na ngayon. Ano ang nangyayari sa 16 na linya? Ano ang pagkuha ng kinopya mula kanan pakaliwa? Oo? Madla: t Nakakakuha ba ng isang address ng s? David J. MALAN: Eksakto, t ay nakakakuha ng mga address ng mga s. Kaya upang maging malinaw na ngayon, kung pumunta ako bumalik sa mga naunang halimbawa at ako maglabas ng bagay ko na nai-type sa. At kung ano ang nai-type ko in-- dito ang s, at dito ay kung ano ang aking nai-type sa isang lugar sa memory, ina at pagkatapos ng isang backslash 0 na idinagdag para sa akin. Ano ko na naka-imbak sa dito, isipin ang, ito ay sa lokasyon na 1, 2, 3, 4, ito ay kung ano ang kasalukuyang sa s. Kaya kung sa 16 na linya, sinasabi ko ibigay sa akin isa pang variable na tinatawag na t at tindahan in sa ang halaga ng s, kung ano makakakuha ng naka-imbak dito ay hindi ina ngunit sa halip lamang sa mga numero 1. Kaya't kung tiningnan namin ng maaga sa programa na ito ngayon, kung ano ang nangyayari sa mangyayari? Kaya mapansin na mayroong mga function na ito maaari ka may ginagamit na ito ng ilang oras ang nakalipas para sa Caesar, o Vigenere, o marahil hindi sa lahat. Inaangkin ko sa aking printf, Ako pagpunta upang samantalahin ang mga kopya t. Una sa 19 linya, mabilis katinuan suriin, strlen checks ang haba ng t. Dahil hindi ko nais na subukan upang samantalahin ng isang bagay kung walang string doon. Kung pindutin lang user ang Enter, walang upang samantalahin ang. Kaya hindi ko nais na gawin ang 21 linya. Kaya linya 21 ay capitalize kung aling mga titik, tila, sa t? Madla: m? David J. MALAN: Mukhang tulad ito ng pagkopya kung saan ang isa? Madla: m. David J. MALAN: Uh, m. OK, kaya ang unang m, dahil notice na ako pagpasa sa toupper, na kung hindi mo pa nakikita ito ito ay lamang ng isang function na magsamantala bilang input nito. t bracket zero ay nangangahulugan na magbigay akin ang zero character ng t. At kaya kung paano gumagana ang larawan baguhin, upang maging malinaw? Ano ang mga pangangailangan upang makakuha ng muling pagsusulat o nagbago may paggalang sa s at t at ina backslash zero. Madla: [hindi marinig] David J. MALAN: Oo, kaya ang isang ito dito lang pangangailangan upang makakuha ng nagbago to-- ayusin this-- pangangailangan upang makakuha ng nagbago sa isang capital m. Ngunit ngayon, tumingin sa ibang pagkakataon sa programa, kung print out ako s at t bilang linisin ko dito, panoorin kung ano ang pagpunta sa mangyayari sa pag-print out s at t. Kaya gumawa ng kopya-0, ./copy-0. Hayaan akong magpatuloy at i-type sa ina sa lahat ng lowercase. Pansinin ang parehong orihinal at ang mga kopya ay sa malaking titik. Bakit? Well, s at t ay parehong tumuturo sa, kung ikaw ay, ang parehong tipak ng memory. At lantaran, ito ay nakakakuha talagang uninteresting-- ang katunayan na aming ginagamit address zero dito. Ibig sabihin ko, hindi ko talagang pakialam kung saan ang mga bagay-bagay ay sa memorya. Paumanhin ako binubura ang isang maliit na masyadong marami. Ngunit hindi ko talagang pakialam kung saan ang mga bagay ay sa memory. At ito, sa katunayan kung ano programmers ay madalas na isipin ang tungkol sa ay na kapag makipag-usap sa iyo tungkol sa ng isang address, o isang pointer, na nagmamalasakit kung saan ito ay sa memorya. Wala akong pakialam kung ito ay sa byte isa o isang bilyon. Lamang ako pag-aalaga na ito variable ay epektibo tinuturo na tipak ng memory. At ito, simula ngayon, sa halip na quibble higit sa arbitrary memory address, sabihin simulan lamang upang gumuhit ng mga payo bilang payo, tulad ng mga arrow. Kaya kung ano ang mga at t ay tunay, ayon sa programang ito, dahil sa kung paano ko nilikha t, ito ay lamang ng dalawang hiwalay na mga variable tumuturo sa parehong tipak ng memory. At hindi namin pakialam kung nasaan sila. Kaya maaari naming abstract layo detalye na. Kaya paano ko ito aayusin? Kung gusto kong sumulat ng isang bersyon ng mga kopya program na aktwal na kopya ng string at capitalizes lamang ang kopya, intuitively lamang, kung ano ay nakuha na maging isang sahog sa aming mga solusyon? Madla: [hindi marinig] David J. MALAN: Kailangan namin ng isang kung ano? Madla: tipak ng memorya. David J. MALAN: Kailangan namin isa pang tipak ng memory, tama? Hindi namin alam kung paano gawin ito pa, kinakailangan. Ngunit ang uri ng ko kailangan ito upang mangyari kaya na ang mga orihinal na ina sa maliit na titik nauuwi sa na ang dagdag na tipak ng memory. At pagkatapos ay kapag binago ko ang kopya, ako hindi mo nais na baguhin ito kopya dito. Sa halip ko gusto na baguhin lamang ito kopya kaya na ang mga orihinal ay hindi magbabago. Kaya, sabihin makita kung paano namin maaaring gawin ito. Sa kopya-1, na kung saan ay mayroon na Nakuha ng mga komento, ngunit ay nagkomento sa online. Sa halip naming gawin ang following-- mga mga linya ay magkapareho, kumuha ako ng isang string at tumawag ito s. Ngunit tingnan natin ang isa sa aming pinaka ngayon hayaan kumplikadong ngunit ang huling ng pagiging kumplikado para sa mga sandali, 16 linya nang eksakto ang ginagawa nito. Kaya kung ang iyong umaliw sa picture drew-- namin lamang bigyan ako ng isang bagong tipak ng memory, kopyahin ang lahat ng bagay sa mga ito, sabihin makita kung paano namin translate na sa code. Kaya 16 line, sa kaliwang bahagi, nagbibigay sa akin ng char * t ang kahon na ito sa paglipas dito. Iyan na ang lahat ng ginagawa nito. Sa kanang bahagi ng kamay, m alloc, o malloc, ay memory laang-gugulin, sobrang pag-iisip, isang misteryosong paraan na lamang ang sinasabi bigyan ako ng isang tipak ng memory. Gaano karaming memory ang kailangan natin? Well, ang uri ng isang malaking expression. Ngunit sabihin makita kung ano ang sinasabi nito dito. Kaya ito, siyempre, ay magbibigay sa akin ang haba ng string ng mga s. So, ina ito ay dapat na kung ano? Kaya tatlo lamang, tama? ina ay tatlong character. Hindi mo na bilangin ang backslash zero kapag ikaw makipag-usap tungkol sa haba ng isang string na ito ay tunay na ang tao na nakikita ng mga titik. Kaya mom, kaya ito ay nagbibigay sa akin 3. Ngunit maghintay ng isang minuto, ngayon ako ang pagdaragdag 1. Bakit ako ay talagang nais na magtalaga ng 4 bytes at hindi lamang 3? Oo? Madla: Para sa mga halaga ng nagbabantay? David J. MALAN: Eksakto, para sa na halaga ng nagbabantay. Para sa backslash zero, Kailangan ko ng kabuuang 4 bytes. Kaya kailangan ko ang haba ng string plus 1. At pagkatapos ay para lamang sa magandang measure-- kahit na sa ganitong sistema, palaging ito ay magiging 1-- ko sinasabi multiply ito sa pamamagitan ng laki ng isang char. Ginagawang out sizeof ay isang operator sa C na lamang ay nagsasabi sa iyo ang bilang ng mga byte na na kinakailangan para sa isang tiyak na uri ng data. Hindi ito gumagana para sa array, kadalasan, minsan ito ay. Ngunit sa pangkalahatang kaso, hindi. Ngunit ito ay sabihin sa akin kung gaano karaming bytes isang char ay, kung saan ay lumiliko out ay palaging 1. Kaya ito ay tulad ng pag-multiply sa pamamagitan ng 1. Kaya super misteryosong naghahanap linya ng code. Ngunit ang lahat ng ito ay ay nagbibigay sa sa akin ng isang tipak ng memory. Ngunit ito ay tila na maging pagkopya kahit ano sa na memory? Hindi pa. At kaya kung ano ang gagawin ko sa 22 na linya, at 23, 24, 25, well, kailangan lang gawin ko ito. At ito ay isang uri ng lumang bagay-bagay sa paaralan ngayon. Ito ay tulad ng pset 2, kung saan nagpapalipat-lipat ka lang ng mga bagay sa paligid sa memory, o sa halip sa mga string. Kaya ako iterating mula 0 hanggang ang haba ng string s. At ako kopyahin ang i-ika na character in s sa i-ika na character sa t. At dahil ako, programmer, na ginawa Siguraduhin na maglaan ng eksaktong bilang ng maraming mga bytes bilang na kailangan ko, ito ay perpekto isa-sa-isang relasyon. At kopyahin ko mom in lowercase sa bagong isa. At pagkatapos ay sa wakas, gawin ko ito sa linya. At upang ang mga epekto ay lamang magsamantala ito t dito. Kaya ng maraming na maunawaan, ngunit kung isinasaalang-alang mo lamang kung ano ang tunay na nangyayari sa ilalim ng hood ay lumipat lamang ang mga ito bytes sa paligid, ang lahat na ay kinakailangan upang malutas ang problemang ito ay lamang na magbigay sa amin ng ganitong tipak ng memory. Ngayon na sa panganib ng napakalaki, hayaan mo akong ipakita isa pang halimbawa na halos magkapareho, maliban para sa isang ito linya ng code. Kaya ito ay ang bersyon hacker ng programang ito, kung ikaw ay. Ngunit distill sabihin lang ito sa kung ano ang nangyayari sa. Line 24 ginamit na ito t bracket ay makakakuha i s bracket i. Ngayon, ako ang pagbabago na ito sa ang mas misteryosong star t plus 1 ay katumbas ng star s plus 1. Kaya kung ano ang nangyayari at bakit mayroon kaming isang bituin character? Nakita namin na ang star sa bago, at ito ay ginagamit ng iba dito. Dati Nakita namin char *, ngayon ko na nakikita isang bituin sa simula, at iyon ang OK. Dahil ito ay lumiliko out namin Maaari uri ng magpakilala lamang mula sa mga unang simulain kung ano ang nangyayari sa. Kaya lamang na maging malinaw, kung ano ang s? Noong nakaraang linggo, ito ay isang string. Iyan ay hindi makasapat anymore. Ano ang s, partikular na? Madla: [hindi marinig] David J. MALAN: Ito ay isang pointer. Ito ang address ng unang character namin nai-type in. OK, kung ano ang t? Madla: [hindi marinig] David J. MALAN: Ang address ng unang byte sa t, na tipak ng memory reallocated. Kaya ito ay lumiliko out na kapag tayo umulit mula 0 sa hanggang sa mga string length-- una sa lahat, i nagsisimula off sa 0, dahil ng mga ito lumang paaralan para sa loop na bagay. Kaya lang para sa simple, sabihin ipalagay na ang unang linya ng code ay talagang lamang na ito, sa kanan. Kung i ay zero, ang pagdaragdag ng zero sa isang bagay na siguro ay hindi pagpunta sa magkaroon ng epekto. Kaya kung ano ang pananalitang ito? Ito ay lumiliko out na ang mga star operator sa kontekstong ay ang dereference operator, na kung saan ay lamang isang magarbong paraan ng sinasabi ng pumunta sa sumusunod na address. Kaya kung s ay ang address ng unang character sa ito tipak ng memory, * s paraan pumunta doon. At dahil na iginuhit namin ang mga larawan sa ganitong paraan, maaari mong gamitin ang mga sumusunod na modelo ng kaisipan. Kung ito ang s, at sabihin mo * s, * s uri ng tulad chutes at hagdanan kung maalala mo ang laro mula sa pagkabata, ay tulad ng sumusunod arrow na at pumunta sa address. * t ay ang parehong bagay. Kaya simulan dito, pumunta sa tipak nito. Hindi ko lang gumuhit sa screen na ito na paraan. * t nangangahulugan na pumunta dito. At pagkatapos, ang para sa loop ay lamang sinasabi ilipat ang character na ito dito, ilipat ang character na ito dito, ilipat ang character na ito dito. Ngunit kung paano ang gagawin ko na incrementation? Kailangan ko bang i-undo kung ano lang ang tinanggal ko. Ito ay kung ano ang karaniwang tinatawag na pointer aritmetika, na nangangahulugan math na may mga address. Kung, sa na ito para sa loop, Panatilihing ako incrementing i, at s ay isang address at t ay isang address, kung panatilihing ako lamang pagdaragdag ng 1, na nangangahulugan lamang panatilihin ang paglipat ng pasulong, at pasulong, at ipasa sa memory. Ito ay tulad ng Oxford Street, ang kalye na ang CS building ay sa. Ang CS gusali ay 33 Oxford Street. Kaya kung kayo ay upang gawin 33 Oxford Street plus 1, na nagdudulot sa iyo sa 34 Oxford Street, at pagkatapos ay 35 Oxford Street, pagkatapos ng 36 Oxford Street, ano man ang mga gusali talaga ay - kung sila ay umiiral. At ito, na ang lahat ng aming ginagawa dito sa pointer aritmetika. Kaya ito ay isang super arcane paraan ng pagpapahayag ng ating sarili. Ngunit ang lahat na nangyayari sa ilalim ng hood ay ang mga sumusunod lamang ang mga address, tulad ng mga sumusunod na ng isang mapa, kung ikaw ay, o sumusunod arrow tulad ng iyong iginuhit namin sa screen. OK, ang isang pulutong na digest. Anumang mga katanungan sa syntax, concepts, mga payo, malloc, o mga katulad. Oo, sa paglipas dito unang. Madla: Kaya kung saan na sabi * katumbas t toupper * t, na ang pagpunta sa sulatin sa malaking titik lahat ng mga titik o just-- David J. MALAN: Ah, talagang mahusay na tanong. Kaya sa ganitong linya dito, 31, ito po ba ay sulatin sa malaking titik ang unang titik o lahat ng mga titik. Kaya sabihin sagot na sa pamamagitan ng pagpunta bumalik sa unang prinsipyo. At sa unang prinsipyo dito ibig sabihin ko pumunta lamang sa pangunahing mga kahulugan ng kung ano ang kasangkot. Kaya toupper isang function na capitalizes isang pansamantalang trabaho. Iyan na ang lahat. * t nangangahulugan pumunta sa first-- pumunta sa address sa t. Kaya, sa larawan, kung ito ang tipak ng memory namin inilalaan sa malloc, at ito ay t, nangangahulugan * t pumunta dito. Samantala, kayo ay dumadaan na halaga, maliliit na m upang toupper, nakakakuha ka ng likod capital M, kung saan ang mga patong ang mga ito? Ikaw ay inilagay ito sa parehong lokasyon. At ito sa pamamagitan ng na lohika ng mga pangunahing mga kahulugan ito lamang capitalize ang unang titik maliban kung umulit ka sa i o isang para sa loop o habang loop, hindi ito ay pagpunta gumawa ng kahit ano higit sa hilingin sa iyo ng mga ito. Magandang tanong. Oo? Madla: Bakit ginagamit mo ang dereference paraan sa halip na array? David J. MALAN: Ah, magandang katanungan. Bakit nais mong gamitin ang dereference Ang pamamaraan sa halip na ang paraan ng array? Walang partikular na dahilan, upang maging matapat. At, sa katunayan, para sa mga ito uri ng halimbawa, kanan, Tingin lang ako nakikipagtalo sa paggawa ng mga program mas kumplikado, mas maraming mga mata ay glazing over, mga tao ay check out dahil ito mukhang super arcane, ngunit kahit na ito ay ang paggawa nito bagay. At ito, lantaran, ito ay isang hindi kinakailangan biswal komplikadong solusyon sa problema. Ito ay mahusay na disenyo pa rin, limang out ng limang para sa disenyo, maging ito man ay sa mga bracket pagtatanda o ang notation pointer. But-- lalo na kapag kami makakuha ng mamaya sa kurso sa pset 5 kapag kami ipatupad diksyunaryo na na Nabanggit ko ang isang pares ng mga times-- ipapakita namin ang tunay na pag-aalaga tungkol sa memory address mababang antas na talagang nauunawaan natin ano ang nangyayari. Ngunit, para sa ngayon, ito ay lumiliko out na ito linya ng code dito square bracket hindi tunay na umiiral. Ang mga ito ay kung ano ang tinatawag sintaktik asukal, na kung saan ay lamang ng isang weirdly cool na paraan ng pagsasabi ng compiler nagpalit square bracket upang maging na mathematical expression. Kaya ito ay isang tao convention upang ma-isulat lang tunay user-friendly bracket ang mga ito. Ngunit ano ang tagatala, kumalatong, talaga ginagawa ng anumang oras isulat mo kung ano ang naka-highlight sa linya 24, sa ilalim ng hood ito ay talagang pag-convert ito sa mga ito. Ito lang ang mas kaaya-aya bilang isang tao magbasa at magsulat ng code tulad ng 24 linya. Ngunit kalaunan ang mga masyadong dumating off wheels training kapag ang makakakuha ng sariling kaginhawahan malakas. Lahat ng karapatan, kaya isipin pagkatapos na ito ay ang uri ng pinakamalaking problema namin ang bumangga sa. At na kung ano sparked ito buong sumpain uusap tungkol sa mga payo, at address, at pagkopya ng bagay. Ito ay dahil tripped namin sa paglipas ng ito hangal, tanga isyu, kung saan ang Ako ipinatupad logically-- Lauren hanggang dito sa demo at ang orange juice sa milk-- isang ganap na ganap algorithmically tamang function para sa pagpapalit ng dalawang variable ' mga halaga, ngunit ang sumpain bagay ay hindi magkakaroon ng anumang mga paulit-ulit, o permanenteng, epekto sa aking code. At bakit ay na? Sa isang maikling salita, kung bakit ito pagpapatupad ng swap lohikal na tama, ngunit ay walang epekto sa mga variable na lumipas na ito, tulad ng x at y para sa main? Ano ang buod ng mga isyu na ito? Oo? Madla: Dahil variable ginawa mga kopya ng variable sa pass sa pamamagitan ng function. David J. MALAN: Eksakto, kapag kayo na ipasa variable sa isang function, o mga argument sa isang function, ang mga ito ay dumaan sa pamamagitan ng kopya, na nangangahulugan kang makakuha ng isang kaparehong naghahanap pattern ng bits para sa parehong mga x at y, tinatawag na dito ang isang at b. At maaari mong gawin ang anuman gusto mo na may mga kopya, pero ang mga ito ay pagpunta sa may walang epekto sa pagtawag sa function. At, sa katunayan, ay hinila namin na larawan sa screen, pagpapabalik huling oras, kung saan kung ikaw ay talagang isipin ang tungkol sa kung ano ang nangyayari sa ilalim ng hood-- kung ito ay memory ng iyong computer, at pababa dito ay ang tipak ng memorya na ginagamit para main, ito ang tipak ng memorya na ginagamit para swap, at kaya kahit na mga pangunahing may dalawang variable, x at y, maaaring mayroon swap magkapareho naghahanap mga halaga, ang parehong na 1 at 2, ngunit ang mga ito ay ganap na iba't-ibang mga tipak ng memory. Kaya kailangan namin ng isang solusyon na ito. At lantaran, ito ay tila ngayon na kami magkaroon ng isang solusyon sa problemang ito, i-right. Kung tayo ngayon ay may kakayahan upang manipulahin ang mga bagay sa pamamagitan ng paraan ng mga address at, uri ng mga chutes at hagdanan style, sundin ang mga arrow at pumunta sa kahit saan nais naming sa memory, hindi namin mai malutas ang problemang ito sa pamamagitan ng pagpasa mula sa main upang magpalitan hindi ang mga halaga na gusto naming swap, ngunit intuitively lamang ano ang maaari naming ipasa sa swap sa halip? [INTERPOSING tinig] David J. MALAN: Bakit hindi namin lamang ipasa ito ng mga address, di ba? Bakit hindi namin magbigay ng swap isang kayamanan mapa, kung ikaw ay, na humahantong ito sa aktwal na mga halaga ng x at y. Sabihin swap, tunay na baguhin mga orihinal na bits, sa halip na pagpasa lamang ng mga kopya ng mga bits. At ito, sa katunayan, na kung ano ang magiging ang solusyon. Ang bersyon na ito dito ay malinaw na masama at flawed. At ngayon, sa unang tingin, ito lamang ang hitsura tulad nagdagdag kami ng isang bungkos ng mga bituin sapalaran at tumawid sa aming mga daliri na ito ay sumulat ng libro. Ngunit, ito ay ngayon sumulat ng libro. Ngunit sabihin makita kung ano ang kahulugan ng mga bagay. At, sa kasamaang-palad, ang mga may-akda ng C maaaring magkaroon ng pinili ng isa pang simbolo upang gumawa ng mga ito ng isang maliit na mas malinaw, ngunit ang star operator may iba't ibang kahulugan sa dalawang iba't ibang konteksto. At nakakita kami ng parehong, ngunit ni makilala ipaalam. Kaya up sa tuktok doon, kapag ako ay nagbago ng isang at b mula sa pagiging int sa ang masamang bersyon sa int bituin, ang isang at b, dati, ay integer. Ano ang isang at b ngayon sa ang mabuti, green version? Ang mga ito ay mga address. Addresses ng kung ano, upang maging malinaw? Address ng mga integer. Kaya ang katotohanan na ako sinasabi int star paraan ito ay ang address ng isang integer, partikular. Kaya ngayon mapansin sa mga linya ng code, ibang bagay ay nagbago rin. tmp nananatiling pareho, dahil ito lamang ang pansamantalang integer, walang memorya magic doon. Ngunit ngayon ang mga pangangailangan ng isang isang bituin. At, sa katunayan, ang bawat iba pang mga pagbanggit ng isang at b, mapapansin na ang lahat na pagbabago mula sa pula sa berde ay na ako ng prefixing mga variable na may bituin. Dahil hindi ko nais upang kopyahin ang isang at b. Dahil kung kopyahin ko lang ng isang at b at magpalitan isang at b, kung ano ako talaga ng pagpapalit? Addresses lang, gusto kong magpalit kung ano ang sa mga address na iyon. Gusto kong pumunta doon. At upang ang mga star operator sa loob ng aking function, hindi sa loob ng listahan ng mga parameter, nangangahulugan kang pumunta sa mga address na iyon at talagang baguhin ang mga halaga. Kaya kung ano ang ginagawa ng mga larawan ngayon hitsura sa halip. Well, kung sa halip ako makapasa in para sa isang at b hindi 1 at 2-- Ako tunay na kailangan upang magdagdag ng isang iba pang kahulugan dito. Kaya ipagpalagay na ito tipak ng memorya ay sa lokasyon na 10. Ito ay sa lokasyon na 11, ngunit ito ay isang piraso ng isang pagpapagaan, Ako ngayon ay may dalawang mga pagpipilian gawin ako pumasa x at y o ko ipasa ang kanilang mga address? Kung pumasa ko ang kanilang mga address tulad nito, ako lamang ngayon ay kailangan upang ipatupad swap bawat ang green code kaya na kapag ito nakikita ng isang at kung kailan ito nakikita b, ito ay hindi lamang kopyahin ang isang at b at ilipat ang gatas at orange juice. Ang gatas at orange juice talinghaga break ngayon down, dahil ang mga iyon ay mga tasa ng likido at hindi na mapa. Sa halip na kailangan namin upang pumunta sa address na 10 at kami ay kailangan upang pumunta sa address na 11, at pagkatapos ay gawin na pagpapalit logic. Kaya ang logic ay pareho, ngunit kailangan namin ng isang bahagyang kakaibang paraan ng pag-access sa mga variable. At kaya sa dulo, kung ano ang programa ay may sa hitsura ay na ito. Sa swap.c literal na kinopya at nailagay ang green bersyon. Ngunit kailangan ko upang gumawa ng isang pagbabago. Ito ay hindi sapat upang baguhin lamang swap. Ano ang iba pang mga linya ng code kailangan ko bang baguhin? Oo? Madla: Saan ito ay tumatagal ng mga argumento. David J. MALAN: Saan ito ay tumatagal ng argument nito. Kaya kung mag-scroll ko up to main, ako hindi maaaring lamang pumasa sa x at y, at, pangako ko, ang huling piraso ng bagong syntax ngayon. Kailangan ko upang pumasa sa hindi x at y ngunit ang address ng x at y. At ito ay lumiliko out, ang mga simbolo na ang mga may-akda ng C pinili ay kung gumamit ka ng isang ampersand dito, hindi upang malito ang bitwise ampersand, kung gumamit ka ng isang ampersand dito at isang ampersand dito, ito numero kung para sa iyo, ano ang address ng x, marahil ito ay 10, kung ano ang address ng y, marahil ito ay 11, at magbabalik sa mga nasa sa halip. Kaya ng maraming na maunawaan ang lahat nang sabay-sabay. Ngunit sabihin makita ngayong mabilis in ang aming nalalabing apat na minuto kung saan maaari magkagulo bagay. At bilang isang bukod, talaga Kinuha ko ang larawang ito, Kinuha TF ang larawang ito ng isa o dalawang taon ang nakalipas. Kaya ito ay ang likod na sulok ng Eliot Dining Hall. Payo ay marahil ang hardest topic na sumasaklaw namin sa CS50. Kaya kung mag-alala ka ng uri ng libis ay tulad marahil ito ay higit pa sa isang hockey stick tulad nito, nauunawaan uri ng kami ay papalapit sa isang rurok sa mga tuntunin ng mga haka-haka kumplikado. At dalhin ko up ito larawan, dahil Ako ay nanunumpa sa diyos, sa tag-lagas 1996, kapag ako ay kinuha CS50 sa aking pagtuturo kapwa, Nishat Mehta, umupo siya sa akin pababa sa sulok ng Eliot D. Hall sa paglipas ng tanghalian, o hapunan, o isang bagay na subukan na tulungan akong maunawaan payo. At ito ay kung saan ako ay linggo matapos ito ay ipinakilala sa lecture kapag Wakas ay naunawaan ko payo. At ako ay umaasa na ito ay i-click ang malayo maaga para sa iyo. Ngunit mapagtanto na ito ganap sa gitna ang mga mas sopistikadong mga paksa kami ay tumingin sa. Ngunit ito ay kabilang sa mga pinaka-makapangyarihang. At kapag nakuha mo ito, ito ay tunay na ang lahat lamang ang pagpunta sa wakas dumating na magkasama. Kaya pahinga sigurado na ito ay hindi kailangan na ang lahat ng lababo sa araw na ito. Kaya dito ang huling programa kami ay pagpunta sa tumingin sa. At kami ay pagpunta sa magtapos sa isang mabilis na tatlong minuto ng claymation ginawa sa pamamagitan ng aming mga kaibigan, Nick Parlante. Narito ang isang programa, na sa dalawang top Ipinahayag ng mga linya ng isang variable x at y. Pareho sa mga ito ay mga address ng integer, AKA payo. Pagkatapos maglaan kaming sapat memory upang mag-imbak ng isang int at mag-imbak ang mga address ng na memory sa x. Kaya, ito ay kahit na mas simple kaysa sa halimbawa sa bago. Bigyan mo ako ng apat na bytes ng memorya, iyan ang sukat ng isang int, at ilagay ang mga address na iyon sa x. Dito ay nangangahulugan ng linyang ito pumunta sa address sa x at ilagay ang kahulugan ng buhay, ang bilang 42 doon. Ngunit ito line-alala sa akin. Lagyan ng star ang y nangangahulugan pumunta sa address sa y, at ilagay ang mga kapus-palad bilang 13 doon. Bakit mapanganib, sa puntong ito sa story-- kahit mabilis Sinabi sa aming waning minuto here-- bakit ito masamang para sa akin upang sabihin, pumunta sa address sa y? Madla: Mayroon kang hindi [hindi marinig]. David J. MALAN: Mayroon akong hindi maglagay ng kahit ano sa y. Kaya kung ano ay ang halaga ng y, sa puntong ito sa kuwento? Wala kaming ideya. Ito ay ilang mga halaga ng basura at hindi rin alam Binky. Kung kami ay maaaring magtapos sa ang tala na ito. [Playback ng video] -Hey, Binky, gumising. Ito ay oras para sa masaya pointer. -Ano yan? Alamin ang tungkol sa mga payo? Oh, mabait. -Well, Upang makapagsimula, Hulaan ko hindi namin pagpunta sa kailangan ng ilang mga payo. -SIGE. Ang code na ito ay naglalaan ng dalawang mga payo na kung saan ay maaaring punto sa integer. -OK, Well nakikita ko ang dalawang payo, ngunit sila hindi mukhang na tumuturo sa kahit ano. -Tama iyan. Sa una payo ay hindi tumuturo sa kahit ano. Ang mga bagay na itinuturo ng mga ito ay tinatawag pointees at pag-set up ang mga ito ay isang hiwalay na hakbang. -Oh, Kanan, kanan. Alam ko yan. Ang pointees ay hiwalay na. Kaya paano mo gagastusin ang isang pointee? -OK, Well allocates code na ito isang bagong integer pointee, at ito bahagi sets x sa point na ito. -Hey, Na mukhang mas mahusay. Kaya gawin itong gawin ang isang bagay. -OK, Kukunin ko dereference ang pointer x sa ilagay ang numero 42 sa pointee nito. Para sa mga ito kahanga-hangang gawa, kakailanganin ko ang aking magic wand ng dereferencing. -Ang Iyong magic wand ng dereferencing? Uh, na, na malaki. -Ito Ay kung ano ang hitsura ng code tulad ng. Kukunin ko na lang i-set up ang bilang at- [POP SOUND] -Hey, Tumingin doon ito napupunta. Kaya, ang mga sumusunod ang paggawa ng isang dereference sa x ang mga arrow upang ma-access pointee nito. Sa kasong ito, upang mag-imbak 42 sa doon. Hey, subukang gamitin ito upang mag-imbak ang numero 13 sa pamamagitan ng iba pang mga pointer, y. -SIGE. Makikita pumunta sa ibabaw ko na lang dito sa y, at makuha ang numero 13 set up. At pagkatapos ay kunin ang wand ng dereferencing at just-- [BUZZER SOUND] -Oh, Hey na hindi gumagana. Sabihing, uh, Binky, hindi ako Sa tingin dereferencing y ay isang magandang ideya, dahil ang setting up ang pointee ay isang hiwalay na hakbang. At Hindi sa tingin ko kailanman namin ginawa ito. -Hmm, Good point. -Yeah, Inilalaan namin ang pointer, y, ngunit kami ay hindi kailanman itakda ito upang tumuro sa isang pointee. -Hmm, Napaka mapagmasid. -Hey, Ikaw ay naghahanap ng magandang doon, Binky. Puwede ninyo bang ayusin ito upang ito y puntos sa parehong pointee bilang x. -Sure, Gagamitin ko ang aking magic wand ng pointer assignment. -Ang Na magiging isang problema, tulad ng bago? -Hindi, Ito ay hindi pindutin ang pointees. Ito mga pagbabago sa isa lamang pointer na tumuturo sa parehong thing-- [POPPING SOUND] --as isa pa. -Oh, Nakikita ko. Ngayon y puntos sa parehong lugar bilang x. Kaya, maghintay, ngayon y ay naayos na. Ito ay may isang pointee. Kaya maaari mong subukan ang wand ng dereferencing muli upang ipadala ang 13 over. -Oh, OK, dito napupunta. -Hey, Tumingin sa na. Dereferencing Ngayon gawa sa y. At dahil ang mga payo ay nagbabahagi na ang isa pointee, pareho nilang makita ang mga 13. -Yeah, Pagbabahagi, uh, ano man. Kaya, kami ay pagpunta upang lumipat ngayon lugar? -Oh, Tumingin kami sa labas ng oras. -But-- -Just Tandaan ang tatlong mga patakaran pointer. Number 1, ang pangunahing istraktura ay na mayroon ka ng isang pointer, at ito ang mga puntos sa ibabaw sa isang pointee. Ngunit ang pointer at pointee ay hiwalay na. At ang mga karaniwang pagkakamali sa ay mag-set up ng isang pointer ngunit upang kalimutan na bigyan ito ng isang pointee. Number 2, pointer dereferencing nagsisimula sa pointer at sumusunod sa kanyang mga arrow sa paglipas ng upang ma-access pointee nito. Bilang namin ang lahat ng malaman, ito ay gagana lamang kung may ay isang pointee, na uri ng makakakuha ng bumalik upang mamuno number 1. Number 3, pointer assignment ay tumatagal ng isa pointer at ang mga pagbabago na ito upang tumuro sa mga parehong pointee bilang isa pang pointer. Kaya matapos ang pagtatalaga, ang dalawang mga payo ay tumuturo sa parehong pointee, minsan na tinatawag na sharing. At na ang lahat ng may sa ito, talaga. Paalam na ngayon. [END playback] David J. MALAN: Iyon lang para sa CS50. Salamat sa Professor Nick Parlante. Kami ay makikita mo sa susunod na linggo. [ELECTRONIC MUSIC nagpe-play]