1 00:00:00,000 --> 00:00:02,395 >> [CHWARAE CERDDORIAETH] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK. 4 00:00:06,506 --> 00:00:08,880 Rydym wedi gweithio gyda chyfanrifau, rydym wedi gweithio gyda chymeriadau, 5 00:00:08,880 --> 00:00:11,930 rydym wedi gweithio fflotiau, dyblau, llinynnau, a bools. 6 00:00:11,930 --> 00:00:14,870 Rydym wedi blino'n lân 'n bert lawer pob y [Anghlywadwy] mathau sy'n 7 00:00:14,870 --> 00:00:17,100 wedi bod ar gael i ni i gyd ar hyd. 8 00:00:17,100 --> 00:00:19,430 Ond yn awr yr ydym am wneud rhywbeth mwy. 9 00:00:19,430 --> 00:00:20,210 Sut rydym yn gwneud hynny? 10 00:00:20,210 --> 00:00:22,560 Sut rydym yn creu gwahanol fathau o ddata? 11 00:00:22,560 --> 00:00:26,130 Gallwn wneud hynny drwy ddefnyddio strwythurau. 12 00:00:26,130 --> 00:00:30,180 Felly strwythurau yn ein galluogi i uno newidynnau o wahanol fathau 13 00:00:30,180 --> 00:00:34,810 i mewn i fath newidyn sengl, newydd, y gallwn aseinio ei henw fath ei hun. 14 00:00:34,810 --> 00:00:37,570 Mae hwn yn wirioneddol gryf beth i fod yn gallu ei wneud, 15 00:00:37,570 --> 00:00:40,900 oherwydd ein bod yn gallu nawr grŵp elfennau o wahanol fathau o ddata 16 00:00:40,900 --> 00:00:43,910 ynghyd sydd â chysylltiad rhesymegol. 17 00:00:43,910 --> 00:00:46,440 Rydym wedi bod yn gallu gwneud hyn gyda arrays fath o, dde? 18 00:00:46,440 --> 00:00:49,540 Gallwn newidynnau grŵp o'r un math data 19 00:00:49,540 --> 00:00:53,410 gyda'i gilydd mewn uned fawr o gof, amrywiaeth. 20 00:00:53,410 --> 00:00:56,660 >> Ond nid ydym wedi gallu cymysgu i fyny o wahanol fathau o ddata at ei gilydd. 21 00:00:56,660 --> 00:01:02,610 Ni allwn, yn dweud, pâr yn gyfanrif, ac yn gymeriad, a dwbl i gyd 22 00:01:02,610 --> 00:01:05,330 yn yr un peth a yn galw bod un uned. 23 00:01:05,330 --> 00:01:08,830 Ond gyda strwythurau, neu y cyfeirir atynt yn aml fel structs, 24 00:01:08,830 --> 00:01:09,585 rydym mewn gwirionedd yn gallu. 25 00:01:09,585 --> 00:01:12,370 Felly strwythur yn didoli o fel newidyn super. 26 00:01:12,370 --> 00:01:16,530 Mae'n newidyn sy'n cynnwys newidynnau eraill tu mewn iddo. 27 00:01:16,530 --> 00:01:19,650 Felly dyma enghraifft o strwythur syml iawn. 28 00:01:19,650 --> 00:01:23,380 Mae hyn yn hyn y byddai'r gystrawen yn edrych yn hoffi i greu strwythur ar gyfer car. 29 00:01:23,380 --> 00:01:25,250 Yn awr, gadewch i ni fynd drwy'r gystrawen yma. 30 00:01:25,250 --> 00:01:27,400 Struct, dyna'r gair allweddol sy'n dangos 31 00:01:27,400 --> 00:01:30,270 fy mod i'n creu math data newydd yma. 32 00:01:30,270 --> 00:01:33,860 Yn benodol, enw y math data yn mynd i fod yn gar struct, fel y byddwn yn gweld. 33 00:01:33,860 --> 00:01:36,640 Ond mae hyn yn y math o domen ffwrdd i'r casglwr bod hyn 34 00:01:36,640 --> 00:01:42,440 fel grŵp o newidynnau sy'n mynd i gael ei ystyried yn rhan o'r un math 35 00:01:42,440 --> 00:01:44,010 mewn munud. 36 00:01:44,010 --> 00:01:46,340 >> Cars, dim ond enw'r strwythur. 37 00:01:46,340 --> 00:01:50,590 Unwaith eto, y math data yma yn mynd i fod car struct, nid dim ond car. 38 00:01:50,590 --> 00:01:53,060 Ond os oes gennych different-- os ydych yn creu structs lluosog 39 00:01:53,060 --> 00:01:56,950 yn yr un rhaglen, mae angen i chi gwahaniaethu rhwng struct a struct. 40 00:01:56,950 --> 00:02:00,140 Car Felly struct, efallai y byddwn hefyd yn cael myfyriwr struct, er enghraifft, 41 00:02:00,140 --> 00:02:01,790 yn yr un rhaglen. 42 00:02:01,790 --> 00:02:05,980 Y tu mewn i'r braces cyrliog yn pob un o'r caeau hyn a elwir yn, 43 00:02:05,980 --> 00:02:07,954 neu aelodau o'r strwythur. 44 00:02:07,954 --> 00:02:10,370 Felly beth yw rhai o'r pethau sy'n gynhenid ​​mewn car? 45 00:02:10,370 --> 00:02:15,270 Wel, mae fel arfer mae gan y flwyddyn, wedi enw model, a phlât trwydded, 46 00:02:15,270 --> 00:02:18,000 mae odomedr sydd fel arfer rhyw nifer y milltiroedd arno, 47 00:02:18,000 --> 00:02:19,225 ac efallai bydd maint yr injan. 48 00:02:19,225 --> 00:02:23,570 Ac fel y gwelwch, dw i'n cymysgu i fyny cyfanrifau a chymeriadau a dyblau. 49 00:02:23,570 --> 00:02:26,420 Maen nhw i gyd yn mynd i fod yn rhan o'r math hwn o ddata newydd. 50 00:02:26,420 --> 00:02:29,750 >> Yn olaf, y peth olaf mae angen i mi ei wneud, peidiwch ag anghofio hanner colon bach hwn 51 00:02:29,750 --> 00:02:30,290 Yn y diwedd. 52 00:02:30,290 --> 00:02:34,380 Ar ôl i ni orffen diffinio'r strwythur, mae angen i ni roi hanner colon ar y diwedd. 53 00:02:34,380 --> 00:02:37,325 Mae'n cystrawennol gyffredin iawn camgymeriad, gan fod â swyddogaeth, 54 00:02:37,325 --> 00:02:40,200 er enghraifft, byddech yn unig wedi Brace cyrliog agored, Brace cyrliog agos. 55 00:02:40,200 --> 00:02:42,950 Nid ydych yn rhoi hanner colon yn y diwedd diffiniad swyddogaeth. 56 00:02:42,950 --> 00:02:46,430 Mae hyn yn edrych fel swyddogaeth ddiffiniad, ond nid yw'n, 57 00:02:46,430 --> 00:02:49,653 ac felly mae'r hanner colon yno yn unig yw ein hatgoffa bod chi 58 00:02:49,653 --> 00:02:52,440 Mae angen i roi yno, oherwydd fel arall mae'r compiler ni fydd 59 00:02:52,440 --> 00:02:53,510 yn gwybod beth i'w wneud ag ef. 60 00:02:53,510 --> 00:02:56,160 Mae'n gamgymeriad cyffredin iawn i wneud yn ddamweiniol 61 00:02:56,160 --> 00:02:58,570 pan fyddwch yn diffinio strwythurau gyntaf. 62 00:02:58,570 --> 00:02:59,500 >> IAWN. 63 00:02:59,500 --> 00:03:02,824 Felly, rydym fel arfer yn diffinio ein strwythurau ar frig ein rhaglenni 64 00:03:02,824 --> 00:03:05,490 oherwydd yn ôl pob tebyg maen nhw'n mynd i'w defnyddio gan swyddogaethau lluosog. 65 00:03:05,490 --> 00:03:08,850 Nid ydym am i ddiffinio struct tu mewn swyddogaeth, 66 00:03:08,850 --> 00:03:12,110 oherwydd wedyn gallwn only-- y cwmpas y strwythur mewn gwirionedd 67 00:03:12,110 --> 00:03:13,790 ond yn bodoli y tu mewn y swyddogaeth honno. 68 00:03:13,790 --> 00:03:17,450 Mae'n debyg byddem yn awyddus i ddiffinio strwythur fel y gallwn ei defnyddio mewn swyddogaethau lluosog, 69 00:03:17,450 --> 00:03:20,670 neu efallai mewn aml ffeiliau sy'n cael eu clymu at ei gilydd 70 00:03:20,670 --> 00:03:22,920 i greu ein rhaglen sengl. 71 00:03:22,920 --> 00:03:24,920 Weithiau hefyd yn lle hynny o ddiffinio strwythur 72 00:03:24,920 --> 00:03:27,961 ar yr union top lle rydych yn rhoi eich bunt yn cynnwys a'ch punt yn diffinio, 73 00:03:27,961 --> 00:03:32,080 er enghraifft, efallai y byddwch yn eu rhoi mewn ffeiliau dot h wahân, yr ydych wedyn yn 74 00:03:32,080 --> 00:03:35,020 bunt yn cynnwys chi eich hun. 75 00:03:35,020 --> 00:03:37,620 >> Felly mae gennym strwythurau, ond erbyn hyn mae angen i ni fynd i mewn ohonynt. 76 00:03:37,620 --> 00:03:39,800 Sut ydym yn mynd y tu mewn o strwythur i fynediad 77 00:03:39,800 --> 00:03:43,530 yr is-newidynnau, newidynnau hynny sy'n bodoli y tu mewn i'r strwythur? 78 00:03:43,530 --> 00:03:46,810 Wel, mae gennym rywbeth o'r enw gweithredwr y dot, sy'n ein galluogi 79 00:03:46,810 --> 00:03:50,990 i gael mynediad at y meysydd y strwythur. 80 00:03:50,990 --> 00:03:55,490 Felly, er enghraifft, gadewch i ni ddweud fy mod i wedi datgan fy nata strwythur teipiwch rhywle 81 00:03:55,490 --> 00:03:59,020 ar ben fy rhaglen, neu efallai mewn ffeil dot h fy mod i wedi punt cynnwys. 82 00:03:59,020 --> 00:04:03,360 Os wyf Yna eisiau creu newydd amrywiol o'r math data, gallaf ddweud, 83 00:04:03,360 --> 00:04:06,260 car struct, fy nghar, hanner colon. 84 00:04:06,260 --> 00:04:11,580 Yn union fel yr wyf yn gallai ddweud int x, neu enw llinyn hanner colon. 85 00:04:11,580 --> 00:04:18,100 >> Y math data yma yw car struct, enw'r newidyn yw fy car, 86 00:04:18,100 --> 00:04:23,770 ac yna gallaf ddefnyddio'r dot gweithredwr gael mynediad at y gwahanol feysydd o fy nghar. 87 00:04:23,770 --> 00:04:27,494 Felly, gallaf ddweud fy nghar dot flwyddyn yn cyfateb 2011 ymlaen. 88 00:04:27,494 --> 00:04:28,410 Mae hynny'n berffaith iawn. 89 00:04:28,410 --> 00:04:34,210 Flwyddyn, os cofiwch, Diffiniwyd fel maes cyfanrifol tu mewn y car struct 90 00:04:34,210 --> 00:04:35,200 Math o ddata. 91 00:04:35,200 --> 00:04:39,966 Felly unrhyw newidyn o ddata car struct math, megis fy car, gallaf ddweud fy nghar 92 00:04:39,966 --> 00:04:44,030 dot flwyddyn yn cyfateb ac yna aseinio mae'n rhywfaint o werth cyfanrif, 2011 ymlaen. 93 00:04:44,030 --> 00:04:47,290 Mae fy dot car plât hafal CS50. 94 00:04:47,290 --> 00:04:51,180 Fy ngherdyn dot odomedr yn hafal i 50,505 hanner colon. 95 00:04:51,180 --> 00:04:53,270 Mae pob un o'r rheini'n berffaith iawn a dyna 96 00:04:53,270 --> 00:04:57,802 sut yr ydym yn cael mynediad i'r meysydd y strwythur. 97 00:04:57,802 --> 00:05:00,260 Strwythurau, fodd bynnag, nid oes angen i gael eu creu ar y corn. 98 00:05:00,260 --> 00:05:02,950 Yn union fel unrhyw newidyn arall, rydym Gall ddyrannu iddynt ddynamig. 99 00:05:02,950 --> 00:05:06,309 Os oes gennym raglen y gallai yn cynhyrchu llawer o strwythurau, 100 00:05:06,309 --> 00:05:08,100 nid ydym yn gwybod faint o rydym yn mynd i angen, 101 00:05:08,100 --> 00:05:10,800 yna mae angen i ddeinamig dyrannu strwythurau hynny 102 00:05:10,800 --> 00:05:12,960 gan fod ein rhaglen yn rhedeg. 103 00:05:12,960 --> 00:05:16,600 Ac felly os ydym yn mynd i gael mynediad i'r meysydd strwythur yn y cyd-destun, 104 00:05:16,600 --> 00:05:20,660 dwyn i gof y mae angen yn gyntaf i ni i dereference pwyntydd i'r strwythur, 105 00:05:20,660 --> 00:05:24,810 ac yna ar ôl i ni dereference y pwyntydd, yna gallwn gael mynediad i'r caeau. 106 00:05:24,810 --> 00:05:26,830 Os mai dim ond un Pointer i'r strwythur, 107 00:05:26,830 --> 00:05:32,120 ni allwn dim ond dweud pwyntydd dot cae enwi a chael yr hyn rydym yn chwilio amdano. 108 00:05:32,120 --> 00:05:34,259 Mae y cam ychwanegol o dereferencing. 109 00:05:34,259 --> 00:05:36,050 Felly, gadewch i ni ddweud bod yn hytrach na'r previous-- 110 00:05:36,050 --> 00:05:38,770 yn union fel yr enghraifft flaenorol, yn hytrach na datgan ei 111 00:05:38,770 --> 00:05:43,680 ar y simnai, car struct, fy car, hanner colon, yr wyf yn dweud car struct, 112 00:05:43,680 --> 00:05:48,020 seren, pwyntydd i car struct enw fy car, 113 00:05:48,020 --> 00:05:51,250 yn hafal i faint malloc o gar struct. 114 00:05:51,250 --> 00:05:54,950 Maint y fe wnawn ni chyfrif i faint o bytes eich math data newydd yn dechrau. 115 00:05:54,950 --> 00:05:58,570 Nid ydynt o reidrwydd yn unig angen i chi ddefnyddio maint, lled, int, neu torgoch, neu unrhyw 116 00:05:58,570 --> 00:05:59,715 o'r mathau data adeiledig yn. 117 00:05:59,715 --> 00:06:02,090 Mae'r compiler yn ddigon craff at chyfrif i maes faint o bytes 118 00:06:02,090 --> 00:06:04,170 Mae'n ofynnol gan eich strwythur newydd. 119 00:06:04,170 --> 00:06:09,610 Felly yr wyf yn malloc fy hun yn uned o gof ddigon mawr i ddal car struct, 120 00:06:09,610 --> 00:06:12,410 ac yr wyf yn cael pwyntydd yn ôl i'r bloc o cof, 121 00:06:12,410 --> 00:06:16,090 ac y pwyntydd cael ei neilltuo i fy nghar. 122 00:06:16,090 --> 00:06:18,050 >> Yn awr, os ydw i eisiau mynediad meysydd fy nghar, 123 00:06:18,050 --> 00:06:22,615 Yn gyntaf dereference fy nghar i mi ddefnyddio gweithredwr dereference, seren 124 00:06:22,615 --> 00:06:26,620 ein bod wedi gweld o'r awgrymiadau fideos, ac yna ar ôl i mi dereference, 125 00:06:26,620 --> 00:06:32,200 yna gallaf ddefnyddio'r dot gweithredwr gael mynediad at y gwahanol feysydd o fy nghar. 126 00:06:32,200 --> 00:06:35,490 Seren fy nghar dot flwyddyn yn cyfateb 2011 ymlaen. 127 00:06:35,490 --> 00:06:38,480 Byddai hynny'n cael yr effaith yr ydym am yn yr achos hwn, 128 00:06:38,480 --> 00:06:41,960 oherwydd ein bod i wedi ddynamig ddyrannu fy nghar. 129 00:06:41,960 --> 00:06:43,610 >> Dyna fath o blino, fodd bynnag, dde? 130 00:06:43,610 --> 00:06:44,818 Mae proses 2 gam yn awr. 131 00:06:44,818 --> 00:06:47,460 Nawr mae'n rhaid i ni dereference-- mae gennym gweithredwr seren, 132 00:06:47,460 --> 00:06:48,910 ac mae gennym gweithredwr dot. 133 00:06:48,910 --> 00:06:51,660 Ac fel y gallech ddisgwyl, gan fod Rhaglenwyr C caru ffyrdd byrrach 134 00:06:51,660 --> 00:06:53,740 i wneud pethau, mae ffordd byrrach i wneud hyn. 135 00:06:53,740 --> 00:06:57,790 Mae weithredwr arall o'r enw saeth, sy'n gwneud y broses hon yn llawer haws. 136 00:06:57,790 --> 00:07:00,750 Mae'r ffordd y saeth gweithio yw mae'n dereferences cyntaf 137 00:07:00,750 --> 00:07:03,560 pwyntydd ar y chwith ochr y gweithredydd, 138 00:07:03,560 --> 00:07:06,620 ac yna, ar ôl dereferenced pwyntydd ar y chwith, 139 00:07:06,620 --> 00:07:09,620 mae'n mynedfeydd y cae ar y dde. 140 00:07:09,620 --> 00:07:14,170 Ac felly yn flaenorol oedd gennym y math hwn o seren fy nghar dot holl bethau hyn, 141 00:07:14,170 --> 00:07:15,880 fel yr oedd llawer yn digwydd yno. 142 00:07:15,880 --> 00:07:22,040 Ond beth allwn ni yn lle hynny wneud yw this-- fy mlwyddyn arrow car hafal 2011 ymlaen. 143 00:07:22,040 --> 00:07:23,580 >> Unwaith eto, yr hyn sy'n digwydd yma? 144 00:07:23,580 --> 00:07:25,720 Yn gyntaf, rwy'n dereferencing fy car. 145 00:07:25,720 --> 00:07:27,810 Sydd unwaith eto, yn pwyntydd yma. 146 00:07:27,810 --> 00:07:31,270 Yna, ar ôl cael dereferenced fy car, yr wyf yn 147 00:07:31,270 --> 00:07:35,130 Yna, yn gallu cael mynediad i'r caeau flwyddyn, plât, a odomedr 148 00:07:35,130 --> 00:07:40,020 yn union ag y gallwn cyn cael yn gyntaf seren a ddefnyddir i dereference fy car, 149 00:07:40,020 --> 00:07:42,020 a dot i gael mynediad at y maes. 150 00:07:42,020 --> 00:07:45,290 Felly, gallwch gael strwythurau, i chi gallu cael awgrymiadau i strwythurau, 151 00:07:45,290 --> 00:07:48,360 ac mae gennych ffyrdd o fynediad meysydd strwythurau hynny, 152 00:07:48,360 --> 00:07:52,600 a oes gennych awgrymiadau i nhw neu y newidynnau eu hunain. 153 00:07:52,600 --> 00:07:57,640 Dot neu saeth, yn dibynnu ar sut y newidyn ei ddatgan. 154 00:07:57,640 --> 00:08:00,510 Rwy'n Doug Lloyd, mae hyn yn CS50. 155 00:08:00,510 --> 00:08:01,975