1 00:00:00,000 --> 00:00:02,395 >> [REPRODUCCIÓ DE MÚSICA] 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 Hem treballat amb nombres enters, hem treballat amb personatges, 5 00:00:08,880 --> 00:00:11,930 hem treballat carrosses, dobles, cadenes i bools. 6 00:00:11,930 --> 00:00:14,870 Hem esgotat gairebé tot dels [inaudible] tipus que 7 00:00:14,870 --> 00:00:17,100 han estat a disposició de nosaltres tot el temps. 8 00:00:17,100 --> 00:00:19,430 Però ara volem fer alguna cosa més. 9 00:00:19,430 --> 00:00:20,210 Com ho fem? 10 00:00:20,210 --> 00:00:22,560 Com creem diferents tipus de dades? 11 00:00:22,560 --> 00:00:26,130 Podem fer-ho utilitzant estructures. 12 00:00:26,130 --> 00:00:30,180 Així estructures ens permeten unificar variables de diferents tipus 13 00:00:30,180 --> 00:00:34,810 en una sola, nou tipus de variable, que podem assignar el seu propi nom de tipus. 14 00:00:34,810 --> 00:00:37,570 Aquest és un molt fort cosa és ser capaç de fer, 15 00:00:37,570 --> 00:00:40,900 perquè ara podem grup elements de diferents tipus de dades 16 00:00:40,900 --> 00:00:43,910 junts de tenir una connexió lògica. 17 00:00:43,910 --> 00:00:46,440 Hem estat capaços de fer això amb arranjaments de tipus, no? 18 00:00:46,440 --> 00:00:49,540 Podem agrupar variables del mateix tipus de dades 19 00:00:49,540 --> 00:00:53,410 junts en una unitat gran de la memòria, una matriu. 20 00:00:53,410 --> 00:00:56,660 >> Però no hem estat capaços de barrejar fins a diferents tipus de dades junts. 21 00:00:56,660 --> 00:01:02,610 No podem, per exemple, associar un nombre enter, i un caràcter, i un doble de tot 22 00:01:02,610 --> 00:01:05,330 en el mateix i trucar a que una sola unitat. 23 00:01:05,330 --> 00:01:08,830 Però amb estructures, o a què es refereix amb freqüència com estructures, 24 00:01:08,830 --> 00:01:09,585 que realment pot. 25 00:01:09,585 --> 00:01:12,370 Així que una estructura és una espècie així com una variable de super. 26 00:01:12,370 --> 00:01:16,530 És una variable que conté altres variables dins d'ella. 27 00:01:16,530 --> 00:01:19,650 Així que aquí està un exemple de una estructura molt simple. 28 00:01:19,650 --> 00:01:23,380 Això és el que la sintaxi seria vol crear una estructura per a un cotxe. 29 00:01:23,380 --> 00:01:25,250 Ara, anem a anar a través de la sintaxi aquí. 30 00:01:25,250 --> 00:01:27,400 Struct, aquesta és la paraula clau que indica 31 00:01:27,400 --> 00:01:30,270 que estic creant un nou tipus de dades aquí. 32 00:01:30,270 --> 00:01:33,860 En particular, el nom del tipus de dades és serà un cotxe estructura, com veurem. 33 00:01:33,860 --> 00:01:36,640 Però aquest és el tipus de punta off al compilador que aquesta 34 00:01:36,640 --> 00:01:42,440 com un grup de variables que es va per ser considerat part del mateix tipus 35 00:01:42,440 --> 00:01:44,010 en un minut. 36 00:01:44,010 --> 00:01:46,340 >> Cotxes, només el nom de l'estructura. 37 00:01:46,340 --> 00:01:50,590 Un cop més, el tipus de dades que aquí es va ser acte estructura, no només cotxe. 38 00:01:50,590 --> 00:01:53,060 Però si vostè té diferent-- si crea múltiples estructures 39 00:01:53,060 --> 00:01:56,950 en el mateix programa, cal distingir entre struct i struct. 40 00:01:56,950 --> 00:02:00,140 Així cotxe struct, jo també podria tenir struct estudiant, per exemple, 41 00:02:00,140 --> 00:02:01,790 en el mateix programa. 42 00:02:01,790 --> 00:02:05,980 Dins de les claus són tots els camps anomenats, 43 00:02:05,980 --> 00:02:07,954 o els membres de l'estructura. 44 00:02:07,954 --> 00:02:10,370 Així que quins són algunes de les coses que són inherents en un cotxe? 45 00:02:10,370 --> 00:02:15,270 Bé, en general té un any, ha un nom de model, i una placa de matrícula, 46 00:02:15,270 --> 00:02:18,000 1 odòmetre que en general té cert nombre de milles en ell, 47 00:02:18,000 --> 00:02:19,225 i potser una mida de motor. 48 00:02:19,225 --> 00:02:23,570 I com es pot veure, estic barrejant sencers i caràcters i dobles. 49 00:02:23,570 --> 00:02:26,420 Estan tots van a ser part d'aquest nou tipus de dades. 50 00:02:26,420 --> 00:02:29,750 >> Finalment, l'última cosa que heu de fer, no s'oblidi d'aquest petit punt i coma 51 00:02:29,750 --> 00:02:30,290 al final. 52 00:02:30,290 --> 00:02:34,380 Després que acabem de definir l'estructura, hem de posar un punt i coma al final. 53 00:02:34,380 --> 00:02:37,325 És una sintàctica molt comú error, perquè amb una funció, 54 00:02:37,325 --> 00:02:40,200 per exemple, només tindria clau d'obrir, tancar claudàtor. 55 00:02:40,200 --> 00:02:42,950 No posa un punt i coma al final d'una definició de funció. 56 00:02:42,950 --> 00:02:46,430 Això s'assembla a una funció definició, però no ho és, 57 00:02:46,430 --> 00:02:49,653 i així el punt i coma allà és només un recordatori que vostè 58 00:02:49,653 --> 00:02:52,440 hagi de posar-ho allà, perquè el compilador no ho farà d'una altra manera 59 00:02:52,440 --> 00:02:53,510 saber què fer amb ell. 60 00:02:53,510 --> 00:02:56,160 És un error molt comú fer accidentalment 61 00:02:56,160 --> 00:02:58,570 quan s'està definint en primer lloc les estructures. 62 00:02:58,570 --> 00:02:59,500 >> D'ACORD. 63 00:02:59,500 --> 00:03:02,824 Així que en general definim les nostres estructures a la part superior dels nostres programes 64 00:03:02,824 --> 00:03:05,490 perquè estan probablement va per a ser utilitzat per múltiples funcions. 65 00:03:05,490 --> 00:03:08,850 No volem definir un struct interior d'una funció, 66 00:03:08,850 --> 00:03:12,110 perquè llavors podem only-- la àmbit d'aplicació de l'estructura realment 67 00:03:12,110 --> 00:03:13,790 només existeix dins d'aquesta funció. 68 00:03:13,790 --> 00:03:17,450 Probablement ens agradaria definir una estructura perquè puguem utilitzar-lo en múltiples funcions, 69 00:03:17,450 --> 00:03:20,670 o potser en múltiples els arxius que estan vinculats entre si 70 00:03:20,670 --> 00:03:22,920 per crear el nostre programa únic. 71 00:03:22,920 --> 00:03:24,920 A vegades també lloc de definir l'estructura 72 00:03:24,920 --> 00:03:27,961 a la part superior, on vostè posa el seu lliura inclou i la seva lliura defineix, 73 00:03:27,961 --> 00:03:32,080 per exemple, és possible que els va posar en arxius punt h separades, que després 74 00:03:32,080 --> 00:03:35,020 lliura inclou a tu mateix. 75 00:03:35,020 --> 00:03:37,620 >> Així que tenim estructures, però ara hem d'aconseguir dins d'ells. 76 00:03:37,620 --> 00:03:39,800 Com aconseguim l'interior de una estructura per a l'accés 77 00:03:39,800 --> 00:03:43,530 els sub-variables, les variables que hi ha dins de l'estructura? 78 00:03:43,530 --> 00:03:46,810 Bé, tenim alguna cosa que es diu l'operador punt, el que ens permet 79 00:03:46,810 --> 00:03:50,990 per accedir als camps de l'estructura. 80 00:03:50,990 --> 00:03:55,490 Així, per exemple, diguem que he declarat meves dades de l'estructura de tipus algun lloc 81 00:03:55,490 --> 00:03:59,020 a la part superior del meu programa, o potser en un arxiu de punts h que tinc lliures inclòs. 82 00:03:59,020 --> 00:04:03,360 Doncs si jo vull crear un nou variable d'aquest tipus de dades, puc dir, 83 00:04:03,360 --> 00:04:06,260 struct cotxe, el meu cotxe, punt i coma. 84 00:04:06,260 --> 00:04:11,580 Igual que jo pogués dir int x, o el nom de cadena de punt i coma. 85 00:04:11,580 --> 00:04:18,100 >> El tipus de dades que aquí és struct cotxe, el nom de la variable és el meu cotxe, 86 00:04:18,100 --> 00:04:23,770 i després puc utilitzar l'operador punt per accedir als diversos camps del meu cotxe. 87 00:04:23,770 --> 00:04:27,494 Així que puc dir que el meu cotxe dot any és igual a 2.011. 88 00:04:27,494 --> 00:04:28,410 Això és perfectament bé. 89 00:04:28,410 --> 00:04:34,210 Any, si vostè recorda, es va definir com un camp sencer a l'interior d'aquesta estructura de cotxe 90 00:04:34,210 --> 00:04:35,200 tipus de dades. 91 00:04:35,200 --> 00:04:39,966 Així que qualsevol variable de les dades struct cotxe tipus, com el meu cotxe, puc dir que el meu cotxe 92 00:04:39,966 --> 00:04:44,030 any de punts iguals i després assignar que algun valor sencer de 2011. 93 00:04:44,030 --> 00:04:47,290 El meu plat punt del cotxe és igual CS50. 94 00:04:47,290 --> 00:04:51,180 El meu punt targeta odòmetre és igual a 50.505 punt i coma. 95 00:04:51,180 --> 00:04:53,270 Tots aquests són perfectament bé i això és 96 00:04:53,270 --> 00:04:57,802 com accedim a la camps de l'estructura. 97 00:04:57,802 --> 00:05:00,260 Estructures, però, no cal que es crearà a la pila. 98 00:05:00,260 --> 00:05:02,950 Igual que qualsevol altra variable, que pot assignar dinàmicament ells. 99 00:05:02,950 --> 00:05:06,309 Si tenim un programa que podria estar generant moltes estructures, 100 00:05:06,309 --> 00:05:08,100 no sabem quants necessitarem, 101 00:05:08,100 --> 00:05:10,800 llavors hem de dinàmicament assignar aquestes estructures 102 00:05:10,800 --> 00:05:12,960 com el nostre programa s'està executant. 103 00:05:12,960 --> 00:05:16,600 I pel que si tindrem accés a la camps d'una estructura en aquest context, 104 00:05:16,600 --> 00:05:20,660 recordem que primer hem d'eliminar la referència el punter a l'estructura, 105 00:05:20,660 --> 00:05:24,810 i després una vegada que eliminar la referència al punter, llavors pot accedir als camps. 106 00:05:24,810 --> 00:05:26,830 Si tan sols tenim una Punter a l'estructura, 107 00:05:26,830 --> 00:05:32,120 no podem dir que el camp de punt punter Nom i vam aconseguir el que estem buscant. 108 00:05:32,120 --> 00:05:34,259 Aquí hi ha el pas addicional d'eliminació de referències. 109 00:05:34,259 --> 00:05:36,050 Així que diguem que en lloc de la previous-- 110 00:05:36,050 --> 00:05:38,770 igual que l'exemple anterior, en lloc de declarar que 111 00:05:38,770 --> 00:05:43,680 a la pila, cotxe struct, el meu cotxe, punt i coma, dic struct cotxe, 112 00:05:43,680 --> 00:05:48,020 estrella, un punter a una struct cotxe va cridar al meu cotxe, 113 00:05:48,020 --> 00:05:51,250 és la mateixa mida malloc de struct cotxe. 114 00:05:51,250 --> 00:05:54,950 Mida de anem a esbrinar quants bytes del seu nou tipus de dades ocupa. 115 00:05:54,950 --> 00:05:58,570 No necessàriament només es necessita utilitzar mida, ample, int o char, o qualsevol 116 00:05:58,570 --> 00:05:59,715 dels tipus de dades incorporats. 117 00:05:59,715 --> 00:06:02,090 El compilador és prou intel·ligent per esbrinar quants bytes 118 00:06:02,090 --> 00:06:04,170 són requerits per la seva nova estructura. 119 00:06:04,170 --> 00:06:09,610 Així que malloc mi una unitat de memòria prou gran com per contenir un cotxe struct, 120 00:06:09,610 --> 00:06:12,410 i em dóna un punter cap enrere a aquest bloc de memòria, 121 00:06:12,410 --> 00:06:16,090 i que el punter s'assigna al meu cotxe. 122 00:06:16,090 --> 00:06:18,050 >> Ara, si vull accedir els camps del meu cotxe, 123 00:06:18,050 --> 00:06:22,615 La primera vegada que eliminar la referència del meu cotxe usant l'operador eliminar la referència, estel 124 00:06:22,615 --> 00:06:26,620 que hem vist dels punters vídeos, i després després d'eliminar la referència, 125 00:06:26,620 --> 00:06:32,200 llavors puc utilitzar l'operador punt per accedir als diversos camps del meu cotxe. 126 00:06:32,200 --> 00:06:35,490 Estrella meu cotxe dot any és igual a 2.011. 127 00:06:35,490 --> 00:06:38,480 Això tindria l'efecte volem que en aquest cas, 128 00:06:38,480 --> 00:06:41,960 perquè hem dinàmicament assignat el meu cotxe. 129 00:06:41,960 --> 00:06:43,610 >> Això és una mica molest, però, ¿no? 130 00:06:43,610 --> 00:06:44,818 Hi ha un procés de 2 passos ara. 131 00:06:44,818 --> 00:06:47,460 Ara hem de dereference-- tenim un operador de l'estrella, 132 00:06:47,460 --> 00:06:48,910 i tenim un operador punt. 133 00:06:48,910 --> 00:06:51,660 I com era d'esperar, ja que C programadors estimen camins més curts 134 00:06:51,660 --> 00:06:53,740 de fer les coses, hi ha un camí més curt per fer això. 135 00:06:53,740 --> 00:06:57,790 Hi ha un altre operador anomenat fletxa, el que fa que aquest procés sigui molt més fàcil. 136 00:06:57,790 --> 00:07:00,750 La forma de fletxa funciona és Primer es desreferencias 137 00:07:00,750 --> 00:07:03,560 el punter de l'esquerra costat de l'operador, 138 00:07:03,560 --> 00:07:06,620 i després, després d'haver desreferenciado el punter a l'esquerra, 139 00:07:06,620 --> 00:07:09,620 s'accedeix al camp de la dreta. 140 00:07:09,620 --> 00:07:14,170 I així prèviament teníem aquest tipus de l'estrella del meu cotxe esquitxen tota aquesta matèria, 141 00:07:14,170 --> 00:07:15,880 com havia molt a fer allà. 142 00:07:15,880 --> 00:07:22,040 Però el que en canvi sí que podem fer és esto-- el meu cotxe fletxa any és igual a 2.011. 143 00:07:22,040 --> 00:07:23,580 >> Un cop més, què està passant aquí? 144 00:07:23,580 --> 00:07:25,720 En primer lloc, estic dereferencing meu cotxe. 145 00:07:25,720 --> 00:07:27,810 Que al seu torn, és un punter aquí. 146 00:07:27,810 --> 00:07:31,270 Llavors, després d'haver desreferenciado meu cotxe, 147 00:07:31,270 --> 00:07:35,130 a continuació, pot accedir als camps any, la placa, i el odòmetre 148 00:07:35,130 --> 00:07:40,020 de la mateixa manera que vaig poder abans de tenir primer estrella usada per eliminar la referència del meu cotxe, 149 00:07:40,020 --> 00:07:42,020 i el punt d'accés al camp. 150 00:07:42,020 --> 00:07:45,290 Així que vostè pot tenir estructures, que pot tenir punters a estructures, 151 00:07:45,290 --> 00:07:48,360 i vostè té maneres d'accedir els camps d'aquestes estructures, 152 00:07:48,360 --> 00:07:52,600 si vostè té punters a ells o les pròpies variables. 153 00:07:52,600 --> 00:07:57,640 Dot o fletxa, depenent de com es va declarar la variable. 154 00:07:57,640 --> 00:08:00,510 Sóc Doug Lloyd, això és CS50. 155 00:08:00,510 --> 00:08:01,975