1 00:00:00,000 --> 00:00:02,395 >> [Music kucheza] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: Sawa. 4 00:00:06,506 --> 00:00:08,880 Tumekuwa kazi na integers, tumekuwa kazi na wahusika, 5 00:00:08,880 --> 00:00:11,930 tumekuwa kazi ikifungwa, mara mbili, masharti, na bools. 6 00:00:11,930 --> 00:00:14,870 Tumekuwa nimechoka pretty much wote ya [inaudible] aina kwamba 7 00:00:14,870 --> 00:00:17,100 wamekuwa inapatikana kwa sisi wote pamoja. 8 00:00:17,100 --> 00:00:19,430 Lakini sasa tunataka kufanya kitu zaidi. 9 00:00:19,430 --> 00:00:20,210 Je, sisi kufanya hivyo? 10 00:00:20,210 --> 00:00:22,560 Je, sisi kuunda aina tofauti data? 11 00:00:22,560 --> 00:00:26,130 Tunaweza kufanya hivyo kwa kutumia miundo. 12 00:00:26,130 --> 00:00:30,180 Hivyo miundo kuruhusu sisi kuunganisha vigezo ya aina tofauti 13 00:00:30,180 --> 00:00:34,810 katika moja, mpya kutofautiana aina, ambayo tunaweza kuwapa aina ya jina lake mwenyewe. 14 00:00:34,810 --> 00:00:37,570 Hii ni kweli nguvu Jambo kuwa na uwezo wa kufanya, 15 00:00:37,570 --> 00:00:40,900 kwa sababu tunaweza sasa kundi mambo ya aina mbalimbali data 16 00:00:40,900 --> 00:00:43,910 pamoja kwamba kuwa na uhusiano mantiki. 17 00:00:43,910 --> 00:00:46,440 Tumekuwa na uwezo wa kufanya hivyo na arrays aina ya, haki? 18 00:00:46,440 --> 00:00:49,540 Tunaweza kundi vigezo ya data aina moja 19 00:00:49,540 --> 00:00:53,410 pamoja katika kitengo kubwa ya kumbukumbu, safu. 20 00:00:53,410 --> 00:00:56,660 >> Lakini sisi hawajaweza kuchanganya up data aina tofauti pamoja. 21 00:00:56,660 --> 00:01:02,610 Hatuwezi, kusema, jozi integer, na tabia, na mara mbili zote 22 00:01:02,610 --> 00:01:05,330 katika kitu kimoja na wito kwamba kitengo moja. 23 00:01:05,330 --> 00:01:08,830 Lakini pamoja na miundo, au mara nyingi hujulikana kama structs, 24 00:01:08,830 --> 00:01:09,585 sisi kweli anaweza. 25 00:01:09,585 --> 00:01:12,370 Hivyo muundo ni aina ya kama kutofautiana super. 26 00:01:12,370 --> 00:01:16,530 Ni kutofautiana kwamba ina vigezo vingine ndani yake. 27 00:01:16,530 --> 00:01:19,650 Hivyo hapa ni mfano wa muundo rahisi sana. 28 00:01:19,650 --> 00:01:23,380 Hii ni nini syntax bila kuangalia kama kujenga muundo kwa ajili ya gari. 29 00:01:23,380 --> 00:01:25,250 Sasa, hebu kwenda kwa njia ya syntax hapa. 30 00:01:25,250 --> 00:01:27,400 Struct, hiyo ni Keyword kwamba inaonyesha 31 00:01:27,400 --> 00:01:30,270 kwamba mimi nina kujenga aina mpya data hapa. 32 00:01:30,270 --> 00:01:33,860 Hasa, jina data aina ni kwenda kuwa struct gari, kama tutaweza kuona. 33 00:01:33,860 --> 00:01:36,640 Lakini hii ni aina ya ncha mbali na mkusanyaji kwamba hii 34 00:01:36,640 --> 00:01:42,440 kama kundi la vigezo kwamba ni kwenda kuchukuliwa sehemu ya aina moja 35 00:01:42,440 --> 00:01:44,010 katika dakika. 36 00:01:44,010 --> 00:01:46,340 >> Magari, tu jina ya muundo. 37 00:01:46,340 --> 00:01:50,590 Tena, aina data hapa ni kwenda kuwa struct gari, si tu gari. 38 00:01:50,590 --> 00:01:53,060 Lakini kama una different-- kama kujenga structs nyingi 39 00:01:53,060 --> 00:01:56,950 katika mpango huo, unahitaji kutofautisha kati ya struct na struct. 40 00:01:56,950 --> 00:02:00,140 Hivyo struct gari, mimi mwenyewe ninazo sababu struct mwanafunzi, kwa mfano, 41 00:02:00,140 --> 00:02:01,790 katika mpango huo. 42 00:02:01,790 --> 00:02:05,980 Ndani ya braces curly ni wote wa kinachojulikana mashamba, 43 00:02:05,980 --> 00:02:07,954 au wanachama wa muundo. 44 00:02:07,954 --> 00:02:10,370 Kwa hiyo kile ni baadhi ya mambo ambayo ni asili katika gari? 45 00:02:10,370 --> 00:02:15,270 Naam, ni kawaida ina mwaka, ina jina mfano, na sahani leseni, 46 00:02:15,270 --> 00:02:18,000 odometer kwamba kwa kawaida ina baadhi ya idadi ya maili juu yake, 47 00:02:18,000 --> 00:02:19,225 na labda ukubwa wa injini. 48 00:02:19,225 --> 00:02:23,570 Na kama unaweza kuona, mimi nina kuchanganya juu integers na wahusika na mara mbili. 49 00:02:23,570 --> 00:02:26,420 Wao ni wote kwenda kuwa sehemu ya huu mpya aina data. 50 00:02:26,420 --> 00:02:29,750 >> Mwisho, jambo la mwisho mimi haja ya kufanya, usisahau huu semicolon kidogo 51 00:02:29,750 --> 00:02:30,290 mwishoni. 52 00:02:30,290 --> 00:02:34,380 Baada ya sisi kumaliza kufafanua muundo, tunahitaji kuweka semicolon mwishoni. 53 00:02:34,380 --> 00:02:37,325 Ni kawaida sana syntactical makosa, kwa sababu kwa kazi, 54 00:02:37,325 --> 00:02:40,200 Kwa mfano, ungekuwa tu na wazi curly brace, karibu curly brace. 55 00:02:40,200 --> 00:02:42,950 Huwezi kuweka semicolon katika Mwishoni mwa kazi ufafanuzi. 56 00:02:42,950 --> 00:02:46,430 Hii inaonekana kama kazi ufafanuzi, lakini siyo, 57 00:02:46,430 --> 00:02:49,653 na hivyo semicolon huko ni tu kukumbusha kuwa wewe 58 00:02:49,653 --> 00:02:52,440 haja ya kuiweka huko, kwa sababu compiler mapenzi vinginevyo si 59 00:02:52,440 --> 00:02:53,510 kujua nini cha kufanya na hayo. 60 00:02:53,510 --> 00:02:56,160 Ni kosa la kawaida sana kwa ajali kufanya 61 00:02:56,160 --> 00:02:58,570 wakati wewe ni kwanza kufafanua miundo. 62 00:02:58,570 --> 00:02:59,500 >> SAWA. 63 00:02:59,500 --> 00:03:02,824 Hivyo sisi kwa kawaida kufafanua miundo yetu katika sana juu ya mipango yetu 64 00:03:02,824 --> 00:03:05,490 kwa sababu wao ni pengine ni kwenda kutumiwa na kazi nyingi. 65 00:03:05,490 --> 00:03:08,850 Hatutaki kufafanua struct ndani ya kazi, 66 00:03:08,850 --> 00:03:12,110 kwa sababu basi tunaweza only-- wigo wa mfumo wa kweli 67 00:03:12,110 --> 00:03:13,790 tu ipo ndani ya kazi hiyo. 68 00:03:13,790 --> 00:03:17,450 Tunatarajia pengine wanataka kufafanua muundo ili tuweze kutumia katika kazi nyingi, 69 00:03:17,450 --> 00:03:20,670 au labda katika mbalimbali mafaili ambayo ni amefungwa pamoja 70 00:03:20,670 --> 00:03:22,920 kujenga mpango wetu moja. 71 00:03:22,920 --> 00:03:24,920 Wakati mwingine pia badala ya kufafanua muundo 72 00:03:24,920 --> 00:03:27,961 juu sana ambapo wewe kuweka yako chupa pamoja na na chupa yako amefafanua, 73 00:03:27,961 --> 00:03:32,080 kwa mfano, unaweza kuziweka katika tofauti mafaili nukta h, ambayo wewe kisha 74 00:03:32,080 --> 00:03:35,020 chupa ni pamoja na wewe mwenyewe. 75 00:03:35,020 --> 00:03:37,620 >> Hivyo tuna miundo, lakini sasa tunahitaji kupata ndani mwao. 76 00:03:37,620 --> 00:03:39,800 Je, sisi kupata ndani ya muundo wa upatikanaji 77 00:03:39,800 --> 00:03:43,530 wale ndogo vigezo, vigezo wale ambazo zipo ndani ya mfumo wa? 78 00:03:43,530 --> 00:03:46,810 Naam, tuna kitu kinachoitwa dot operator, ambayo inaruhusu sisi 79 00:03:46,810 --> 00:03:50,990 kupata mashamba ya muundo. 80 00:03:50,990 --> 00:03:55,490 Hivyo kwa mfano, hebu sema nimekuwa alitangaza data zangu muundo aina fulani 81 00:03:55,490 --> 00:03:59,020 juu ya mpango wangu, au labda katika dot h faili kwamba nimepata chupa pamoja. 82 00:03:59,020 --> 00:04:03,360 Kama mimi basi unataka kujenga mpya kutofautiana wa aina hiyo data, naweza kusema, 83 00:04:03,360 --> 00:04:06,260 struct gari, gari langu, semicolon. 84 00:04:06,260 --> 00:04:11,580 Tu kama mimi naweza kusema int x, au kamba jina semicolon. 85 00:04:11,580 --> 00:04:18,100 >> Aina ya data hapa ni struct gari, jina la kutofautiana ni gari langu, 86 00:04:18,100 --> 00:04:23,770 na kisha naweza kutumia nukta operator kwa kupata maeneo mbalimbali ya gari langu. 87 00:04:23,770 --> 00:04:27,494 Hivyo naweza kusema gari langu dot mwaka ni sawa na 2011. 88 00:04:27,494 --> 00:04:28,410 Hiyo ni kikamilifu faini. 89 00:04:28,410 --> 00:04:34,210 Mwaka, kama unakumbuka, ilipewa kama integer uwanja ndani ya hii gari struct 90 00:04:34,210 --> 00:04:35,200 Aina ya data. 91 00:04:35,200 --> 00:04:39,966 Hivyo yoyote kutofautiana wa data struct gari aina, kama vile gari langu, naweza kusema gari langu 92 00:04:39,966 --> 00:04:44,030 dot mwaka ni sawa na na kisha kuwapa ni baadhi ya thamani integer, 2011. 93 00:04:44,030 --> 00:04:47,290 My gari nukta sahani ni sawa na CS50. 94 00:04:47,290 --> 00:04:51,180 Kadi nukta yangu odometer sawa 50,505 semicolon. 95 00:04:51,180 --> 00:04:53,270 Wote wa wale watu kikamilifu faini na kwamba 96 00:04:53,270 --> 00:04:57,802 jinsi sisi kupata mashamba ya muundo. 97 00:04:57,802 --> 00:05:00,260 Miundo, ingawa, hawana haja kutengenezwa juu ya stack. 98 00:05:00,260 --> 00:05:02,950 Tu kama kutofautiana nyingine yoyote, sisi Unaweza dynamically kutenga yao. 99 00:05:02,950 --> 00:05:06,309 Kama tuna mpango kwamba huenda kuwa kuzalisha miundo wengi, 100 00:05:06,309 --> 00:05:08,100 hatujui ni wangapi sisi ni kwenda haja, 101 00:05:08,100 --> 00:05:10,800 basi tunahitaji dynamically kutenga miundo hiyo 102 00:05:10,800 --> 00:05:12,960 kama mpango wetu ni mbio. 103 00:05:12,960 --> 00:05:16,600 Na hivyo kama tunakwenda kupata mashamba ya muundo katika mazingira ya hapo, 104 00:05:16,600 --> 00:05:20,660 kukumbuka kwamba tunahitaji kwanza dereference pointer muundo, 105 00:05:20,660 --> 00:05:24,810 na kisha mara moja sisi dereference pointer, kisha tuweze kupata mashamba. 106 00:05:24,810 --> 00:05:26,830 Kama sisi tu pointer kwa muundo, 107 00:05:26,830 --> 00:05:32,120 hatuwezi tu kusema pointer dot shamba jina na kupata kile sisi ni kuangalia kwa. 108 00:05:32,120 --> 00:05:34,259 Kuna hatua za ziada ya dereferencing. 109 00:05:34,259 --> 00:05:36,050 Basi hebu kusema kwamba badala ya previous-- 110 00:05:36,050 --> 00:05:38,770 kama mfano uliopita, badala ya kutangaza ni 111 00:05:38,770 --> 00:05:43,680 juu ya stack, struct gari, yangu gari, semicolon, nasema struct gari, 112 00:05:43,680 --> 00:05:48,020 nyota, pointer struct gari aitwaye gari langu, 113 00:05:48,020 --> 00:05:51,250 sawa malloc ukubwa wa struct gari. 114 00:05:51,250 --> 00:05:54,950 Ukubwa wa tutaweza kufikiri jinsi wengi ka mpya aina yako data unachukua. 115 00:05:54,950 --> 00:05:58,570 Wewe si lazima tu haja ya kutumia ukubwa wa, upana, int, au Char, au yoyote 116 00:05:58,570 --> 00:05:59,715 ya kujengwa katika aina ya data. 117 00:05:59,715 --> 00:06:02,090 Compiler ni smart kutosha kufikiri ka wangapi 118 00:06:02,090 --> 00:06:04,170 wanatakiwa na muundo yako mpya. 119 00:06:04,170 --> 00:06:09,610 Hivyo mimi malloc mwenyewe kitengo cha kumbukumbu kubwa ya kutosha kushikilia struct gari, 120 00:06:09,610 --> 00:06:12,410 na mimi kupata pointer nyuma kwa kuwa block ya kumbukumbu, 121 00:06:12,410 --> 00:06:16,090 na kwamba pointer ni kwa ajili ya gari langu. 122 00:06:16,090 --> 00:06:18,050 >> Sasa, kama nataka kupata mashamba ya gari langu, 123 00:06:18,050 --> 00:06:22,615 Mimi kwanza dereference gari langu kwa kutumia dereference operator, nyota 124 00:06:22,615 --> 00:06:26,620 kwamba tumeona kutoka kuyatumia video, na kisha baada ya mimi dereference, 125 00:06:26,620 --> 00:06:32,200 kisha naweza kutumia nukta operator kwa kupata maeneo mbalimbali ya gari langu. 126 00:06:32,200 --> 00:06:35,490 Nyota gari langu nukta mwaka ni sawa na 2011. 127 00:06:35,490 --> 00:06:38,480 Ambalo litakuwa na athari tunataka katika kesi hii, 128 00:06:38,480 --> 00:06:41,960 kwa sababu tumekuwa dynamically zilizotengwa gari langu. 129 00:06:41,960 --> 00:06:43,610 >> Hiyo ni aina ya annoying, ingawa, sawa? 130 00:06:43,610 --> 00:06:44,818 Kuna mchakato wa hatua 2 sasa. 131 00:06:44,818 --> 00:06:47,460 Sasa tuna dereference-- tuna nyota operator, 132 00:06:47,460 --> 00:06:48,910 na tuna nukta operator. 133 00:06:48,910 --> 00:06:51,660 Na kama unaweza kutarajia, kwa sababu C programmers upendo njia fupi 134 00:06:51,660 --> 00:06:53,740 kufanya mambo, kuna njia fupi kwa kufanya hivyo. 135 00:06:53,740 --> 00:06:57,790 Kuna operator mwingine aitwaye mshale, ambayo inafanya mchakato huu rahisi sana. 136 00:06:57,790 --> 00:07:00,750 Njia mshale kazi ni kwanza dereferences 137 00:07:00,750 --> 00:07:03,560 pointer upande wa kushoto upande wa operator, 138 00:07:03,560 --> 00:07:06,620 na kisha, baada ya dereferenced pointer upande wa kushoto, 139 00:07:06,620 --> 00:07:09,620 ni wanapata uwanja juu ya haki. 140 00:07:09,620 --> 00:07:14,170 Na hivyo awali tulikuwa na aina hii ya nyota gari langu dot mambo haya yote, 141 00:07:14,170 --> 00:07:15,880 kama kuna mengi kinachoendelea huko. 142 00:07:15,880 --> 00:07:22,040 Lakini nini tunaweza badala kufanya ni Haya gari mshale wangu mwaka ni sawa na 2011. 143 00:07:22,040 --> 00:07:23,580 >> Tena nini kinatokea hapa? 144 00:07:23,580 --> 00:07:25,720 Kwanza, mimi nina dereferencing gari langu. 145 00:07:25,720 --> 00:07:27,810 Ambayo tena, ni pointer hapa. 146 00:07:27,810 --> 00:07:31,270 Kisha, baada ya dereferenced gari langu, mimi 147 00:07:31,270 --> 00:07:35,130 Basi unaweza kupata mashamba mwaka, sahani, na odometer 148 00:07:35,130 --> 00:07:40,020 tu kama mimi naweza kabla ya kuwa na kwanza kutumika nyota dereference gari langu, 149 00:07:40,020 --> 00:07:42,020 na nukta ya kupata shamba. 150 00:07:42,020 --> 00:07:45,290 Hivyo unaweza kuwa na miundo, wewe unaweza kuwa na kuyatumia kwa miundo, 151 00:07:45,290 --> 00:07:48,360 na una njia za upatikanaji mashamba ya miundo hiyo, 152 00:07:48,360 --> 00:07:52,600 kama una kuyatumia kwa nao au vigezo wenyewe. 153 00:07:52,600 --> 00:07:57,640 Dot au mshale, kutegemea jinsi kutofautiana ilitangazwa. 154 00:07:57,640 --> 00:08:00,510 Mimi nina Doug Lloyd, hii ni CS50. 155 00:08:00,510 --> 00:08:01,975