[Music kucheza] DOUG LLOYD: kuyatumia, hapa sisi ni. Hii pengine ni kwenda kuwa mada ngumu sana kwamba sisi majadiliano juu katika CS50. Na kama wameweza kusoma chochote kuhusu kuyatumia kabla unaweza kuwa kidogo vitisho kwenda katika video hii. Ni kweli kuyatumia je kuruhusu uwezo kwa labda screw up pretty vibaya wakati uko kufanya kazi na vigezo, na data, na kusababisha mpango wako kwa ajali. Lakini wao ni kweli muhimu kweli kweli na wao kuruhusu sisi njia kubwa kweli kweli kupita data nyuma na kurudi kati kazi, kuwa tuko vinginevyo hawawezi kufanya. Na hivyo kile sisi kweli wanataka kufanya hapa ni mafunzo wewe kuwa nzuri pointer nidhamu, ili kwamba unaweza kutumia kuyatumia kwa ufanisi kufanya mipango yako kuwa bora zaidi. Kama nilivyosema kuyatumia kutupa mbalimbali njia ya kupita data kati ya kazi. Sasa kama unakumbuka kutoka video hapo awali, wakati sisi walikuwa wanazungumza juu wigo kutofautiana, nilivyoeleza kuwa data zote kwamba sisi kupita kati ya kazi katika C ni wanapita thamani. Na siwezi wametumia kwamba mrefu, kile maana kuna ni kwamba sisi ni kupita nakala za data. Wakati sisi kupita kutofautiana kwa kazi, sisi siyo kweli kupita kutofautiana kwa kazi, haki? Sisi ni kupita nakala ya kwamba data kwa kazi. Kazi gani itakuwa nini na ni mahesabu ya baadhi ya thamani, na labda sisi kutumia thamani kwamba wakati anatoa nyuma. Kulikuwa na ubaguzi moja kwa huu utawala wa akipita thamani, na tutaweza kurudi kwa nini kwamba ni kidogo baadaye katika video hii. Kama sisi kutumia kuyatumia badala ya kutumia vigezo, au badala ya kutumia vigezo wenyewe au nakala ya vigezo, sasa tunaweza kupita vigezo kuzunguka kati ya majukumu kwa njia mbalimbali. Hii ina maana kwamba kama sisi kufanya mabadiliko katika kazi moja, mabadiliko ambayo kweli kuchukua athari katika kazi mbalimbali. Tena, hii ni kitu ambacho sisi hakuweza kufanya hapo awali, na kama wameweza milele walijaribu wabadilishane thamani ya vigezo mbili katika kazi, umegundua tatizo hili aina ya kitambaacho juu, sawa? Kama tunataka wabadilishane X na Y, na sisi kupita yao kwa kazi kuitwa wabadilishane, ndani ya kazi wabadilishane vigezo kufanya maadili kubadilishana. Moja inakuwa wawili, wawili inakuwa moja, lakini sisi si kweli kubadili jambo lolote katika awali kazi, katika mpigaji. Kwa sababu hatuwezi, tuko tu kufanya kazi na nakala za kwao. Na kuyatumia ingawa, tunaweza kweli kupita X na Y kwa kazi. Kazi ambayo anaweza kufanya kitu pamoja nao. Na wale maadili vigezo kweli anaweza kubadilika. Hivyo hiyo ni mabadiliko kabisa katika uwezo wetu wa kufanya kazi na data. Kabla ya kupiga mbizi katika kuyatumia, nadhani ni thamani kuchukua dakika chache kwenda nyuma ya msingi hapa. Na kuwa na kuangalia jinsi matendo kumbukumbu ya kompyuta kwa sababu masuala haya mawili ni kwenda kwa kweli kuwa pretty yanayohusiana. Kama pengine kujua, juu ya mfumo wa kompyuta yako una gari ngumu au labda hali gari imara, aina fulani ya kuhifadhi faili eneo. Ni kawaida mahali fulani katika kitongoji cha 250 gigabytes kwa labda michache ya terabytes sasa. Na ni wapi wote wa yako mafaili hatimaye kuishi, hata wakati kompyuta yako ni kufunga mbali, unaweza kugeuka kuwa nyuma na utapata mafaili yako ni pale tena wakati reboot mfumo wako. Lakini anatoa disk, kama gari ngumu disk, HDD, au hali gari imara, SSD, ni nafasi tu ya kuhifadhi. Hatuwezi kwa kweli kufanya kitu chochote na takwimu ambazo ni katika disk, au katika hali gari imara. Ili kweli mabadiliko data au hoja ni kuzunguka, tuna hoja hiyo kwa RAM, random kupata kumbukumbu. Sasa RAM, una mengi chini ya katika kompyuta yako. Unaweza kuwa na mahali fulani katika kitongoji cha 512 megabytes kama una kompyuta wakubwa, kwa labda mbili, nne, nane, 16, pengine hata kidogo zaidi, gigabytes ya RAM. Hivyo hiyo ni ndogo sana, lakini hiyo ni ambapo wote wa takwimu tete lipo. Hapo ndipo tunaweza kubadili mambo. Lakini wakati sisi kugeuka kompyuta yetu mbali, yote ya data katika RAM ni kuharibiwa. Hivyo ndiyo sababu tunahitaji kuwa na hard disk kwa eneo kudumu zaidi ya hayo, hivyo kwamba exists- ingekuwa kuwa kweli mbaya kama kila wakati sisi akageuka kompyuta yetu mbali, kila faili katika mfumo wetu alikuwa obliterated. Hivyo tunafanya kazi ndani ya RAM. Na kila wakati tunazungumzia kumbukumbu, pretty much, katika CS50, tunazungumzia RAM, si ngumu disk. Hivyo wakati sisi hoja mambo katika kumbukumbu, inachukua hadi kiasi fulani cha nafasi. Wote wa aina data kwamba tumekuwa kufanya kazi na kuchukua mbalimbali kiasi cha nafasi katika RAM. Hivyo kila wakati kuunda integer kutofautiana, ka nne ya kumbukumbu ni kuweka kando katika RAM hivyo wanaweza kufanya kazi na kwamba integer. Unaweza kutangaza integer, mabadiliko hayo, hawawajui kwa thamani 10 incremented kwa moja, kadhalika na kadhalika. Wote kwamba mahitaji ya kutokea katika RAM, na kupata ka nne kufanya kazi na kwa kila integer kwamba kujenga. Kila tabia wewe kujenga anapata Byte moja. Hiyo tu ni kiasi gani nafasi ni zinahitajika ili kuhifadhi tabia. Kila kuelea, halisi idadi, anapata ka nne isipokuwa ni mara mbili usahihi floating kumweka idadi, ambayo inaruhusu kuwa sahihi zaidi au zaidi ya tarakimu baada ya uhakika decimal bila ya kupoteza usahihi, ambayo kuchukua ka nane ya kumbukumbu. Muda mrefu anatamani, integers kweli kubwa, pia kuchukua ka nane ya kumbukumbu. Jinsi ka ya kumbukumbu wengi Je, masharti kuchukua? Naam hebu kuweka siri katika swali kwamba kwa sasa, lakini tutaweza kuja nyuma yake. Hivyo nyuma wazo hili la kumbukumbu kama safu kubwa ya seli Byte kati. Hiyo ni kweli wote ni, ni tu safu kubwa ya seli, kama safu nyingine yoyote ambayo wewe ni ukoo na uone, isipokuwa kila kipengele ni byte moja pana. Na kama safu, kila kipengele ina mahali. Kila kipengele cha safu ina ripoti, na sisi Unaweza kutumia kwamba ripoti ya kufanya kinachojulikana random kupata juu ya safu. Hatuna kuanza saa mwanzo wa safu, iterate kupitia kila kipengele moja vyake, kupata nini sisi ni kuangalia kwa. Tunaweza kusema tu, nataka kupata 15 kipengele au kipengele 100. Na unaweza tu kupita katika idadi hiyo na kupata thamani wewe ni kuangalia kwa. Vile vile kila eneo katika kumbukumbu ina mahali. Hivyo kumbukumbu yako nguvu kuangalia kitu kama hii. Hapa ni chunk ndogo sana ya kumbukumbu, hii ni 20 ka ya kumbukumbu. Kwanza 20 ka kwa sababu yangu anazungumzia huko chini ni 0, 1, 2, 3, na kadhalika juu ya njia yote hadi 19. Na wakati mimi kutangaza vigezo na wakati mimi kuanza kufanya kazi pamoja nao, mfumo ni kwenda kuweka kando baadhi ya nafasi kwa ajili yangu katika kumbukumbu hii kazi na vigezo yangu. Hivyo mimi anaweza kusema, char c sawa na mitaji H. Na nini kitatokea? Vizuri mfumo ni kwenda kuweka kando kwa ajili yangu moja Byte. Katika kesi hiyo waliamua Byte idadi nne, Byte kwa anwani nne, na ni kwenda kuhifadhi herufi kubwa H katika huko kwa ajili yangu. Kama mimi basi kusema int kasi kikomo ni sawa na 65, ni kwenda kuweka kando nne ka ya kumbukumbu kwa ajili yangu. Na itakuja kutibu wale ka nne kama kitengo moja kwa sababu gani sisi ni kazi na ni integer hapa. Na ni kwenda kuhifadhi 65 katika huko. Sasa tayari mimi nina aina ya nawaambia kidogo ya uongo, haki, kwa sababu tunajua kwamba kompyuta kazi katika mapacha. Hawaelewi lazima kile mji mkuu H ni au kile 65 ni, wao tu kuelewa binary, zeros na ndio. Na hivyo nini hasa sisi ni hifadhi huko katika si barua H na idadi 65, bali uwakilishi binary yake, ambayo kuangalia kitu kidogo kama hii. Na hasa katika mazingira ya integer kutofautiana, si kwenda tu mate ndani, si kwenda kutibu kama moja ya nne Byte chunk lazima, ni kweli kwenda kutibu kama nne moja chunks Byte, ambayo inaweza kuangalia kitu kama hii. Na hata hii si kabisa kweli ama, kwa sababu ya kitu kinachoitwa endianness, ambayo sisi siyo kwenda kupata katika sasa, lakini kama wewe ni curious kuhusu, unaweza kusoma juu ya kidogo na endianness kubwa. Lakini kwa ajili ya mjadala huu, kwa ajili ya video hii, hebu tu kudhani yaani, katika kweli, jinsi idadi 65 ingekuwa kuwakilishwa katika kumbukumbu juu ya kila mfumo, ingawa si kweli kabisa. Lakini hebu kweli tu kupata kuondoa wote binary kabisa, na tu kufikiri kuhusu kama H na 65, ni rahisi sana kufikiri juu yake kama kuwa kama binadamu. Haki wote, hivyo ni pia inaonekana labda kidogo random kwamba I've- mfumo wangu hamkunipa ka 5, 6, 7, na 8 kuhifadhi integer. Kuna sababu kwa kuwa, pia, ambayo sisi si kupata ndani ya sasa hivi, lakini inatosha kusema kwamba kile kompyuta ni kufanya hapa pengine ni hatua nzuri kwa upande wake. Kwa kunipa kumbukumbu hiyo ni lazima nyuma kwa nyuma. Ingawa ni kwenda kufanya hivyo sasa kama nataka kupata kamba mwingine, aitwaye jina, na mimi nataka kuweka Lloyd huko. Mimi nina kwenda haja ya fit moja tabia, kila barua ya kwamba kwenda zinahitaji moja tabia, byte moja ya kumbukumbu. Hivyo kama mimi naweza kuweka Lloyd katika safu yangu kama hii mimi nina nzuri ya kwenda, haki? Kinachokosekana? Kumbuka kwamba kila kamba tunafanya kazi na katika C kumalizika kwa sifuri backslash, na hatuwezi saza kwamba hapa, aidha. Tunahitaji kuweka kando Byte moja ya kumbukumbu kushikilia kwamba hivyo sisi kujua wakati kamba yetu ina kumalizika. Hivyo tena utaratibu huu ya jinsi mambo kuonekana katika kumbukumbu uwezo kuwa ni kidogo random, lakini kwa kweli ni jinsi mifumo ya wengi ni iliyoundwa. Kwa line yao juu juu ya mafungu ya nne, kwa sababu tena kwamba hatuna haja ya kupata katika hivi sasa. Lakini hii, hivyo inatosha kusema kwamba baada ya mistari hii mitatu ya maadili, hii ni nini kumbukumbu ili kuangalia kama. Kama mimi haja maeneo ya kumbukumbu 4, 8, na 12 kushikilia data zangu, hii ni nini kumbukumbu yangu ili kuangalia kama. Na tu kuwa na hasa pedantic hapa, wakati tunazungumzia kumbukumbu anwani sisi kwa kawaida kufanya hivyo kwa kutumia notations hexadesimoli. Hivyo kwa nini sio sisi kubadili yote haya kutoka kwa nukuu hexadecimal alisema sababu tu kwamba kwa ujumla jinsi sisi rejea kumbukumbu. Hivyo badala ya kuwa 0 kupitia 19, tuna nini ni sifuri x sifuri kupitia sifuri x1 tatu. Hayo ni ka 20 ya kumbukumbu kwamba sisi kuwa au sisi ni kuangalia kwa mfano huu hapa hapa. Basi wote wa kwamba kuwa alisema, hebu hatua mbali na kumbukumbu kwa ajili ya pili na nyuma kuyatumia. Hapa ni muhimu zaidi Jambo kukumbuka kama sisi kuanza kufanya kazi na kuyatumia. Pointer kitu zaidi ya mahali. Mimi itabidi kusema tena kwa sababu ni kwamba muhimu, pointer kitu zaidi ya mahali. Kuyatumia ni anwani za maeneo kwa katika kumbukumbu ambapo vigezo kuishi. Akijua kwamba inakuwa hopefully rahisi kidogo kidogo kufanya kazi pamoja nao. Kitu kingine mimi kama kufanya ni kuwa na aina ya diagrams kuibua anayewakilisha nini kinachotokea na mistari mbalimbali wa kanuni. Na tutaweza kufanya hivyo wanandoa mara nyingi katika kuyatumia, na wakati sisi majadiliano juu ya nguvu mgao kumbukumbu pia. Kwa sababu nadhani kwamba vielelezo hivi inaweza kuwa hasa kusaidia. Hivyo kama mimi kusema kwa mfano, int k katika kanuni yangu, kinachojitokeza? Vizuri nini kimsingi kinachotokea ni Mimi nina kupata kumbukumbu zilizotengwa kwa ajili yangu, lakini sijui hata kama kufikiri juu yake kama hicho, mimi kama kufikiri kuhusu hilo kama eneo la hatari. Nina sanduku na ni rangi ya kijani kwa sababu mimi unaweza kuweka integers katika masanduku ya kijani. Kama ilivyokuwa tabia mimi inaweza kuwa na sanduku bluu. Lakini mimi daima kusema, kama mimi nina kujenga sanduku kwamba wanaweza kushikilia integers sanduku kwamba ni rangi ya kijani. Na mimi kuchukua marker wa kudumu na mimi kuandika k upande wa hayo. Hivyo nina sanduku aitwaye k, ndani ambayo siwezi kuweka integers. Hivyo wakati mimi kusema int k, hiyo ni nini kinatokea katika kichwa changu. Kama mimi kusema k ni sawa na tano, je, Mimi kufanya? Naam, mimi nina kuweka tano katika sanduku, haki. Hii ni pretty moja kwa moja, kama Nasema int k, kujenga sanduku aitwaye k. Kama mimi kusema k ni sawa na 5, kuweka tano katika eneo la hatari. Ni matumaini kwamba si sana ya leap. Hapa ni ambapo mambo kwenda kidogo ya kuvutia ingawa. Kama mimi kusema int * pk, vizuri hata kama mimi si kujua jambo hili lazima maana, ni wazi got kitu cha kufanya na integer. Hivyo nina kwenda kwa rangi sanduku hii ya kijani-ish, Najua ni got kitu cha kufanya na integer, lakini siyo integer yenyewe, kwa sababu ni nyota int. Kuna kitu kidogo mbalimbali kuhusu suala hilo. Hivyo integer ya kushiriki, lakini vinginevyo ni si mno tofauti na nini tulikuwa kuzungumza juu. Ni sanduku, got wake studio, ni amevaa studio pk, na ni uwezo wa kufanya nyota int, chochote wale ni. Wana kitu cha kufanya kwa integers, ni wazi kuwa. Hapa ni mstari wa mwisho ingawa. Kama mimi kusema pk = & k, Ho, nini ilitokea tu, sawa? Hivyo hii namba kubahatisha, inaonekana random idadi, anapata kutupwa ndani ya boksi hapo. Wote yaani, ni pk anapata pepe ya k. Hivyo mimi nina sticking ambapo k anaishi katika kumbukumbu, anwani yake, anwani ya ka yake. Wote mimi nina kufanya ni mimi kusema thamani kwamba ni nini mimi kwenda kuweka ndani ya boksi yangu aitwaye pk. Na kwa sababu mambo haya ni kuyatumia, na kwa sababu kuangalia katika kamba kama sifuri x nane sifuri c saba nne nane mbili sifuri pengine ni si ya maana sana. Wakati sisi ujumla taswira kuyatumia, sisi kwa kweli kufanya hivyo kama kuyatumia. Pk inatupa habari tunahitaji kupata k katika kumbukumbu. Hivyo kimsingi pk ina mshale ndani yake. Na kama sisi kutembea urefu ya kwamba mshale, fikiria ni kitu unaweza kutembea juu ya, kama sisi kutembea pamoja urefu wa mshale, katika ncha sana ya kwamba mshale, sisi utapata mahali katika kumbukumbu ambapo k anaishi. Na kwamba ni kweli muhimu kwa sababu mara moja tunajua ambapo k anaishi, tunaweza kuanza kufanya kazi na data ndani ya kwamba kumbukumbu eneo. Ingawa sisi ni kupata teeny kidogo mbele ya sisi wenyewe kwa sasa. Kwa hiyo kile ni pointer? Pointer ni bidhaa ambazo data thamani ya kumbukumbu ya mahali. Hiyo ilikuwa ni kwamba sifuri x nane sifuri mambo kinachoendelea, ambayo ilikuwa kumbukumbu ya mahali. Hiyo ilikuwa ni eneo katika kumbukumbu. Na aina ya pointer inaeleza aina wa takwimu utapata katika kwamba kumbukumbu ya mahali. Hivyo kuna int nyota sehemu ya haki. Kama mimi kufuata mshale, ni kwenda risasi mimi eneo. Na eneo hilo, kile utapata huko katika mfano wangu, ni kijani rangi sanduku. Ni integer, kwamba ni nini mimi utapata nikienda kwa anwani hiyo. Aina ya data ya pointer inaeleza nini utapata katika kumbukumbu ya mahali. Hivyo hapa ni kitu kweli ya baridi ingawa. Kuyatumia kuruhusu sisi kupita vigezo kati ya majukumu. Na kwa kweli kupita vigezo na kupita nakala za kwao. Kwa sababu kama sisi kujua hasa ambapo katika kumbukumbu kupata kutofautiana, hatuna haja ya kufanya nakala ya hilo, tunaweza tu kwenda eneo hilo na kufanya kazi na kwamba kutofautiana. Hivyo katika kuyatumia kiini aina ya kufanya mazingira ya kompyuta mengi zaidi kama ulimwengu halisi, haki. Hivyo hapa ni mfano. Hebu kusema kwamba nina daftari, haki, na ni kamili ya maelezo. Na napenda wewe kwa taarifa hiyo. Wewe ni kazi ambayo updates maelezo, haki. Kwa njia tumekuwa kazi hadi sasa, kile ikitokea ni utachukua daftari wangu, utasikia kwenda dukani nakala, itabidi kufanya Xerox nakala ya kila ukurasa wa daftari. Wewe itabidi kuondoka daftari yangu nyuma juu ya dawati yangu wakati wewe ni kosa, utasikia kwenda na kuvuka nje mambo katika wangu daftari ambayo ni nje ya tarehe au makosa, na kisha utasikia kupita nyuma mimi mkusanyiko wa kurasa Xerox kuwa ni replica ya daftari yangu na mabadiliko ambayo umefanya na hiyo. Na katika hatua hiyo, ni juu yangu kama wito kazi, kama mpigaji, kwa kuamua kuchukua maelezo yako na kuunganisha yao nyuma katika daftari yangu. Hivyo kuna mengi ya hatua waliohusika hapa, hivi. Kama sivyo kuwa bora kama mimi tu kusema, hey, unaweza wewe kuboresha daftari yangu kwa yangu, mkono wewe daftari wangu, na wewe kuchukua mambo na halisi kuvuka yao nje na kuboresha maelezo yangu katika daftari yangu. Na kisha nipe daftari yangu nyuma. Hiyo ni aina ya nini kuyatumia kuruhusu sisi kufanya, wao kufanya mazingira haya mengi zaidi kama jinsi sisi kazi katika hali halisi. Haki zote hivyo kwamba ni nini pointer ni, hebu majadiliano kuhusu jinsi ya kuyatumia kazi katika C, na jinsi gani tunaweza kuanza kufanya kazi pamoja nao. Hivyo kuna pointer rahisi sana katika C aitwaye pointer null. Null pointi pointer chochote. Hii pengine inaonekana kana kwamba ni kweli si jambo muhimu sana, lakini kama tutaweza kuona kidogo baadaye, ukweli kwamba hii pointer null ipo kweli kweli wanaweza kuja katika Handy. Na wakati wowote kujenga pointer, na huna kuweka thamani yake immediately- mfano wa kuweka thamani yake mara moja Itakuwa slides michache nyuma ambapo nilivyosema pk sawa na & k, pk anapata k ya mitaani, kama tutaweza kuona nini maana, tutaweza kuona jinsi ya kanuni kwamba shortly- kama hatuwezi kuweka thamani yake kwa kitu maana mara moja, unapaswa daima kuweka pointer yako kwa uhakika kwa null. Unapaswa kuweka kwa uhakika na kitu chochote. Hiyo ni tofauti sana kuliko tu kuacha thamani kama ilivyo na kisha kutangaza pointer na kuchukua tu ni null sababu hiyo ni mara chache kweli. Hivyo unapaswa daima kuweka thamani ya pointer kwa null kama huna kuweka thamani yake kwa kitu ya maana mara moja. Unaweza kuangalia kama thamani pointer ya ni batili kwa kutumia alama usawa (==), Tu kama wewe kulinganisha integer yoyote maadili au maadili tabia kwa kutumia (==) vilevile. Ni aina maalum ya mara kwa mara thamani uweze kutumia mtihani. Ili kwamba ilikuwa rahisi sana pointer, pointer null. Njia nyingine ya kujenga pointer ni ya kutafuta pepe ya kutofautiana umefanya tayari umba, na wewe kufanya hivyo kwa kutumia & alama anuani ya uchimbaji. Ambayo tumekuwa tayari kuona awali katika kwanza mchoro mfano mimi ilionyesha. Hivyo kama x ni kutofautiana kwamba tumekuwa tayari umba ya aina integer, kisha & x ni pointer integer. & x ni- kumbuka, & ni kwenda kutafuta pepe ya kitu juu ya haki. Na kwa kuwa pointer ni ya mitaani, kuliko & x ni pointer integer thamani ambao ni wapi katika kumbukumbu x maisha. Ni x ya mahali. Hivyo & x ni anuani ya x. Hebu kuchukua hatua hii moja kuungana na kitu zaidi na Mimi alluded katika video kabla. Kama arr ni safu ya mara mbili, kisha & arr mraba mabano i ni pointer maradufu. SAWA. ARR mraba mabano i, ikiwa arr ni safu ya mara mbili, kisha ARR mraba mabano i ni i-th kipengele cha kwamba safu, na & ARR mraba mabano i ni wapi katika kumbukumbu i-th kipengele cha arr lipo. Hivyo nini maana hapa? Jina arrays, maana ya jambo hili zima, ni kwamba jina safu ya ni kweli yenyewe pointer. Tumekuwa kazi na kuyatumia wote pamoja kila wakati kwamba umetumia safu. Kumbuka kutokana na mfano juu ya wigo kutofautiana, karibu na mwisho wa video Mimi sasa mfano ambapo tuna kazi aitwaye seti int na a kazi kuitwa seti safu. Na changamoto yako kuamua iwapo au la, au nini maadili ambayo sisi kuchapishwa Mwisho wa kazi, mwishoni mwa mpango kuu. Kama unakumbuka kutokana na mfano kwamba au kama wameweza watched video, unajua kwamba wakati wewe-wito kwa kuweka int ufanisi hana kitu. Lakini mwito wa kuweka safu gani. Na mimi aina ya glossed juu kwa nini hivyo ndivyo ilivyo wakati huo. I just alisema, vizuri ni safu, ni maalum, unajua, kuna sababu. Sababu ni kwamba safu ya jina ni kweli tu pointer, na kuna hii maalum Mabano ya mraba syntax kwamba kufanya mambo mengi nicer kufanya kazi pamoja. Na wao kufanya wazo la pointer mengi kidogo vitisho, na hii ndiyo sababu wao ni aina ya kuwasilishwa katika njia hiyo. Lakini kwa kweli arrays ni kuyatumia tu. Na hii ndiyo maana wakati sisi alifanya mabadiliko kwa safu, wakati sisi kupita safu kama parameter kwa kazi au kama hoja kwa kazi, yaliyomo ya safu kweli iliyopita katika wawili callee na katika mpigaji. Ambayo kwa kila aina nyingine ya kutofautiana tuliona haikuwa hivyo. Hivyo hiyo ni kitu cha kushika katika akili wakati wewe ni kufanya kazi na kuyatumia, ni kwamba jina la safu kweli pointer kwa kipengele kwanza ya safu hiyo. OK hivyo sasa tuna haya yote ukweli, hebu kuendelea, haki. Kwa nini sisi huduma ya juu ambapo kitu anaishi. Naam kama nilivyosema, ni pretty muhimu kujua ambapo kitu anaishi hivyo unaweza kwenda huko na mabadiliko hayo. Kazi pamoja na kweli na kitu ambacho wewe wanataka kufanya kwa kuwa kuchukua athari kutofautiana, na si kuchukua athari kwenye baadhi nakala yake. Hii inaitwa dereferencing. Sisi kwenda kwa kumbukumbu na sisi mabadiliko ya thamani pale. Hivyo kama tuna pointer na ni kuitwa pc, na inaelekeza katika tabia, basi tunaweza kusema * pc na * pc ni jina la kile tutaweza kupata kama tukienda kwa anwani pc. Nini tutaweza kupata huko ni tabia na * pc ni jinsi sisi rejea data wakati huo eneo. Hivyo tunaweza kusema kitu kama * pc = D au kitu kama hicho, na hiyo ina maana kwamba kila ilikuwa kumbukumbu anuani pc, chochote tabia awali alikuwa huko, sasa ni D, kama sisi kusema * pc = D. Hivyo hapa sisi kwenda tena kwa baadhi C mambo weird, haki. Hivyo tumeona * awali kama kuwa namna fulani ni sehemu ya aina data, na sasa ni kuwa kutumika katika mazingira tofauti kidogo kupata data katika eneo. Najua ni utata kidogo na hiyo ni kweli sehemu ya yote hii kama, kwa nini kuyatumia na mythology hii inayowazunguka kama kuwa hivyo tata, ni aina ya tatizo syntax, uaminifu. Lakini * hutumika katika mazingira yote miwili, wote kama sehemu ya jina aina, na tutaweza kuona kidogo baadaye kitu kingine, pia. Na hivi sasa ni dereference operator. Hivyo huenda kwa kumbukumbu, ni wanapata data katika eneo la pointer, na utapata kuendesha katika mapenzi. Sasa hii ni sawa na kutembelea jirani yako, haki. Kama unajua nini yako jirani anaishi, uko si kunyongwa nje na jirani yako. Unajua kutokea kwa kujua wapi wanaishi, lakini hiyo haina maana kwamba kwa mujibu wa kuwa na maarifa kwamba wewe ni mazungumzo pamoja nao. Kama unataka kuingiliana nao, una kwenda kwa nyumba zao, una kwenda kwa wanakoishi. Na mara moja kufanya hivyo, basi unaweza kuingiliana nao tu kama wewe d wanataka. Na vile vile na vigezo, unahitaji kwenda kwa anuani wao kama unataka kiutendaji yao, huwezi kujua mahali. Na njia ya kwenda kwa anwani ni kutumia *, dereference operator. Je, unafikiri hutokea kama sisi kujaribu dereference na pointer ambao thamani ni batili? Kumbuka kwamba null pointer anazungumzia kitu. Hivyo kama wewe kujaribu dereference na kitu au kwenda kwa anwani kitu, unafikiri nini hufanyika? Vizuri kama wewe guessed segmentation kosa, wewe d kuwa na haki. Kama wewe kujaribu na dereference pointer null, kuteseka segmentation kosa. Lakini kusubiri, hakuwa nawaambia, kwamba kama wewe si kwenda kuweka thamani yako ya yako pointer kwa kitu ya maana, unapaswa kuweka kwa null? Nilifanya na kwa kweli segmentation kosa ni aina ya tabia nzuri. Umewahi alitangaza kutofautiana na si kupewa thamani yake mara moja? Hivyo wewe tu kusema int x; huna kweli hawawajui kwa kitu chochote na kisha baadaye katika kanuni yako, wewe magazeti nje thamani ya x, kuwa bado si kupewa kwa kitu chochote. Mara kwa mara utasikia kupata sifuri, lakini wakati mwingine ili kupata baadhi ya idadi random, na hawana wazo ilikotoka. Vile vile anaweza mambo kutokea na kuyatumia. Wakati kutangaza pointer int * pk kwa mfano, na huna hawawajui kwa thamani, kupata ka nne kwa kumbukumbu. Chochote ka nne ya kumbukumbu ya mfumo Unaweza kupata kwamba kuwa na baadhi ya thamani ya maana. Na kuna uwezekano kuwa kitu tayari pale kwamba ni hawahitaji tena na mwingine kazi, hivyo wewe tu na chochote data alikuwa huko. Nini kama wewe alijaribu kufanya dereference baadhi anwani hiyo wewe don't- kulikuwa na Tayari ka na habari katika kuna, hiyo ni sasa katika pointer yako. Kama wewe kujaribu na dereference kwamba pointer, unaweza kuwa messing na baadhi ya kumbukumbu kwamba hakuwa na nia kwa fujo na hayo yote. Na kwa kweli unaweza kufanya kitu kweli kutisha, kama kuvunja mpango mwingine, au kuvunja kazi nyingine, au kufanya kitu malicious kwamba wewe hakuwa na nia ya kufanya wakati wote. Na hivyo ndiyo sababu ni kweli wazo nzuri kuweka kuyatumia yako kwa null ikiwa si kuweka yao kwa kitu ya maana. Ni pengine bora katika Mwisho wa siku kwa mpango wako ajali kisha kwa ajili yake kufanya kitu ambacho screws up Mpango mwingine au kazi nyingine. Tabia ambayo pengine ni hata chini bora kuliko crashing tu. Na hivyo ndiyo sababu ni kweli tabia nzuri kupata katika kuweka kuyatumia yako kwa null kama huna kuwaweka kwa maana thamani mara moja, thamani kwamba unajua na kwamba unaweza salama dereference. Basi hebu kurudi sasa na tuangalie katika syntax unaonyesha hali halisi. Kama mimi kusema int * p ;, nini mimi tu kosa gani? Kile nimepata kufanyika ni hii. Najua thamani ya p ni anwani kwa sababu kuyatumia yote ni tu anwani. Naweza dereference p kutumia * operator. Katika hali hii hapa, saa sana juu kukumbuka * ni sehemu ya aina. * Int ni aina data. Lakini siwezi dereference p kutumia * operator, na kama mimi kufanya hivyo, kama mimi kwenda kwa anwani hiyo, nini mimi kupata katika anwani hiyo? Mimi utapata integer. Hivyo int * p kimsingi ni akisema, s ni mahali. Naweza dereference p na kama Mimi kufanya, mimi utapata integer wakati huo kumbukumbu eneo. OK hivyo mimi alisema kulikuwa na mwingine Jambo annoying na nyota na hapa ndipo kwamba Jambo annoying na nyota ni. Umewahi walijaribu kutangaza vigezo mbalimbali ya aina moja juu ya mstari huo wa kanuni? Hivyo kwa mara ya pili, kujifanya kuwa mstari, kificho mimi kweli kuwa kuna katika kijani si huko na ni haki anasema int x, y, z ;. Gani kwamba kufanya ni kweli kujenga tatu integer vigezo kwa ajili yenu, mtu mmoja aitwaye x, yeye anayeitwa y, na mtu mmoja aitwaye z. Ni njia ya kufanya hivyo bila kuwa na mgawanyiko kwenye mistari mitatu. Hapa ni wapi nyota kupata annoying tena ingawa, kwa sababu * ni kweli sehemu wa wote jina aina na sehemu jina la kutofautiana. Na hivyo kama mimi kusema int * px, py, PZ, nini mimi kweli kupata ni pointer integer aitwaye px na integers mbili, py na PZ. Na kwamba pengine si kile tunataka, hilo si jambo zuri. Hivyo kama nataka kujenga kuyatumia nyingi juu ya mstari huo, wa aina moja, na nyota, kile kwa kweli wanahitaji kufanya ni kusema int * pa, * AS, * pc. Sasa baada tu alisema kuwa na sasa nawaambia hii, pengine kamwe kufanya hivyo. Na pengine ni jambo jema kwa uaminifu, kwa sababu waweza inadvertently saza nyota, kitu kama hicho. Pengine ni bora kwa labda kutangaza kuyatumia juu ya mistari ya mtu binafsi, lakini ni mwingine tu moja wale syntax annoying mambo na nyota kwamba kufanya kuyatumia vigumu kufanya kazi pamoja. Kwa sababu ni tu kisintaksia hii fujo una kazi kupitia. Pamoja na mazoezi ni gani kweli kuwa asili ya pili. Mimi bado kufanya makosa na bado baada programu kwa miaka 10, hivyo si kuwa upset kama kitu kinachotokea na wewe, ni pretty kawaida kwa uaminifu. Ni kweli aina ya flaw ya syntax. OK hivyo mimi aina ya ahadi kwamba tunataka upya Dhana ya jinsi kubwa ni kamba. Vizuri kama niliwaambieni kwamba kamba, tumekuwa kweli aina ya wamekuwa uongo na wewe wakati wote. Hakuna aina data inayoitwa kamba, na kwa kweli mimi zilizotajwa hii katika moja ya yetu video mwanzo juu ya aina ya data, kamba iliyokuwa aina data kwamba iliundwa kwa ajili yenu katika CS50.h. Una # ni pamoja na CS50.h ili kuitumia. Naam kamba ni kweli tu vinginevyo kwa kitu aitwaye * Char, pointer kwa tabia. Vizuri kuyatumia, kukumbuka, ni anazungumzia tu. Kwa hiyo kile ni ukubwa katika ka wa kamba? Naam ni nne au nane. Na sababu nasema nne au nane ni kwa sababu ni kweli inategemea mfumo, Kama unatumia CS50 ide, * Char ni ukubwa wa Char * Ni nane, ni mfumo 64-bit. Kila address katika kumbukumbu ni 64 bits kwa muda mrefu. Kama unatumia appliance CS50 au kutumia yoyote mashine 32-bit, na wewe Nimesikia kwamba muda 32-bit mashine, ni nini 32-bit mashine? Vizuri tu ina maana kwamba kila anwani katika kumbukumbu ni 32 bits kwa muda mrefu. Na hivyo bits 32 ni ka nne. Hivyo * Char ni nne au nane ka kutegemea mfumo wako. Na hakika aina yoyote data, na pointer data yoyote aina, tangu kuyatumia yote ni tu anwani, ni ka nne au nane. Basi hebu kupitia upya hii mchoro na hebu kuhitimisha video hii na zoezi kidogo hapa. Hivyo hapa ni mchoro sisi kushoto mbali na mwanzoni mwa video. Hivyo kile kinachotokea sasa kama mimi kusema * pk = 35? Hivyo ni nini maana wakati mimi kusema, * pk = 35? Kuchukua pili. * pk. Katika mazingira hapa, * ni dereference operator. Hivyo wakati dereference alama ni kutumika, twende kwa anwani alisema kwa na pk, na sisi kubadili kile tunaona. Hivyo * pk = 35 kwa ufanisi gani hii kwa picha. Hivyo ni kimsingi syntactically kufanana na ya Baada ya kusema k = 35. Moja zaidi. Kama mimi kusema int m, mimi kujenga kutofautiana mpya iitwayo m. Sanduku mpya, ni sanduku ya kijani kwa sababu itakuja kushikilia integer, na ni kinachoitwa m. Kama mimi kusema m = 4, mimi kuweka integer ndani ya boksi hilo. Kama kusema pk = & m, jinsi gani mabadiliko haya mchoro? Pk = & m, je unakumbuka kile & Operator gani au ni wito? Kumbuka kwamba baadhi & jina kutofautiana ni pepe ya jina kutofautiana. Kwa hiyo kile sisi ni kusema ni pk anapata pepe ya m. Na hivyo kwa ufanisi kile kinachotokea mchoro ni kwamba PK pointi tena kwa k, lakini pointi kwa m. Tena kuyatumia ni sana gumu kufanya kazi na na wao kuchukua mengi ya mazoezi, lakini kwa sababu ya uwezo wao wa kuruhusu kupita data kati ya kazi na kwa kweli kuwa wale mabadiliko kuchukua athari, kupata kichwa yako karibu ni kweli ni muhimu. Pengine ni ngumu zaidi mada sisi kujadili katika CS50, lakini thamani kwamba kupata kutoka kwa kutumia kuyatumia mbali outweighs matatizo kwamba kuja kutoka kujifunza kwao. Hivyo Napenda bora wa Bahati kujifunza kuhusu kuyatumia. Mimi nina Doug Lloyd, hii ni CS50.