1 00:00:00,000 --> 00:00:03,395 >> [RIPRODUZIONE DI BRANI MUSICALI] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: Questo è come un seminario matricola oggi. 4 00:00:13,280 --> 00:00:14,060 OK. 5 00:00:14,060 --> 00:00:15,024 Quindi molto piovoso fuori. 6 00:00:15,024 --> 00:00:17,690 Ciò tende ad accadere il mercoledì, ma ancor più opportunità 7 00:00:17,690 --> 00:00:18,700 per le domande di oggi. 8 00:00:18,700 --> 00:00:22,210 Quindi cerchiamo di cominciare realmente con il film in un momento. 9 00:00:22,210 --> 00:00:24,560 Ma inizieremo grandiosamente come sempre. 10 00:00:24,560 --> 00:00:28,000 >> Questo è CS50, e questo è la fine della settimana 4. 11 00:00:28,000 --> 00:00:30,820 Quindi, se avete mai visto La TV o un film in cui 12 00:00:30,820 --> 00:00:34,690 ci sono alcuni esperti di computer e la polizia, o FBI, o qualche agenzia 13 00:00:34,690 --> 00:00:36,930 sta cercando di recuperare un po ' avversario, beh, hai 14 00:00:36,930 --> 00:00:40,850 probabilmente sentito l'espressione "migliorare" per cui in qualche modo che tecnico 15 00:00:40,850 --> 00:00:44,750 zoom magicamente in infinitamente per vedere i criminali 16 00:00:44,750 --> 00:00:48,640 identità o il numero di targa in anche il luccichio di uno specchio 17 00:00:48,640 --> 00:00:50,390 o il luccichio degli occhi di qualcuno. 18 00:00:50,390 --> 00:00:55,196 Così infatti, diamo uno sguardo a alcune di queste scene di Hollywood. 19 00:00:55,196 --> 00:00:55,862 [RIPRODUZIONE VIDEO] 20 00:00:55,862 --> 00:00:59,243 -OK, Ora andiamo una buona occhiata a voi. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -hold Esso. 23 00:01:07,415 --> 00:01:08,267 Eseguire che indietro. 24 00:01:08,267 --> 00:01:09,121 >> -Apetta un minuto. 25 00:01:09,121 --> 00:01:11,300 Vai a destra. 26 00:01:11,300 --> 00:01:12,209 >> -Ci, Bloccare quello. 27 00:01:12,209 --> 00:01:12,750 -A schermo intero. 28 00:01:12,750 --> 00:01:13,558 -OK, Bloccare quello. 29 00:01:13,558 --> 00:01:14,820 Stringere più su quella, vero? 30 00:01:14,820 --> 00:01:16,530 -vector In su quella tipo per la ruota posteriore. 31 00:01:16,530 --> 00:01:19,400 -zoom In proprio qui, in questo punto. 32 00:01:19,400 --> 00:01:22,846 -Con La giusta attrezzatura, l'immagine potrebbe essere ampliato e affilato. 33 00:01:22,846 --> 00:01:24,065 -Che cos'è? 34 00:01:24,065 --> 00:01:25,600 -E 'Un programma di miglioramento. 35 00:01:25,600 --> 00:01:26,860 -Puoi Chiaro che qualsiasi? 36 00:01:26,860 --> 00:01:27,890 -Non lo so. 37 00:01:27,890 --> 00:01:29,050 Cerchiamo di valorizzarlo. 38 00:01:29,050 --> 00:01:31,575 >> Sezione A6 -e la valorizzazione. 39 00:01:31,575 --> 00:01:33,642 >> -I Migliorato dettaglio, e- Penso che ci sia 40 00:01:33,642 --> 00:01:35,433 abbastanza per migliorare, rilasciarlo al mio schermo. 41 00:01:35,433 --> 00:01:37,080 -I Migliorato la riflessione nel suo occhio. 42 00:01:37,080 --> 00:01:38,830 >> -Let Run questo attraverso miglioramento video. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Si può migliorare questo? 44 00:01:40,100 --> 00:01:41,875 >> -Aspetta. 45 00:01:41,875 --> 00:01:44,010 >> -Ho Lavorato su questa riflessione. 46 00:01:44,010 --> 00:01:44,995 >> La riflessione di -Qualcuno. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -C'è Un riflesso del volto dell'uomo. 49 00:01:47,399 --> 00:01:48,065 -La Riflessione. 50 00:01:48,065 --> 00:01:48,981 -C'è Una riflessione. 51 00:01:48,981 --> 00:01:50,600 -zoom In sullo specchio. 52 00:01:50,600 --> 00:01:52,712 -Si Può vedere un riflesso. 53 00:01:52,712 --> 00:01:54,350 -Can A migliorare l'immagine da qui? 54 00:01:54,350 --> 00:01:55,370 -Puoi Lo migliorare proprio qui? 55 00:01:55,370 --> 00:01:56,210 -Può A migliorare esso? 56 00:01:56,210 --> 00:01:56,900 Riesci a valorizzarlo? 57 00:01:56,900 --> 00:01:57,870 >> -Può Potenziamo questo? 58 00:01:57,870 --> 00:01:58,717 >> -Può A migliorare esso? 59 00:01:58,717 --> 00:02:00,050 -hold Su un secondo, io miglioro. 60 00:02:00,050 --> 00:02:00,924 -zoom In sulla porta. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -zoom. 63 00:02:02,586 --> 00:02:03,490 -Muovi In. 64 00:02:03,490 --> 00:02:03,990 -Di più. 65 00:02:03,990 --> 00:02:04,690 Aspetta, stop. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Esso. 68 00:02:05,970 --> 00:02:09,460 Noi -rotate 75 gradi attorno alla verticale, per favore. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Torna alla parte sulla porta, di nuovo. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un potenziatore immagine che può bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Ehi, forse possiamo usare il Pradeep Metodo Sen per vedere le vetrine. 73 00:02:18,776 --> 00:02:20,372 Software -Questo è lo stato dell'arte. 74 00:02:20,372 --> 00:02:21,845 >> -Il Autovalore è spento. 75 00:02:21,845 --> 00:02:24,300 >> -Con Il diritto combinazione di algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Preso eliminazione di -Ha algoritmi al livello successivo, 77 00:02:26,755 --> 00:02:28,730 e io li posso usare per migliorare questa fotografia. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Su e ingrandire l'asse z. 79 00:02:31,286 --> 00:02:32,560 >> -e La valorizzazione. 80 00:02:32,560 --> 00:02:33,100 >> -e La valorizzazione. 81 00:02:33,100 --> 00:02:33,600 >> -e La valorizzazione. 82 00:02:33,600 --> 00:02:34,960 FROSTMATIC e valorizzare. 83 00:02:34,960 --> 00:02:37,180 >> [FINE RIPRODUZIONE] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Va bene, allora Tutti questi sono in realtà parole. 85 00:02:41,160 --> 00:02:44,450 Stanno solo legate insieme in un modo che non è in realtà sensibile. 86 00:02:44,450 --> 00:02:48,400 E, infatti, CS50 e corsi piace tende a rovinare un sacco di TV e film 87 00:02:48,400 --> 00:02:48,900 per te. 88 00:02:48,900 --> 00:02:52,330 Perché quando questi esperti di computer sono snocciolare termini e dicendo 89 00:02:52,330 --> 00:02:56,860 cose di fantasia come autovettori e l'asse z, 90 00:02:56,860 --> 00:02:59,572 e qualsiasi numero di altri in realtà termini più tecnici, 91 00:02:59,572 --> 00:03:02,030 stanno in realtà solo la tesatura insieme le parole troppo spesso. 92 00:03:02,030 --> 00:03:05,020 È che una delle nostre speranze è che, come effetto collaterale di corsi taking 93 00:03:05,020 --> 00:03:08,245 come questo, saranno più persone nel mondo effettivamente in grado di pesare in 94 00:03:08,245 --> 00:03:12,040 e appena sempre leggermente influenzare la qualità e la precisione di questi film? 95 00:03:12,040 --> 00:03:14,350 >> In realtà, diamo uno sguardo sulla realtà. 96 00:03:14,350 --> 00:03:18,070 Così qui è la foto di personale Mary, uno dei nostri compagni di insegnamento. 97 00:03:18,070 --> 00:03:20,050 E supponiamo che lei è sospettato di qualcosa. 98 00:03:20,050 --> 00:03:23,730 Eppure, c'è un barlume di qualche pezzo di prova in suo occhio, 99 00:03:23,730 --> 00:03:25,480 o nel riflesso dei suoi occhiali. 100 00:03:25,480 --> 00:03:30,760 Beh, se facciamo esattamente come i film proporre, in cui abbiamo ZOOM e "miglioriamo", 101 00:03:30,760 --> 00:03:34,080 questo è quanto informazioni è sul volto di Maria 102 00:03:34,080 --> 00:03:36,795 quando si cattura un'immagine con quella risoluzione originale. 103 00:03:36,795 --> 00:03:39,120 >> E, infatti, è possibile vedere questi punti. 104 00:03:39,120 --> 00:03:41,900 E questi sono quelli che sono chiamati pixel, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 che è solo una piazza tipicamente che è un punto che compone un'immagine. 106 00:03:45,740 --> 00:03:49,200 E nel giorno, e in realtà anche oggi con un po 'di TV LED di oggi 107 00:03:49,200 --> 00:03:51,950 o TV LCD, se devi uno nella vostra camera o in casa, 108 00:03:51,950 --> 00:03:55,100 se si va fino super vicino ad esso, e soprattutto se si tratta di un televisore po 'più vecchio, 109 00:03:55,100 --> 00:03:58,760 probabilmente si può anche vedere questi punti ed è quello che compongono un'immagine. 110 00:03:58,760 --> 00:04:00,980 >> E non c'è più Informazioni di questo. 111 00:04:00,980 --> 00:04:05,400 Potremmo "migliorare", nel senso di lisciando le cose e una sorta di 112 00:04:05,400 --> 00:04:09,040 inferire tipo di, una sorta di cosa colore deve essere il prossimo a occhio di Maria 113 00:04:09,040 --> 00:04:10,910 in modo che in realtà non è così pixel. 114 00:04:10,910 --> 00:04:14,510 Ma se continuo zoom in, ci è il cattivo nel suo occhio. 115 00:04:14,510 --> 00:04:16,600 Come quella è tanto informazioni che abbiamo. 116 00:04:16,600 --> 00:04:18,920 Non è possibile creare Informazioni dal nulla. 117 00:04:18,920 --> 00:04:20,790 C'è solo un insieme finito numero di bit lì. 118 00:04:20,790 --> 00:04:22,873 >> Quindi, in Set Problema 4, dove si ha l'opportunità 119 00:04:22,873 --> 00:04:24,580 giocare con questo tipo di mondo. 120 00:04:24,580 --> 00:04:27,610 Nel Problema Set 4, potrai esplorare il mondo della grafica, e forense, 121 00:04:27,610 --> 00:04:30,870 ed effettivamente scrivere codice che recupera le immagini perse. 122 00:04:30,870 --> 00:04:33,510 Potrai scrivere codice che manipola immagini esistenti 123 00:04:33,510 --> 00:04:36,120 e, infine, capire cosa c'è succedendo sotto il cofano. 124 00:04:36,120 --> 00:04:38,540 >> E, si scopre, è in realtà Non poi così complicato. 125 00:04:38,540 --> 00:04:41,320 Ad esempio, se volessimo rappresentare una faccina sorridente dove 126 00:04:41,320 --> 00:04:44,160 con questi pixel neri, o questi puntini neri, 127 00:04:44,160 --> 00:04:47,230 beh, potremmo semplicemente rappresentare come un vero e bitmap. 128 00:04:47,230 --> 00:04:50,040 E se tu avessi mai sentito dire che espressione bitmap, forse 129 00:04:50,040 --> 00:04:52,330 ora inizia a fare un poco più senso oggi. 130 00:04:52,330 --> 00:04:53,580 >> Sappiamo già quello che un po 'è. 131 00:04:53,580 --> 00:04:54,160 È 0 o 1. 132 00:04:54,160 --> 00:04:56,201 E una mappa è solo qualcosa come un pezzo di carta 133 00:04:56,201 --> 00:04:59,180 che ti dà le indicazioni e ha forse una griglia di xey coordinate. 134 00:04:59,180 --> 00:05:00,540 Così qui è una bitmap. 135 00:05:00,540 --> 00:05:03,680 Si tratta di una mappa di bit per cui un 1 è apparentemente 136 00:05:03,680 --> 00:05:07,857 andando a rappresentare un pixel bianco, e 0 sta per rappresentare un pixel nero. 137 00:05:07,857 --> 00:05:09,440 Ma potremmo certamente girare intorno. 138 00:05:09,440 --> 00:05:11,648 Realmente non importa così Finché siamo coerenti. 139 00:05:11,648 --> 00:05:15,570 Ed ecco come, in binary-- dentro di memoria di un computer, o addirittura all'interno 140 00:05:15,570 --> 00:05:18,160 di un file sul disco drive-- è possibile memorizzare 141 00:05:18,160 --> 00:05:20,240 la più semplice delle immagini dei volti sorridenti. 142 00:05:20,240 --> 00:05:23,990 Ma cosa siamo, naturalmente, privo di questa immagine? 143 00:05:23,990 --> 00:05:24,610 Colore, giusto? 144 00:05:24,610 --> 00:05:28,220 Si tratta di un evidente passo successivo o potenziamento per migliorare questo con il colore. 145 00:05:28,220 --> 00:05:32,230 Così, purtroppo, con un solo bit, 0 o 1, si potrebbe rappresentare il colore. 146 00:05:32,230 --> 00:05:36,100 Questo potrebbe essere rosso o blu, o nero, o bianco o verde, o rosa, 147 00:05:36,100 --> 00:05:37,420 o qualsiasi coppie di colori. 148 00:05:37,420 --> 00:05:40,860 Ma per semplicità, faremo basta assumere in bianco e nero. 149 00:05:40,860 --> 00:05:45,930 >> Allora cosa logicamente abbiamo bisogno se vogliamo desidera implementare colore in un'immagine? 150 00:05:45,930 --> 00:05:49,080 Cosa dobbiamo fare? 151 00:05:49,080 --> 00:05:51,900 Come se il fattore limitante qui è che con un po 'solamente possibile 152 00:05:51,900 --> 00:05:55,977 rappresentano due stati, 0 o 1, bianco o nero, che cosa vuoi fare? 153 00:05:55,977 --> 00:05:56,810 Pubblico: più dati. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: più bit, Si 'più dati, più bit. 155 00:05:58,813 --> 00:06:01,440 E, in effetti, che è esattamente come immagini a colori sono rappresentati. 156 00:06:01,440 --> 00:06:05,120 Invece di utilizzare un singolo bit, un 0 o 1 per ogni pixel, ciascun punto, 157 00:06:05,120 --> 00:06:06,170 è sufficiente utilizzare multipla. 158 00:06:06,170 --> 00:06:09,660 Forse utilizzare 8, forse, più comunemente utilizzare 24, e anzi, in Problem Set 159 00:06:09,660 --> 00:06:13,300 4, vuoi giocare con un file formato che utilizza 24 bit genere. 160 00:06:13,300 --> 00:06:15,430 >> Ma la maggior parte di voi sono probabilmente familiarità con file JPEG. 161 00:06:15,430 --> 00:06:17,460 Se hai mai preso una foto sul tuo telefono, 162 00:06:17,460 --> 00:06:20,360 o caricati o visto qualcosa su Facebook, o Flickr, un numero qualsiasi 163 00:06:20,360 --> 00:06:24,882 di siti web foto-based, hai probabilmente visto un'immagine JPEG prima. 164 00:06:24,882 --> 00:06:27,840 E si scopre, questo è il file formato stiamo andando a utilizzare in PSet 4, 165 00:06:27,840 --> 00:06:30,340 per cui si sta andando a devono recuperare le immagini 166 00:06:30,340 --> 00:06:35,160 che ho cancellato accidentalmente da un scheda di memoria corrotta nella fotocamera, 167 00:06:35,160 --> 00:06:35,800 se vuoi. 168 00:06:35,800 --> 00:06:38,490 >> E si scopre che anche se JPEG è piuttosto sophisticated-- 169 00:06:38,490 --> 00:06:40,906 è molto più sofisticato che i punti bianchi e neri 170 00:06:40,906 --> 00:06:44,480 abbiamo visto un momento fa, perché non c'è algoritmi realtà di fantasia che 171 00:06:44,480 --> 00:06:47,410 sono utilizzati per comprimere un JPEG, così che si può avere una bella, 172 00:06:47,410 --> 00:06:49,832 qualità delle immagini ma utilizzando relativamente pochi bit. 173 00:06:49,832 --> 00:06:51,790 E torneremo a compressione in breve tempo. 174 00:06:51,790 --> 00:06:56,280 Risulta che la prima tre byte in un image-- JPEG 175 00:06:56,280 --> 00:07:02,750 non importa quello che hai preso una fotografia di-- sono i valori 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> In altre parole, se si vedere che modello di bit, 177 00:07:05,990 --> 00:07:09,180 qui rappresentato come tre byte o 24 bit Totale, 178 00:07:09,180 --> 00:07:13,810 con alta probabilità si può dedurre che si sta guardando in questo primi tre 179 00:07:13,810 --> 00:07:15,230 byte di un JPEG. 180 00:07:15,230 --> 00:07:18,040 E questo è ciò che è noto la firma di un JPEG. 181 00:07:18,040 --> 00:07:20,540 Un sacco di formati di file fuori ci tendono ad iniziare 182 00:07:20,540 --> 00:07:23,735 con certi modelli di 0 e 1, in modo che Windows e Mac OS, e iOS, 183 00:07:23,735 --> 00:07:28,272 e Android sa che tipo di file che sono, oltre al cosiddetto lima 184 00:07:28,272 --> 00:07:29,730 estensione che un sacco di file hanno. 185 00:07:29,730 --> 00:07:32,590 Se avete .jpg, che è un altro indizio al computer. 186 00:07:32,590 --> 00:07:35,310 >> Quindi cerchiamo di guardare a questo ora un po 'più tecnicamente. 187 00:07:35,310 --> 00:07:37,390 Sappiamo che il decimale sistema è da 0 a 9. 188 00:07:37,390 --> 00:07:38,740 Sappiamo binario è 0 e 1. 189 00:07:38,740 --> 00:07:41,842 E se si ripensa a PSet 0, abbiamo avuto voi lottare con, 190 00:07:41,842 --> 00:07:43,800 per un po ', qualcosa chiamato esadecimale, 191 00:07:43,800 --> 00:07:47,320 dove si hanno 16 cifre, invece di 10 o invece di 2. 192 00:07:47,320 --> 00:07:50,405 E queste cifre, per convenzione, sono da 0 a 9 e poi un 193 00:07:50,405 --> 00:07:55,040 attraverso f, dove f rappresenta quello numero decimale, proprio come un rapido sanità mentale 194 00:07:55,040 --> 00:07:56,640 controllare? 195 00:07:56,640 --> 00:07:57,610 Quindi, 15. 196 00:07:57,610 --> 00:08:01,390 E un must rappresentare 10, semplicemente la natura di ordinamento che ho dato. 197 00:08:01,390 --> 00:08:04,350 E 'solo una convenzione arbitraria, ma è abbastanza standard. 198 00:08:04,350 --> 00:08:06,870 >> Quindi, se guardiamo a questo modello di tre bytes-- facciamo 199 00:08:06,870 --> 00:08:09,620 basta iniziare a guardare in un modo coerente con quanto 200 00:08:09,620 --> 00:08:12,450 gli informatici in generale guardare e riflettere sui file. 201 00:08:12,450 --> 00:08:15,580 Si può certamente pensare file in 0s e 1s, e decimali, 202 00:08:15,580 --> 00:08:19,340 ma in realtà, tendiamo ad usare binario o più tipicamente hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 indietro da PSet 0. 204 00:08:20,760 --> 00:08:25,857 Permettetemi quindi di propongo 255, 216, e 255 sono proprio questi modelli di 0 e 1. 205 00:08:25,857 --> 00:08:28,440 E si può controllare questo se si vogliono fare la matematica dalla settimana 0. 206 00:08:28,440 --> 00:08:30,810 Ma, per ora, dare per scontato che questo è effettivamente corretto. 207 00:08:30,810 --> 00:08:33,850 Ho appena riscritto tre decimali numeri come tre valori binari. 208 00:08:33,850 --> 00:08:36,100 Ora che cosa ho intenzione di fare è basta aggiungere un po 'di spazio bianco, 209 00:08:36,100 --> 00:08:37,266 solo per amor di leggibilità. 210 00:08:37,266 --> 00:08:39,940 E notate, sto solo andando per spostare le cose a parte. 211 00:08:39,940 --> 00:08:43,090 Quindi, prima, dopo, prima, dopo. 212 00:08:43,090 --> 00:08:46,180 Sto facendo niente di interessante altro che solo diffondendo le cose così 213 00:08:46,180 --> 00:08:50,380 tale avviso ogni serie di otto bit è ora due serie di quattro bit. 214 00:08:50,380 --> 00:08:54,920 Questo è utile perché esadecimale è particolarmente di moda 215 00:08:54,920 --> 00:09:00,930 perché ogni cifra esadecimale da 0 a f, o più specificamente da 0 a 15, 216 00:09:00,930 --> 00:09:03,430 può essere rappresentato esattamente con quattro punte. 217 00:09:03,430 --> 00:09:07,960 In altre parole, se in esadecimale vuole rappresentare uno 0, è solo 0000, 218 00:09:07,960 --> 00:09:08,780 quattro zeri. 219 00:09:08,780 --> 00:09:13,997 E se si vuole rappresentare 15, è 1111, che è quattro bit. 220 00:09:13,997 --> 00:09:16,080 E se fate i conti, se questo è il posto quelle, 221 00:09:16,080 --> 00:09:18,210 questo è il posto 16s, che sta per dare you-- 222 00:09:18,210 --> 00:09:19,960 piuttosto che sta andando a-- dispiace, in binario, 223 00:09:19,960 --> 00:09:23,660 che sta per darvi 15, quelli posto, twos posto, a quattro zampe e otto posto. 224 00:09:23,660 --> 00:09:26,821 Permettetemi quindi di propongo che set di quattro bit a sinistra 225 00:09:26,821 --> 00:09:28,070 è quello che stiamo andando a chiamare f. 226 00:09:28,070 --> 00:09:30,110 È il più grande numero può rappresentare con quattro bit. 227 00:09:30,110 --> 00:09:33,300 E sappiamo già da esadecimale, f è il più grande cifra esadecimale. 228 00:09:33,300 --> 00:09:36,020 Abbiamo un altro f lì, altri due laggiù. 229 00:09:36,020 --> 00:09:38,980 E per ora, basta prendere sulla fede che ho fatto il diritto di matematica 230 00:09:38,980 --> 00:09:41,890 e che la metà sinistra di quei bit, 1101, 231 00:09:41,890 --> 00:09:43,980 è la stessa cosa come d in esadecimale. 232 00:09:43,980 --> 00:09:46,490 E la mano destra, 1000, è a soli 8. 233 00:09:46,490 --> 00:09:48,140 >> E questo è uno facile da vedere, giusto? 234 00:09:48,140 --> 00:09:51,670 L'8 represents-- è giusto sotto quel luogo otto. 235 00:09:51,670 --> 00:09:56,040 Così ne abbiamo una in colonna otto e nulla nelle fours, gruppi di due o quelli. 236 00:09:56,040 --> 00:09:59,830 Così ora più convenzionale, gli esseri umani tendono di scrivere cifre esadecimali come questo, 237 00:09:59,830 --> 00:10:03,000 appena li squish insieme, e poi li prefisso 0x. 238 00:10:03,000 --> 00:10:05,920 Significa altro che un indizio visivo per un human-- 239 00:10:05,920 --> 00:10:10,350 ecco che arriva un value-- esadecimale perché non potrebbe essere altrimenti evidente. 240 00:10:10,350 --> 00:10:13,629 >> Vale a dire, in ultima analisi, che il modello di zero e uno, 241 00:10:13,629 --> 00:10:16,170 o il modello di esadecimale cifre equivalentemente che sei 242 00:10:16,170 --> 00:10:18,990 sta per iniziare la ricerca di nel problema Set 4 è questo-- 243 00:10:18,990 --> 00:10:22,120 e il problema Set 4 spec camminerà attraverso questo in più detail-- 244 00:10:22,120 --> 00:10:25,344 ma rendersi conto come una sorta di arcana come questo potrebbe sembrare a prima vista, 245 00:10:25,344 --> 00:10:27,010 hai intenzione di cominciare a vedere questo molto. 246 00:10:27,010 --> 00:10:30,320 Ed infatti, anche in GDB, la debugger abbiamo introdotto il Lunedi 247 00:10:30,320 --> 00:10:35,440 e Dan introduce in PSet 3, sta andando per mostrare spesso valori esadecimali 248 00:10:35,440 --> 00:10:39,910 solo perché tendono ad essere più convenzionale rispetto decimale o binario 249 00:10:39,910 --> 00:10:41,157 nel mondo dei computer. 250 00:10:41,157 --> 00:10:42,490 Ora mettiamo questo in contesto. 251 00:10:42,490 --> 00:10:48,040 Molti di voi potrebbe ricordare questo immaginare qui, che è venuto da che cosa? 252 00:10:48,040 --> 00:10:51,240 Vista, quindi, anche prima di quanto che, Windows XP ha fatto questo debutto. 253 00:10:51,240 --> 00:10:52,620 Quindi questo è un bel paesaggio. 254 00:10:52,620 --> 00:10:55,940 E infatti, se si frugare online-- Penso che sia un articolo di Wikipedia, 255 00:10:55,940 --> 00:11:00,110 in cui qualcuno molto sorprendentemente uscì ha trovato questa posizione nel mondo istituito 256 00:11:00,110 --> 00:11:02,240 sua telecamera precisamente il posto-- destra 257 00:11:02,240 --> 00:11:06,510 e questo oggi guarda like-- ma è esattamente la stessa impostazione. 258 00:11:06,510 --> 00:11:10,060 Questa immagine, però, è in un file formato chiamato bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 E stiamo andando a prendere un super rapida occhiata a cosa significa. 260 00:11:12,910 --> 00:11:17,770 >> Ma bitmap è solo un modo diverso di immagini che rappresentano ancora utilizzando pixel 261 00:11:17,770 --> 00:11:19,580 a 0 e 1, in ultima analisi. 262 00:11:19,580 --> 00:11:23,282 Ma a colpo d'occhio, ha una firma più interessante 263 00:11:23,282 --> 00:11:24,490 all'inizio del file. 264 00:11:24,490 --> 00:11:26,670 Non si tratta solo di tre byte, piuttosto c'è 265 00:11:26,670 --> 00:11:30,770 un sacco di modelli di byte che hanno determinato significato. 266 00:11:30,770 --> 00:11:34,490 Ad esempio, da qualche parte nel primi byte di un'immagine bitmap 267 00:11:34,490 --> 00:11:37,440 sta per essere la dimensione del immagine, la larghezza dell'immagine, 268 00:11:37,440 --> 00:11:40,390 l'altezza dell'immagine, in modo metadati utili, se si vuole. 269 00:11:40,390 --> 00:11:43,940 Informazioni utili che Photoshop o qualsiasi programma di grafica che si sta utilizzando 270 00:11:43,940 --> 00:11:45,180 potrebbe effettivamente preoccuparsi. 271 00:11:45,180 --> 00:11:47,170 >> Quindi più su questo in Problema Set 4, ma questo 272 00:11:47,170 --> 00:11:49,220 è solo per dire che alla fine del giorno 273 00:11:49,220 --> 00:11:52,390 tutti i formati di file che avete utilizzato per anni-- file di Microsoft Word, 274 00:11:52,390 --> 00:11:55,820 Numeri, file Excel, qualsiasi numero di formati di file 275 00:11:55,820 --> 00:11:57,770 che potrebbe avere un po ' estensione di file conosciuti 276 00:11:57,770 --> 00:12:00,130 sono solo 0 e 1 sotto il cofano. 277 00:12:00,130 --> 00:12:02,970 E gli esseri umani hanno deciso quali le convenzioni sono, 278 00:12:02,970 --> 00:12:08,340 quali modelli di 0 e 1 rappresentano un file di Word rispetto a un file di Excel, 279 00:12:08,340 --> 00:12:10,322 rispetto a qualsiasi numero di altri formati di file. 280 00:12:10,322 --> 00:12:12,780 Quindi, in PSet 4, avrai un opportunità di giocare con quella. 281 00:12:12,780 --> 00:12:14,405 >> Ma che cosa vuol dire avere una struct. 282 00:12:14,405 --> 00:12:18,012 Questo è in realtà un bel segue ora in C, che ha solo un paio 283 00:12:18,012 --> 00:12:20,220 caratteristiche aggiuntive che di non abbiamo guardato ancora. 284 00:12:20,220 --> 00:12:24,230 Si tratta di un grazioso piccolo linguaggio e uno dei le caratteristiche belle di C è una struct. 285 00:12:24,230 --> 00:12:27,300 Ad esempio, se si voluto represent-- facciamo 286 00:12:27,300 --> 00:12:33,690 dici che voleva avere una variabile che rappresenta uno studente in qualche programma. 287 00:12:33,690 --> 00:12:37,330 Forse stavi scrivendo un corso programma di registrazione, o nucleo di shopping 288 00:12:37,330 --> 00:12:38,870 strumento, o qualcosa del genere. 289 00:12:38,870 --> 00:12:42,922 Quali sono pezzi di dati correlati ad uno studente che vengono in mente? 290 00:12:42,922 --> 00:12:44,880 Come uno studente è rappresentato con quali valori? 291 00:12:44,880 --> 00:12:45,732 Sì? 292 00:12:45,732 --> 00:12:46,940 Si dispone di un nome come studente. 293 00:12:46,940 --> 00:12:48,900 Che altro fa un tipico studente ha? 294 00:12:48,900 --> 00:12:49,320 >> PUBBLICO: [incomprensibile] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Quindi, mi dispiace. 296 00:12:50,200 --> 00:12:50,660 >> PUBBLICO: Età. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: An età o compleanno equivalentemente, sì. 298 00:12:52,980 --> 00:12:53,557 Cos'altro? 299 00:12:53,557 --> 00:12:54,390 PUBBLICO: numero di identificazione? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Quindi un numero ID, forse un numero di telefono, forse un dormitorio, o casa, 301 00:12:57,460 --> 00:12:58,670 o college, o qualcosa del genere. 302 00:12:58,670 --> 00:13:01,820 Qualsiasi numero di pezzi di dati che si potrebbe avere nel tuo elenco di contatti 303 00:13:01,820 --> 00:13:03,890 è quello che potremmo definire uno studente. 304 00:13:03,890 --> 00:13:08,490 Quindi, se volessimo fare questo, in codice, potremmo fare qualcosa di semplice come questo. 305 00:13:08,490 --> 00:13:15,670 Potremmo avere un programma in modo che ha diciamo, int main (void). 306 00:13:15,670 --> 00:13:18,920 E se voglio rappresentare un studente Potrei avere, per esempio, 307 00:13:18,920 --> 00:13:24,330 una stringa chiamata nome per quello studente, una stringa chiamata dormitorio per quello studente, 308 00:13:24,330 --> 00:13:26,900 forse un int chiamato ID per quello studente. 309 00:13:26,900 --> 00:13:30,840 E perché sto utilizzando corda, io bisogno di tornare indietro e mettere CS50.h. 310 00:13:30,840 --> 00:13:33,300 Forse sto andando ad avere bisogno stdio.h. 311 00:13:33,300 --> 00:13:38,190 Così mi permetta di fare preventivamente quelli e sono andando a chiamare questo student.c per ora 312 00:13:38,190 --> 00:13:40,080 e salvare questo. 313 00:13:40,080 --> 00:13:44,206 >> E ora posso fare qualcosa con queste variabili. 314 00:13:44,206 --> 00:13:46,830 E stiamo solo andando a scrivere che come un commento in pseudo codice, 315 00:13:46,830 --> 00:13:48,829 perché non è interessante ciò che facciamo per ora. 316 00:13:48,829 --> 00:13:51,242 OK, quindi questo è un programma che in qualche modo memorizza uno studente. 317 00:13:51,242 --> 00:13:53,450 Quello che voglio fare se desidera memorizzare due studenti? 318 00:13:53,450 --> 00:13:55,991 Quindi il mio primo istinto è andare tutto bene, aspetta un minuto, 319 00:13:55,991 --> 00:14:01,920 se ho un altro studente perché non ho basta fare nome corda 2, corda dormitorio 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 E abbiamo fatto andato su questa strada prima 322 00:14:06,540 --> 00:14:10,890 e ciò che era la nostra soluzione a quello che sembra per essere una specie di copia incolla hackish 323 00:14:10,890 --> 00:14:11,555 lavoro qui? 324 00:14:11,555 --> 00:14:12,346 PUBBLICO: Un array. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Sì, si potrebbe utilizzare un array. 326 00:14:13,830 --> 00:14:15,620 Proprio in questo molto rapidamente diventa ingombrante. 327 00:14:15,620 --> 00:14:18,453 Dovete ordinare arbitrariamente iniziare a nominare tutte queste variabili. 328 00:14:18,453 --> 00:14:22,190 E tu, l'umano, tenere traccia che corrisponde OK NAME2 329 00:14:22,190 --> 00:14:25,060 con dorm2 corrisponde con id2. 330 00:14:25,060 --> 00:14:26,200 E 'appena diventa un pasticcio. 331 00:14:26,200 --> 00:14:29,350 Quindi è molto più facile, recuperare da un paio di settimane fa, 332 00:14:29,350 --> 00:14:34,300 a solo dover chiamati nomi di stringa e forse ci danno tre di questi. 333 00:14:34,300 --> 00:14:36,940 E allora forse abbiamo dormitori archi e avere 334 00:14:36,940 --> 00:14:41,900 tre di questi, o con una costante, int id e avere tre di questi. 335 00:14:41,900 --> 00:14:45,250 Ma anche ora questo si sente un po 'sciatto, a destra. 336 00:14:45,250 --> 00:14:49,440 Stiamo parlando di studenti e ancora Sono davvero dimora sul basso livello 337 00:14:49,440 --> 00:14:50,470 dettagli di implementazione. 338 00:14:50,470 --> 00:14:52,790 Lo studente è un nome e un dormitorio e ID. 339 00:14:52,790 --> 00:14:59,814 >> Perché non posso solo dichiarare una variabile chiamato studente e lo chiamano s. 340 00:14:59,814 --> 00:15:02,230 E se voglio un altro studente, perchè non solo chiamo t. 341 00:15:02,230 --> 00:15:05,260 O se voglio un sacco degli studenti, perché non faccio solo 342 00:15:05,260 --> 00:15:09,740 dire che ho un'intera classe di studenti e sono le tre di loro. 343 00:15:09,740 --> 00:15:12,470 In altre parole, perché non posso venire con il mio tipo di dati, chiamato 344 00:15:12,470 --> 00:15:15,641 Gli studenti, all'interno del quale è un nome, è un ID, è un dormitorio, 345 00:15:15,641 --> 00:15:16,890 è un qualsiasi numero di altri campi. 346 00:15:16,890 --> 00:15:19,030 E si scopre che può fare esattamente questo. 347 00:15:19,030 --> 00:15:21,850 >> Così C ha questa funzionalità chiamata struct. 348 00:15:21,850 --> 00:15:24,700 Questa è una caratteristica del linguaggio che ci permette di fare esattamente questo. 349 00:15:24,700 --> 00:15:28,370 Ho intenzione di andare avanti e di aprire structs.h 350 00:15:28,370 --> 00:15:32,299 dove stiamo andando a vedere la seguente definizione di uno studente. 351 00:15:32,299 --> 00:15:35,215 Si scopre - e questo è ancora semplice di quello che comporta un ID 352 00:15:35,215 --> 00:15:36,080 un attimo fa. 353 00:15:36,080 --> 00:15:39,120 Se vuoi venire con il tipo di dati di fatto in casa, 354 00:15:39,120 --> 00:15:42,750 e in aggiunta a int e char e float e tutti questi altri che esistono, 355 00:15:42,750 --> 00:15:45,810 è possibile farlo letteralmente la scrittura typedef struct, 356 00:15:45,810 --> 00:15:47,880 poi alcune parentesi graffe, all'interno del quale si 357 00:15:47,880 --> 00:15:51,460 elencare le variabili che si desidera associare a questa nuova dati personalizzati 358 00:15:51,460 --> 00:15:55,670 digitare come un nome e un dormitorio, e poi, dopo le parentesi graffe 359 00:15:55,670 --> 00:15:57,860 si dà un nome al nuovo tipo di dati. 360 00:15:57,860 --> 00:15:59,220 Così, per esempio, studenti. 361 00:15:59,220 --> 00:16:03,247 >> E che cosa è bella di questo ora è che se guardiamo il codice corrispondente, 362 00:16:03,247 --> 00:16:05,080 la convenzione, prima di tutti, è quello di mettere questo 363 00:16:05,080 --> 00:16:08,230 in un file chiamato qualcosa puntino h, un file di intestazione, che non abbiamo 364 00:16:08,230 --> 00:16:09,780 iniziato a utilizzare noi stessi troppo. 365 00:16:09,780 --> 00:16:12,120 Ma stiamo andando cominciare utilizzando un po 'ora. 366 00:16:12,120 --> 00:16:18,650 E che cosa si può fare con questo, in definitiva, in queste poche linee di codice 367 00:16:18,650 --> 00:16:22,130 si dichiarano esattamente questo tipo di dati, uno studente. 368 00:16:22,130 --> 00:16:23,230 E ora lo si può usare. 369 00:16:23,230 --> 00:16:27,274 >> Ho intenzione di andare in ora un file chiamato structs1.c. 370 00:16:27,274 --> 00:16:29,440 E diamo uno sguardo ad un alcune caratteristiche qui. 371 00:16:29,440 --> 00:16:32,250 Così la roba qui è per lo più familiare, e faremo 372 00:16:32,250 --> 00:16:35,040 tornare a ciò che non è familiare in un attimo. 373 00:16:35,040 --> 00:16:39,880 Questo naturalmente è compresa la mia file di intestazione, che è nuovo e, 374 00:16:39,880 --> 00:16:42,580 fatta eccezione per PSet 3 dove, richiamo, abbiamo helpers.h. 375 00:16:42,580 --> 00:16:45,150 Così si potrebbe ricordare helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Perché anche se sto usando citazioni invece di parentesi angolari? 377 00:16:49,381 --> 00:16:50,630 Quando faccio a scegliere tra di loro? 378 00:16:50,630 --> 00:16:52,310 Quasi sempre mi sembra per utilizzare le parentesi angolari. 379 00:16:52,310 --> 00:16:55,040 E poi, tutto ad un tratto su Linea sei Sto utilizzando doppi apici. 380 00:16:55,040 --> 00:16:55,860 Perché potrebbe essere? 381 00:16:55,860 --> 00:16:56,700 Sì? 382 00:16:56,700 --> 00:16:57,725 >> PUBBLICO: [incomprensibile] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Questo è un vero e proprio, che cosa? 384 00:16:59,350 --> 00:17:00,559 PUBBLICO: E 'nel vostro IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Sì, che è in mio IDE reale. 386 00:17:02,475 --> 00:17:05,690 E cerchiamo di non soffermarsi su l'IDE, perché questo è solo uno strumento che sto usando. 387 00:17:05,690 --> 00:17:08,119 Questo è a mio attuale directory, in particolare. 388 00:17:08,119 --> 00:17:11,647 Così structs.h è il mio file non installato nell'IDE, 389 00:17:11,647 --> 00:17:14,480 nel sistema operativo stesso, piuttosto è nella mia directory corrente. 390 00:17:14,480 --> 00:17:16,910 Così la convenzione è se si vuole per inserire il tuo file di intestazione, 391 00:17:16,910 --> 00:17:18,200 si utilizza solo doppi apici. 392 00:17:18,200 --> 00:17:23,290 >> Come chiamiamo questa cosa in linea 8, in generale? 393 00:17:23,290 --> 00:17:25,200 Questo è ciò? 394 00:17:25,200 --> 00:17:28,220 qualcosa #define. 395 00:17:28,220 --> 00:17:31,040 Questo rappresenta costanti, giusto? 396 00:17:31,040 --> 00:17:33,140 Se si desidera avere un il valore nel programma 397 00:17:33,140 --> 00:17:35,110 di utilizzare un intero mucchio di volte, è 398 00:17:35,110 --> 00:17:39,330 buona convenzione di fattore fuori, dichiararlo, con il simbolo di cancelletto 399 00:17:39,330 --> 00:17:43,340 definire, quindi, per convenzione, in tutte maiuscolo word-- anche se non è 400 00:17:43,340 --> 00:17:45,320 strettamente necessaria, ma è convenzione umana 401 00:17:45,320 --> 00:17:47,210 per capitalizzare le costanti in modo che saltano 402 00:17:47,210 --> 00:17:50,380 ti visually-- spazio e allora il valore che si desidera essere 403 00:17:50,380 --> 00:17:52,250 equivalente a nome di quel costante. 404 00:17:52,250 --> 00:17:56,110 Nessun punto e virgola, ma è sufficiente seguire quel modello lì. 405 00:17:56,110 --> 00:17:57,770 >> Allora, cosa ci faccio in questo codice vero e proprio. 406 00:17:57,770 --> 00:18:00,660 Quindi, diamo uno sguardo a il programma principale qui. 407 00:18:00,660 --> 00:18:04,080 In linea 12 perché io hanno incluso structs.h, 408 00:18:04,080 --> 00:18:06,492 Ora ho magicamente al mio disposizione un nuovo tipo di dati. 409 00:18:06,492 --> 00:18:09,200 Non mi resta che l'accesso a int, e char, e float e stringhe, 410 00:18:09,200 --> 00:18:10,060 e blu e altri. 411 00:18:10,060 --> 00:18:12,470 Ora ho l'accesso al un tipo di dati studente. 412 00:18:12,470 --> 00:18:17,740 Quindi, in linea 12, sto combinando due ideas-- un un tipo di dati personalizzati e due, 413 00:18:17,740 --> 00:18:18,940 utilizzando una matrice. 414 00:18:18,940 --> 00:18:21,700 E così in questo programma se Voglio sostenere realmente 415 00:18:21,700 --> 00:18:24,320 tre diversi studenti nel mio programma, ho 416 00:18:24,320 --> 00:18:30,480 può semplicemente dire darmi una variabile chiamati studenti, ciascuno dei quali 417 00:18:30,480 --> 00:18:32,970 è di tipo studenti, che è il mio tipo di dati personalizzati. 418 00:18:32,970 --> 00:18:35,890 E, in particolare, dammi tre di questi nel mio allineamento. 419 00:18:35,890 --> 00:18:37,750 >> Così ora che cosa facciamo in questo programma? 420 00:18:37,750 --> 00:18:40,670 Ecco solo un ciclo for iterazione da 0 a 3, perché è 421 00:18:40,670 --> 00:18:42,110 quale sia il valore di studenti è. 422 00:18:42,110 --> 00:18:44,420 Sto solo chiedendo all'utente dammi il nome dello studente. 423 00:18:44,420 --> 00:18:48,090 E poi, in linea 17, si avere una linea per lo più familiare. 424 00:18:48,090 --> 00:18:50,370 Abbiamo il nostro vecchio amico GetString sulla destra. 425 00:18:50,370 --> 00:18:52,345 E quale pezzo di sintassi è apparentemente nuova, 426 00:18:52,345 --> 00:18:55,130 se non hai mai programmato in C prima, e non hanno mai usato le struct? 427 00:18:55,130 --> 00:18:55,510 Sì? 428 00:18:55,510 --> 00:18:56,417 >> PUBBLICO: Il .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: Il .name. 430 00:18:57,500 --> 00:19:01,220 Ma questo non è troppo di un salto, perché ora gli studenti staffa I 431 00:19:01,220 --> 00:19:02,590 ti dà allo studente i-esimo. 432 00:19:02,590 --> 00:19:04,730 E se vuoi immergerti all'interno di tale struttura, 433 00:19:04,730 --> 00:19:09,490 è sufficiente utilizzare un solo periodo e quindi il nome della variabile all'interno, 434 00:19:09,490 --> 00:19:11,900 o la proprietà all'interno di tale si desidera ottenere l'accesso a. 435 00:19:11,900 --> 00:19:14,816 Allo stesso modo, allora, se ho quindi richiedere utente, dammi dormitorio dello studente, 436 00:19:14,816 --> 00:19:18,390 Allo stesso modo è possibile memorizzare che stringa nella variabile dormitorio all'interno 437 00:19:18,390 --> 00:19:19,940 di tale struttura studente. 438 00:19:19,940 --> 00:19:21,410 >> E ora le cose si fanno un po 'di fantasia. 439 00:19:21,410 --> 00:19:24,420 E questo sta a guardare in forse molto molto presto. 440 00:19:24,420 --> 00:19:27,970 Ma vedrete questo molto più in PSet 4, così facciamo solo sguardo a ora. 441 00:19:27,970 --> 00:19:33,364 Si scopre che in linea 23 attraverso 38, che cosa pensi che sto forse facendo? 442 00:19:33,364 --> 00:19:35,530 Ho rimosso i commenti per oggi, ma la versione 443 00:19:35,530 --> 00:19:38,660 del codice online riferimento ha tutti i commenti. 444 00:19:38,660 --> 00:19:40,171 Che cosa mi sembra di fare? 445 00:19:40,171 --> 00:19:42,530 >> AUDIENCE: Salvare il file con tutti le informazioni che l'utente ha inserito. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Sì, esattamente, questo è un modo nuovo 447 00:19:44,530 --> 00:19:46,370 che stiamo vedendo due, Un'altra caratteristica di C, 448 00:19:46,370 --> 00:19:48,700 per cui posso creare i propri file. 449 00:19:48,700 --> 00:19:51,580 Finora, quasi ogni programma ti ho scritto è senza stato. 450 00:19:51,580 --> 00:19:53,334 Non appena è fatto in esecuzione, questo è tutto. 451 00:19:53,334 --> 00:19:55,000 Non c'è memoria o ricordo di essa. 452 00:19:55,000 --> 00:19:56,110 Non c'è file salvato. 453 00:19:56,110 --> 00:19:58,120 Ma se si vuole salvare input che ha 454 00:19:58,120 --> 00:20:02,100 successo, come in un gioco o un programma in questo modo, si scopre che possiamo farlo. 455 00:20:02,100 --> 00:20:04,360 E vedrete questo più in PSet 4 e nella Sezione. 456 00:20:04,360 --> 00:20:08,661 Ma questa linea 23 essenzialmente crea un file chiamato students.csv. 457 00:20:08,661 --> 00:20:10,160 E si potrebbe avere visto prima. 458 00:20:10,160 --> 00:20:14,250 Anche se non avete mai studiato CS prima, CSV è variabili separati da virgole. 459 00:20:14,250 --> 00:20:19,000 E 'come un povero uomo di versione di un file di Excel, 460 00:20:19,000 --> 00:20:22,270 il che significa che può essere aperto in Excel e in Numeri di Apple, 461 00:20:22,270 --> 00:20:23,830 e ha righe e colonne. 462 00:20:23,830 --> 00:20:26,485 Ma non è un proprietario formato come Microsoft o Apple. 463 00:20:26,485 --> 00:20:29,840 E 'solo le virgole che separano la valori che vedremo tra poco. 464 00:20:29,840 --> 00:20:31,010 >> E basta prendere una supposizione. 465 00:20:31,010 --> 00:20:33,480 In linea 23, per lo fine, il mio secondo argomento 466 00:20:33,480 --> 00:20:37,700 a questa nuova funzione chiamata f aperto per file aperto è w. 467 00:20:37,700 --> 00:20:39,430 Che cosa potrebbe denotare w? 468 00:20:39,430 --> 00:20:40,022 Sì? 469 00:20:40,022 --> 00:20:41,260 >> PUBBLICO: Esso consente di scrivere il file? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Permette si scrive il file. 471 00:20:42,630 --> 00:20:44,810 Quindi ci sono un paio di varianti che siamo in grado di collegare qui. 472 00:20:44,810 --> 00:20:47,184 Ma se volete solo leggere il file, che è guardare a lui 473 00:20:47,184 --> 00:20:50,010 e leggere in memoria, basta usare tra virgolette "r". 474 00:20:50,010 --> 00:20:53,110 Se si desidera scrivere il il file, è possibile utilizzare tra virgolette "w". 475 00:20:53,110 --> 00:20:55,190 C'è anche aggiungere e un paio di altre cose 476 00:20:55,190 --> 00:20:57,356 se si desidera modificare i file esistenti. 477 00:20:57,356 --> 00:21:00,480 Ora stiamo andando a continuare a vedere questo cosa, allora ci torneremo per la linea 24. 478 00:21:00,480 --> 00:21:02,640 NULL, si scopre, è un valore speciale che 479 00:21:02,640 --> 00:21:06,070 può essere restituito da alcune funzioni se qualcosa è andato wrong-- 480 00:21:06,070 --> 00:21:08,490 se il file non esiste, se si è a corto di memoria, 481 00:21:08,490 --> 00:21:09,620 o un gruppo di altri errori. 482 00:21:09,620 --> 00:21:13,470 Ma per ora, facciamo solo supporre che questo è il controllo degli errori solo convenzionale. 483 00:21:13,470 --> 00:21:17,090 Qui in linea 26, sto iterazione 0-3 su tutti i miei studenti. 484 00:21:17,090 --> 00:21:20,470 E questo è una specie di sorta di una nuova funzione, fprintf, 485 00:21:20,470 --> 00:21:21,460 ma basta prendere una supposizione. 486 00:21:21,460 --> 00:21:24,370 Se printf è solo stampa una stringa formattata, 487 00:21:24,370 --> 00:21:26,507 cosa fprintf probabilmente significa? 488 00:21:26,507 --> 00:21:27,590 PUBBLICO: Stampa su un file. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Stampare una stringa formattata in un file. 490 00:21:29,290 --> 00:21:31,180 Questo è ciò che l'addizionale mezzi f è il file. 491 00:21:31,180 --> 00:21:36,420 E il nuovo primo argomento deve essere la variabile che rappresenta il file. 492 00:21:36,420 --> 00:21:38,866 Poi non ci resta che un format stringa come printf. 493 00:21:38,866 --> 00:21:40,740 E anche se questo sintassi è nuovo, questo solo 494 00:21:40,740 --> 00:21:44,610 significa inserire il nome dello studente, plug-in dormitorio per studenti, e poi 495 00:21:44,610 --> 00:21:47,160 con fclose, chiudere il file. 496 00:21:47,160 --> 00:21:49,730 E poi questa è una novità lastly-- e ci torneremo a questo 497 00:21:49,730 --> 00:21:53,240 prima long-- Sto liberando lo studente per motivi 498 00:21:53,240 --> 00:21:54,860 quello che è successo lì sopra. 499 00:21:54,860 --> 00:21:56,820 Ma ci torneremo a quella prima long-- 500 00:21:56,820 --> 00:21:59,820 che è a causa di come è GetString effettivamente lavorando sotto la cappa. 501 00:21:59,820 --> 00:22:01,280 >> Quindi, diamo un rapido sguardo qui. 502 00:22:01,280 --> 00:22:04,380 Se digito ls nella mia directory, Noto che non mi 503 00:22:04,380 --> 00:22:09,360 avere un file chiamato students.csv, semplicemente non c'è, non esiste. 504 00:22:09,360 --> 00:22:14,965 Quindi, se io ora compilare questo programma, rendere le strutture-1,. / struct-1, 505 00:22:14,965 --> 00:22:20,570 e ho intenzione di andare avanti e digitare Andi, che vive a Berkeley a Yale. 506 00:22:20,570 --> 00:22:26,350 Stiamo per avere Rob che vive a Thayer questi giorni. 507 00:22:26,350 --> 00:22:33,760 E veniamo con cui è, credo, Maria è a Mather, 508 00:22:33,760 --> 00:22:35,100 se ho ricordato correttamente. 509 00:22:35,100 --> 00:22:36,460 >> Quindi, nulla sembra accadere. 510 00:22:36,460 --> 00:22:40,680 Ma se digito ls ora, c'è students.csv. 511 00:22:40,680 --> 00:22:43,080 Andiamo avanti e students.csv aperto. 512 00:22:43,080 --> 00:22:46,050 Questo è ancora molto formato di file leggero. 513 00:22:46,050 --> 00:22:49,570 Ma ho semplicemente adottato una convenzione che ho due righe e colonne qui. 514 00:22:49,570 --> 00:22:52,020 La prima colonna è nomi delle persone. 515 00:22:52,020 --> 00:22:55,740 La seconda colonna è lo studente del dormitorio, o l'università, o casa, o roba del genere. 516 00:22:55,740 --> 00:22:57,900 E ora ho salvato questo permanentemente in un file. 517 00:22:57,900 --> 00:22:59,280 >> Quindi non è tutto ciò che interessante. 518 00:22:59,280 --> 00:23:02,980 Ma questo è solo un trampolino di lancio ora per essere in grado di mantenere le informazioni 519 00:23:02,980 --> 00:23:04,040 in modo permanente. 520 00:23:04,040 --> 00:23:08,340 Così vediamo ora che cosa di più che possiamo fare con queste e altre caratteristiche. 521 00:23:08,340 --> 00:23:10,729 Ma in primo luogo, tutte le domande? 522 00:23:10,729 --> 00:23:12,145 E 'stato molto, e che era veloce. 523 00:23:12,145 --> 00:23:16,131 Ma vedrete un sacco più in PSet 4, pure. 524 00:23:16,131 --> 00:23:16,630 Sì? 525 00:23:16,630 --> 00:23:19,360 >> PUBBLICO: C'è un modo per continuare ad aggiungere nomi a quel file? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Bella domanda. 527 00:23:19,880 --> 00:23:21,800 C'è un modo per continuare l'aggiunta di nomi a quel file? 528 00:23:21,800 --> 00:23:22,340 Sì. 529 00:23:22,340 --> 00:23:24,630 E, infatti, se si finisce up riaprire il file, 530 00:23:24,630 --> 00:23:26,780 si usa preventivo unquote "a" per l'aggiunta, 531 00:23:26,780 --> 00:23:31,090 il che è sufficiente aggiungere una nuova linea, un nuova linea ancora e ancora, esattamente. 532 00:23:31,090 --> 00:23:32,010 Bella domanda. 533 00:23:32,010 --> 00:23:32,950 Altre domande? 534 00:23:32,950 --> 00:23:33,450 Sì? 535 00:23:33,450 --> 00:23:35,580 PUBBLICO: Se si è eseguito il programma di nuovo in questo momento, 536 00:23:35,580 --> 00:23:38,000 sarebbe continuare ad aggiungere nomi al il file o sarebbe aprire un nuovo file? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, bella domanda. 538 00:23:38,740 --> 00:23:41,448 Se è stato eseguito di nuovo a destra il programma Ora, forse digitato nuovi nomi, 539 00:23:41,448 --> 00:23:44,820 sarebbe aggiungere al file o sovrascrivere il file? 540 00:23:44,820 --> 00:23:47,420 Quest'ultimo, perché io sono Non utilizzando la modalità di aggiunta. 541 00:23:47,420 --> 00:23:49,930 E perché io sono solo alla cieca aprire il file per la scrittura, 542 00:23:49,930 --> 00:23:51,310 è solo andando a sovrascrivere il file. 543 00:23:51,310 --> 00:23:54,570 Quindi vorrei davvero bisogno di fare è aggiungere, se voglio avere in realtà un lungo periodo 544 00:23:54,570 --> 00:23:55,350 database. 545 00:23:55,350 --> 00:23:58,220 >> Ora CSV è utile, francamente, anche per come se siete writing-- 546 00:23:58,220 --> 00:24:00,100 e noi finalmente vediamo questo più avanti nel semestre, quando 547 00:24:00,100 --> 00:24:01,455 usiamo CSVs per altri scopi. 548 00:24:01,455 --> 00:24:04,920 Se si desidera memorizzare tutte le persone che hanno registrato per qualche evento, 549 00:24:04,920 --> 00:24:07,420 o firmato per il vostro studente gruppo, o qualcosa del genere, 550 00:24:07,420 --> 00:24:10,330 memorizzazione dei dati in genere di formato è super conveniente. 551 00:24:10,330 --> 00:24:12,580 Perché letteralmente, se io dovevano scaricare questo file. 552 00:24:12,580 --> 00:24:14,540 Potrei double-- e facciamo in realtà provare questo 553 00:24:14,540 --> 00:24:16,720 se ho Excel o Numbers qui. 554 00:24:16,720 --> 00:24:19,130 >> Ho intenzione di fare clic destro o control-click il mio file. 555 00:24:19,130 --> 00:24:20,020 Ops. 556 00:24:20,020 --> 00:24:21,830 Pulsante destro del mouse o il controllo del mouse il mio file. 557 00:24:21,830 --> 00:24:24,960 Andiamo, il mio mouse non sta collaborando. 558 00:24:24,960 --> 00:24:32,694 Download-- ho intenzione di scaricare tutti i file qui così 559 00:24:32,694 --> 00:24:33,860 solo così posso prendere questo. 560 00:24:33,860 --> 00:24:37,850 E vediamo se questo funziona students.csv-- prima volta 561 00:24:37,850 --> 00:24:39,310 Ho attivato. 562 00:24:39,310 --> 00:24:41,360 Ora vogliono vedere i miei contatti. 563 00:24:41,360 --> 00:24:44,310 Ora, ho bisogno di registrarsi. 564 00:24:44,310 --> 00:24:47,620 Vedi come è facile da usare CSV? 565 00:24:47,620 --> 00:24:50,840 Sì, tenerlo aggiornato. 566 00:24:50,840 --> 00:24:52,375 Ok, ora siamo pronti per la classe. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, cosa c'è di nuovo? 569 00:25:00,370 --> 00:25:02,920 OK, chiudere. 570 00:25:02,920 --> 00:25:04,750 E 'stato magico. 571 00:25:04,750 --> 00:25:07,280 OK, ora dobbiamo aggiornare. 572 00:25:07,280 --> 00:25:10,890 E ora, è dimenticato cosa file originariamente aperto, 573 00:25:10,890 --> 00:25:13,090 ma quello che A-- ci andiamo. 574 00:25:13,090 --> 00:25:16,341 OK, ora abbiamo un file di Excel. 575 00:25:16,341 --> 00:25:18,290 Grazie. 576 00:25:18,290 --> 00:25:20,764 >> Ok, quindi quello che ho fatto è stata la parte facile. 577 00:25:20,764 --> 00:25:23,930 Certo avrei potuto pre-installato Excel o Numbers o qualsiasi programma. 578 00:25:23,930 --> 00:25:25,846 Ma questo è bello, perché ora posso manipolare 579 00:25:25,846 --> 00:25:28,090 i dati in un formato standard. 580 00:25:28,090 --> 00:25:30,294 >> Così ora cerchiamo di contesto passare a dove avevamo interrotto 581 00:25:30,294 --> 00:25:32,710 l'ultima volta, che doveva iniziare a decollare ruote di formazione. 582 00:25:32,710 --> 00:25:34,543 Ma prima, non l'ha fatto vedere questo pranzo in precedenza 583 00:25:34,543 --> 00:25:38,150 sta di nuovo accadendo qui a fuoco e Ghiaccio a Cambridge, Sitar a New Haven. 584 00:25:38,150 --> 00:25:43,150 Iscriviti sul sito CS50s ASAP per unire studenti CS50 e personale. 585 00:25:43,150 --> 00:25:46,090 >> Così abbiamo preso ruote di formazione fuori il Lunedi come follows-- 586 00:25:46,090 --> 00:25:49,120 stringa è stata dichiarata in Biblioteca CS50s per qualche tempo. 587 00:25:49,120 --> 00:25:52,650 Ed è bello, perché permette noi parlare di variabili come 588 00:25:52,650 --> 00:25:54,660 parole e frasi complete e altro ancora. 589 00:25:54,660 --> 00:25:56,710 Ma si scopre stringa non esiste. 590 00:25:56,710 --> 00:26:00,200 Questo è solo un sinonimo o un alias, che abbiamo creato qualcosa che 591 00:26:00,200 --> 00:26:03,780 in realtà è un po 'più tecnico chiamato char *. 592 00:26:03,780 --> 00:26:07,900 >> E in effetti, abbiamo visto un esempio di un programma il Lunedi 593 00:26:07,900 --> 00:26:11,200 che non si è comportato piuttosto come ci aspettavamo. 594 00:26:11,200 --> 00:26:13,630 Questo era il file, confronto-0. 595 00:26:13,630 --> 00:26:17,910 E ricordano che confrontare-0, se Io ricompilare il programma di Lunedi 596 00:26:17,910 --> 00:26:22,670 ed eseguire confronto-0 e digitare la mamma in minuscolo, e la mamma in minuscolo di nuovo. 597 00:26:22,670 --> 00:26:25,320 Il programma ha insistito che tipo cose diverse, 598 00:26:25,320 --> 00:26:29,210 anche se mamma, tutto in minuscolo, è identica visivamente. 599 00:26:29,210 --> 00:26:31,990 Allora, qual è stata la risposta breve per il motivo per cui il computer pensa 600 00:26:31,990 --> 00:26:34,500 queste due stringhe sono diverse? 601 00:26:34,500 --> 00:26:35,250 Sì? 602 00:26:35,250 --> 00:26:36,534 >> PUBBLICO: [incomprensibile] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Giusto. 604 00:26:37,450 --> 00:26:39,600 Quindi, la mamma, la prima volta Scriv dentro, è essere 605 00:26:39,600 --> 00:26:42,710 memorizzati da qualche parte nel mio computer di memoria, ma in una posizione diversa 606 00:26:42,710 --> 00:26:44,690 che la seconda volta che scriv dentro mamma. 607 00:26:44,690 --> 00:26:46,580 Ora certamente potrebbe essere ottimizzato. 608 00:26:46,580 --> 00:26:49,205 Il computer potrebbe essere intelligente e realizzare queste due stringhe, hey, 609 00:26:49,205 --> 00:26:49,954 sono identici. 610 00:26:49,954 --> 00:26:51,520 Permettetemi non mi ridondante memorizzarlo. 611 00:26:51,520 --> 00:26:54,229 Ma i computer non lo fanno ottimizzazione meno che non si dica loro di. 612 00:26:54,229 --> 00:26:56,061 Quindi, per impostazione predefinita, sono solo andando a finire 613 00:26:56,061 --> 00:26:57,670 in due posti diversi in memoria. 614 00:26:57,670 --> 00:27:01,570 E così, per essere più chiari, quando abbiamo confrontato le due stringhe, 615 00:27:01,570 --> 00:27:03,950 Il primo è stato chiamato s, il secondo è stato chiamato 616 00:27:03,950 --> 00:27:08,530 t, che cosa in particolare mi è stato confrontando qui sulla linea 13? 617 00:27:08,530 --> 00:27:09,494 Già. 618 00:27:09,494 --> 00:27:12,390 >> PUBBLICO: E 'il luogo in memoria che la variabile indicherà. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Esatto, sono stato confrontando il posto in memoria 620 00:27:14,900 --> 00:27:16,300 che tali variabili indicavano. 621 00:27:16,300 --> 00:27:20,560 Così in particolare, se la mamma era il numero di byte 1 e 2, e 3, 622 00:27:20,560 --> 00:27:24,020 e 4-- perché ricordano il backslash 0 deve essere fino alla fine. 623 00:27:24,020 --> 00:27:29,420 E l'altra istanza di mamma, m-o-m, era all'indirizzo 10, 11, 12, e 13. 624 00:27:29,420 --> 00:27:33,100 Stavo comparando 1, tale indirizzo, quella posizione nella memoria, 625 00:27:33,100 --> 00:27:35,160 contro 10, che è ovviamente non la stessa. 626 00:27:35,160 --> 00:27:36,260 1 non è 10. 627 00:27:36,260 --> 00:27:39,620 >> Quindi questo è bello in quel è abbastanza semplice. 628 00:27:39,620 --> 00:27:42,870 Ma è problematico in quanto sembra che non riusciamo a confrontare le stringhe. 629 00:27:42,870 --> 00:27:44,930 Così fundamentally-- e a questo basso livello, 630 00:27:44,930 --> 00:27:47,300 se si voleva implementare un programma per confrontare 631 00:27:47,300 --> 00:27:50,270 due parole separate che il utente ha digitato per la qualità, 632 00:27:50,270 --> 00:27:53,944 fanno la fila per char char, solo in termini generali, 633 00:27:53,944 --> 00:27:55,360 che cosa dobbiamo fare, a quanto pare? 634 00:27:55,360 --> 00:27:57,940 Non è sufficiente solo per guardare quelle due indirizzi. 635 00:27:57,940 --> 00:27:58,860 Che cosa dobbiamo fare? 636 00:27:58,860 --> 00:27:59,360 Sì? 637 00:27:59,360 --> 00:28:01,120 >> PUBBLICO: Scorrere la stringa [incomprensibile]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Sì, andiamo scorrere la stringa. 639 00:28:02,600 --> 00:28:05,808 Usiamo un ciclo for, un ciclo while, o qualsiasi cosa tu stai più bene con. 640 00:28:05,808 --> 00:28:08,840 E se abbiamo due stringhe da qualche parte nella memoria, diamo un'occhiata a ciascuno di 641 00:28:08,840 --> 00:28:11,770 primo carattere, quindi ogni secondo è carattere, poi il terzo, e quarto, 642 00:28:11,770 --> 00:28:15,206 e il quinto, fino a quando non ha colpito quale valore speciale sentinella? 643 00:28:15,206 --> 00:28:16,080 PUBBLICO: [incomprensibile] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Sì, il backslash pari a zero, a questo punto in entrambe le stringhe 645 00:28:18,800 --> 00:28:20,100 possiamo decidere il gioco è fatto. 646 00:28:20,100 --> 00:28:21,970 Abbiamo abbinato ogni singolo personaggio? 647 00:28:21,970 --> 00:28:22,990 In caso contrario, restituire false. 648 00:28:22,990 --> 00:28:24,770 Se è così, restituisce true. 649 00:28:24,770 --> 00:28:28,800 E così questo è esattamente ciò che questa versione del programma di confronto-1.c fa. 650 00:28:28,800 --> 00:28:31,677 Si è identico a quello che guardato Lunedi, tranne che ho 651 00:28:31,677 --> 00:28:34,760 deciso di eliminare la parola anche se string-- che non ha impact-- funzionale tutto 652 00:28:34,760 --> 00:28:37,450 Io sto facendo ora è la rimozione alcune ruote di formazione visivi, 653 00:28:37,450 --> 00:28:40,880 ma per vedere chiaramente che s e t sono indirizzi. 654 00:28:40,880 --> 00:28:43,020 Ed è quello che la star, l'asterisco, rappresenta 655 00:28:43,020 --> 00:28:46,690 è un indirizzo, altrimenti noto più tecnicamente come un puntatore. 656 00:28:46,690 --> 00:28:49,880 >> Così, quando dichiaro s su linea 9 e dire char * s, 657 00:28:49,880 --> 00:28:52,160 questo non significa che mi dia una stringa. 658 00:28:52,160 --> 00:28:56,360 Ciò significa che mi danno una variabile il cui scopo nella vita è quello di memorizzare un indirizzo. 659 00:28:56,360 --> 00:29:00,400 Perché io sto per mettere la indirizzo di una stringa in esso. 660 00:29:00,400 --> 00:29:03,500 E in effetti, GetString, per essere chiaro, non restituisce una stringa. 661 00:29:03,500 --> 00:29:06,110 Non restituisce mamma backslash zero per sé. 662 00:29:06,110 --> 00:29:10,005 Che cosa significa GetString specificamente e precisamente di ritorno? 663 00:29:10,005 --> 00:29:10,880 PUBBLICO: [incomprensibile] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: Un indirizzo, il indirizzo del primo carattere 665 00:29:14,080 --> 00:29:16,070 in qualche stringa che ha ottenuto. 666 00:29:16,070 --> 00:29:19,250 E così ora stiamo vedendo una parola chiave speciale di nuovo. 667 00:29:19,250 --> 00:29:20,640 E, ho accennato a questo prima. 668 00:29:20,640 --> 00:29:23,620 Questo sta per essere buono convenzione che vedremo di nuovo e di nuovo ora. 669 00:29:23,620 --> 00:29:27,540 Sto controllando fare in modo che s non è nullo e t non è nullo. 670 00:29:27,540 --> 00:29:30,100 Perché in base alla mia veramente menzione rapido prima, 671 00:29:30,100 --> 00:29:35,510 che cosa potrebbe significare se non restituisce GetString un indirizzo ma N-U-L-L, che è di nuovo, 672 00:29:35,510 --> 00:29:36,990 un valore speciale? 673 00:29:36,990 --> 00:29:37,890 >> PUBBLICO: Errore. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Si tratta di un errore. 675 00:29:38,600 --> 00:29:39,550 Qualcosa è andato storto. 676 00:29:39,550 --> 00:29:41,341 E che di solito potrebbe accadere, soprattutto 677 00:29:41,341 --> 00:29:45,162 con strings-- che potrebbe essere di lunghezza sconosciuta in advance-- 678 00:29:45,162 --> 00:29:46,870 forse i computer degli la memoria, forse 679 00:29:46,870 --> 00:29:49,280 digitato in un tale lungo parola o una frase 680 00:29:49,280 --> 00:29:51,880 o incollato un enorme saggio tale c'è solo non abbastanza memoria. 681 00:29:51,880 --> 00:29:55,340 E così GetString non può tornare l'indirizzo del tutto, 682 00:29:55,340 --> 00:29:56,620 in modo che solo restituisce nulla. 683 00:29:56,620 --> 00:30:00,580 E dice un errore è accaduto restituendo il valore speciale NULL. 684 00:30:00,580 --> 00:30:02,890 E 'l'indirizzo di zero, per così dire. 685 00:30:02,890 --> 00:30:06,157 >> Ora si scopre C viene fornito con un funzione che lo fa iterazione. 686 00:30:06,157 --> 00:30:09,240 Non abbiamo per perseguire questo obiettivo con un ciclo for o di un ciclo while noi stessi. 687 00:30:09,240 --> 00:30:11,150 Siamo in grado di utilizzare una funzione, chiamato succintamente, 688 00:30:11,150 --> 00:30:15,400 mescolate comp, o una stringa confrontare, il cui scopo nella vita è quello di fare esattamente questo. 689 00:30:15,400 --> 00:30:19,990 Si dà due puntatori, due indirizzi, e andrà a quegli indirizzi 690 00:30:19,990 --> 00:30:23,130 e quindi confrontare lettera per lettera per lettera per qualità, 691 00:30:23,130 --> 00:30:26,610 fermandosi solo quando ciò che è vero? 692 00:30:26,610 --> 00:30:31,540 Quando intuitivamente dovrebbe mescolare bozzetto fermata iterazione, tanto per essere chiari? 693 00:30:31,540 --> 00:30:35,400 Quando colpisce un backslash 0 in entrambe le stringa, a questo punto si può decidere 694 00:30:35,400 --> 00:30:38,910 ha abbinato tutto, o vi è stata una discrepanza? 695 00:30:38,910 --> 00:30:42,740 >> Quindi, se corriamo questo ora e provare il nostro gioco poco capitalizzazione, 696 00:30:42,740 --> 00:30:49,260 così rendere confrontare-1, ./compare-1, e digitare mamma in minuscolo entrambe le volte. 697 00:30:49,260 --> 00:30:50,560 Ora è la stessa cosa. 698 00:30:50,560 --> 00:30:54,080 E se lo faccio di nuovo con minuscolo e poi magari maiuscolo. 699 00:30:54,080 --> 00:30:56,720 Ora si distingue infatti tra maiuscole e minuscole. 700 00:30:56,720 --> 00:31:00,440 Quindi non così difficile o magica, ma non ora spiega 701 00:31:00,440 --> 00:31:03,140 cosa sta succedendo sotto il cofano. 702 00:31:03,140 --> 00:31:07,640 >> Allora, cosa altro possiamo estrarre da questo tipo di lezione? 703 00:31:07,640 --> 00:31:08,980 Quindi, diamo uno sguardo a questo. 704 00:31:08,980 --> 00:31:15,380 Ho intenzione di andare avanti e scrivere un programma veloce qui chiamato copia-0. 705 00:31:15,380 --> 00:31:21,594 E ora andiamo avanti e in realtà facciamolo questo-- con copia-0, 706 00:31:21,594 --> 00:31:23,010 dare un'occhiata a quello che ho qui. 707 00:31:23,010 --> 00:31:24,712 Desidero innanzitutto dire che l'utente, dire qualcosa. 708 00:31:24,712 --> 00:31:26,420 Poi ho una stringa e ho memorizzato in s. 709 00:31:26,420 --> 00:31:29,810 Poi controllo se s è uguale è uguale a NULL, appena di ritorno 1. 710 00:31:29,810 --> 00:31:31,590 Quindi questo è solo il controllo degli errori standard. 711 00:31:31,590 --> 00:31:33,112 Niente di interessante è accaduto. 712 00:31:33,112 --> 00:31:36,320 E infatti, se ci liberiamo di errore la verifica, questo sembra settimana 1 codice 713 00:31:36,320 --> 00:31:36,985 al momento. 714 00:31:36,985 --> 00:31:39,110 Ma ho iniziato a ottenere un po 'meglio di questo. 715 00:31:39,110 --> 00:31:43,340 >> Ora in linea 16, una settimana fa, forse anche un paio di giorni o di ore fa, 716 00:31:43,340 --> 00:31:46,720 si potrebbe dire che la linea 16 è la creazione di una variabile chiamata t 717 00:31:46,720 --> 00:31:48,219 e copia s in esso. 718 00:31:48,219 --> 00:31:50,010 E questo è un perfetto asporto ragionevole. 719 00:31:50,010 --> 00:31:51,560 Ma essere più precisi ora. 720 00:31:51,560 --> 00:31:54,190 Quello che sta accadendo in linea 16? 721 00:31:54,190 --> 00:31:56,170 Ciò che sta ottenendo copiato da destra a sinistra? 722 00:31:56,170 --> 00:31:56,669 Sì? 723 00:31:56,669 --> 00:31:58,490 PUBBLICO: E 't ottenendo un indirizzo di s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Esattamente, t è sempre l'indirizzo di s. 725 00:32:01,220 --> 00:32:05,170 Quindi, per essere chiaro ora, se vado di nuovo a quel esempio precedente 726 00:32:05,170 --> 00:32:08,520 e traggo fuori la cosa che ho digitato. 727 00:32:08,520 --> 00:32:11,640 E quello che ho digitato dentro-- ecco s, e qui 728 00:32:11,640 --> 00:32:15,830 è quello che ho digitato qualche parte la memoria, la mamma e quindi una barra rovesciata 729 00:32:15,830 --> 00:32:17,840 0 che viene aggiunto per me. 730 00:32:17,840 --> 00:32:23,060 Quello che ho memorizzato qui, ricordare, questo è in posizione 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 questo è ciò che è attualmente in s. 732 00:32:24,655 --> 00:32:29,220 Quindi, se sulla linea 16, dico dammi un'altra variabile chiamata t e negozio 733 00:32:29,220 --> 00:32:33,590 in al valore di s, cosa viene memorizzato qui non sarà mamma 734 00:32:33,590 --> 00:32:35,480 ma piuttosto solo il numero 1. 735 00:32:35,480 --> 00:32:38,520 >> Quindi, se guardiamo avanti in questo programma Ora, che cosa succederà? 736 00:32:38,520 --> 00:32:40,690 Quindi notare che non c'è questa funzione si potrebbe 737 00:32:40,690 --> 00:32:44,410 hanno usato questo qualche tempo fa per Cesare, o Vigenere, o forse non del tutto. 738 00:32:44,410 --> 00:32:48,170 Io rivendico il mio printf, io sono andando a sfruttare la copia t. 739 00:32:48,170 --> 00:32:51,616 In prima linea 19, la sanità mentale rapido controllare, i controlli strlen la lunghezza di t. 740 00:32:51,616 --> 00:32:53,740 Perché non voglio cercare di capitalizzare qualcosa 741 00:32:53,740 --> 00:32:55,104 se non c'è corda lì. 742 00:32:55,104 --> 00:32:57,520 Se l'utente solo premere Invio, non c'è niente da capitalizzare. 743 00:32:57,520 --> 00:33:01,100 Quindi non voglio fare la linea 21. 744 00:33:01,100 --> 00:33:05,758 Così la linea 21 sta capitalizzando quale lettera, a quanto pare, in t? 745 00:33:05,758 --> 00:33:06,514 >> PUBBLICO: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Sembra come se fosse la copia quale? 747 00:33:08,722 --> 00:33:09,486 PUBBLICO: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, così il primo m, perché nota che sono 750 00:33:12,685 --> 00:33:14,935 passando per ToUpper, che se non avete mai visto è 751 00:33:14,935 --> 00:33:16,980 solo una funzione di capitalizzare come input. 752 00:33:16,980 --> 00:33:20,240 t staffa zero significa dare me il carattere zero di t. 753 00:33:20,240 --> 00:33:22,550 E così come fa questo cambio di pagina, per intenderci? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Che cosa ha bisogno per avere riscritto o modificato rispetto a s e t e mamma 756 00:33:29,160 --> 00:33:30,097 pari a zero backslash. 757 00:33:30,097 --> 00:33:31,470 >> PUBBLICO: [incomprensibile] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Sì, quindi questo qui semplicemente 759 00:33:34,030 --> 00:33:40,860 ha bisogno di avere cambiato a-- fissare questo-- ha bisogno di avere cambiato per la M maiuscola. 760 00:33:40,860 --> 00:33:44,330 Ma ora, guarda più avanti nel programma, se stampo fuori 761 00:33:44,330 --> 00:33:49,800 s e t come pulisco qui, guardare cosa c'è succederà stampa di s e t. 762 00:33:49,800 --> 00:33:54,310 Quindi, fare copia-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Lasciami andare avanti e digito a mamma in lettere minuscole. 764 00:33:57,140 --> 00:34:00,140 Si noti sia l'originale e la copia sono stati capitalizzati. 765 00:34:00,140 --> 00:34:00,850 Perché? 766 00:34:00,850 --> 00:34:04,431 Beh, s e t sono entrambi indicando, se si vuole, lo stesso pezzo di memoria. 767 00:34:04,431 --> 00:34:06,930 E, francamente, questo è sempre uninteresting-- davvero il fatto 768 00:34:06,930 --> 00:34:09,150 che stiamo usando l'indirizzo di zero qui. 769 00:34:09,150 --> 00:34:11,719 Voglio dire, non mi interessa dove roba è in memoria. 770 00:34:11,719 --> 00:34:13,550 Spiacente Sto cancellando un po 'troppo. 771 00:34:13,550 --> 00:34:15,674 Ma non mi interessa dove le cose sono in memoria. 772 00:34:15,674 --> 00:34:18,510 E così, in effetti cosa programmatori tendono a pensare 773 00:34:18,510 --> 00:34:21,080 è che quando si parla di un indirizzo o un puntatore, 774 00:34:21,080 --> 00:34:22,679 chi se ne frega dove è in memoria. 775 00:34:22,679 --> 00:34:24,989 Non mi importa se è a byte di uno o di un miliardo. 776 00:34:24,989 --> 00:34:27,920 Ho appena interessa che questo variabile è efficace 777 00:34:27,920 --> 00:34:29,620 che punta a quel pezzo di memoria. 778 00:34:29,620 --> 00:34:33,350 E così, d'ora in poi, invece di cavillare su indirizzi di memoria arbitrari, diamo 779 00:34:33,350 --> 00:34:36,710 basta iniziare a disegnare puntatori come puntatori, come frecce. 780 00:34:36,710 --> 00:34:39,340 Così che cosa s e t sono davvero, secondo questo programma, 781 00:34:39,340 --> 00:34:42,130 a causa di come ho creato t, è solo a due variabili separate 782 00:34:42,130 --> 00:34:43,840 indicando nello stesso pezzo di memoria. 783 00:34:43,840 --> 00:34:45,215 E non ci importa dove si trovino. 784 00:34:45,215 --> 00:34:47,130 Così possiamo astrarre quel dettaglio. 785 00:34:47,130 --> 00:34:48,780 >> Allora, come posso risolvere questo problema? 786 00:34:48,780 --> 00:34:54,120 Se voglio scrivere una versione della copia Programma che in realtà copia la stringa 787 00:34:54,120 --> 00:34:56,840 e capitalizza solo il copia, solo intuitivamente, 788 00:34:56,840 --> 00:34:59,766 ciò che è avuto modo di essere un ingrediente alla nostra soluzione? 789 00:34:59,766 --> 00:35:00,640 PUBBLICO: [incomprensibile] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Abbiamo bisogno di una cosa? 791 00:35:01,420 --> 00:35:01,820 PUBBLICO: Bello pezzo di memoria. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Abbiamo bisogno un altro pezzo della memoria, giusto? 793 00:35:03,280 --> 00:35:05,360 Non sappiamo come farlo ma, necessariamente. 794 00:35:05,360 --> 00:35:11,330 Ma io tipo di bisogno di questo di accadere così che la mamma originale in minuscolo 795 00:35:11,330 --> 00:35:14,170 finisce in quel pezzo extra di memoria. 796 00:35:14,170 --> 00:35:19,770 E poi quando cambio la copia, io non vogliono cambiare questa copia qui. 797 00:35:19,770 --> 00:35:26,020 Io invece voglio cambiare solo questo copia in modo che l'originale è invariata. 798 00:35:26,020 --> 00:35:27,980 >> Quindi, vediamo come si potrebbe fare questo. 799 00:35:27,980 --> 00:35:31,800 In copia-1, che ha già stato spogliato della commento, 800 00:35:31,800 --> 00:35:33,250 ma è commentato in linea. 801 00:35:33,250 --> 00:35:36,710 Noi invece facciamo il following-- questi le linee sono identiche, mi ottenere una stringa 802 00:35:36,710 --> 00:35:38,340 e lo chiamano s. 803 00:35:38,340 --> 00:35:43,500 Ma ora diamo un'occhiata a uno dei nostri più complesso ma l'ultimo della complessità 804 00:35:43,500 --> 00:35:47,340 per un po ', la linea 16 fa esattamente questo. 805 00:35:47,340 --> 00:35:49,400 Quindi, se il vostro comodo con il immagine che abbiamo appena drew-- 806 00:35:49,400 --> 00:35:51,790 dammi un nuovo pezzo di memoria, copiare tutto in esso, 807 00:35:51,790 --> 00:35:53,730 vediamo come noi traduciamo che di codice. 808 00:35:53,730 --> 00:35:59,400 >> Quindi la linea 16, sul lato sinistro, char * t mi dà questa casella qui. 809 00:35:59,400 --> 00:36:00,230 Questo è tutto ciò che fa. 810 00:36:00,230 --> 00:36:03,240 Sul lato destro, m alloc o malloc, 811 00:36:03,240 --> 00:36:06,480 è l'allocazione della memoria, super elegante, un modo criptico di dire semplicemente 812 00:36:06,480 --> 00:36:07,640 dammi un pezzo di memoria. 813 00:36:07,640 --> 00:36:09,290 Quanta memoria abbiamo bisogno? 814 00:36:09,290 --> 00:36:10,910 Beh, è ​​una specie di grande espressione. 815 00:36:10,910 --> 00:36:12,570 Ma vediamo cosa dice qui. 816 00:36:12,570 --> 00:36:15,940 Quindi questo, naturalmente, è dare me la lunghezza della stringa di s. 817 00:36:15,940 --> 00:36:19,094 Così, la mamma dovrebbe essere cosa? 818 00:36:19,094 --> 00:36:21,010 Quindi, solo tre, giusto? mamma è di tre caratteri. 819 00:36:21,010 --> 00:36:22,830 Non si contano i backslash zero quando si 820 00:36:22,830 --> 00:36:25,960 parlare la lunghezza di una stringa è in realtà le lettere visibili umani. 821 00:36:25,960 --> 00:36:28,020 Così la mamma, quindi questo mi dà 3. 822 00:36:28,020 --> 00:36:31,170 Ma aspettate un minuto, ora sto aggiungendo 1. 823 00:36:31,170 --> 00:36:34,861 Perché Io in realtà voglio allocare 4 byte e non solo 3? 824 00:36:34,861 --> 00:36:35,360 Sì? 825 00:36:35,360 --> 00:36:36,910 >> PUBBLICO: Per il valore sentinella? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Esattamente, per quel valore sentinel. 827 00:36:38,951 --> 00:36:40,840 Per il backslash a zero, Ho bisogno totale di 4 byte. 828 00:36:40,840 --> 00:36:42,870 Quindi ho bisogno la lunghezza della stringa più 1. 829 00:36:42,870 --> 00:36:45,400 E poi per buona measure-- anche se su questo sistema, 830 00:36:45,400 --> 00:36:49,390 sta andando sempre essere 1-- sto dicendo moltiplicarlo per la dimensione di un char. 831 00:36:49,390 --> 00:36:51,552 Si scopre che è sizeof un operatore in C che 832 00:36:51,552 --> 00:36:53,260 solo la dice numero di byte che è 833 00:36:53,260 --> 00:36:54,700 necessarie per un certo tipo di dati. 834 00:36:54,700 --> 00:36:57,740 Non funziona per gli array, tipicamente, a volte lo fa. 835 00:36:57,740 --> 00:36:59,210 Ma nel caso generale, no. 836 00:36:59,210 --> 00:37:02,330 Ma mi dirà quanti byte un char è, che si rivela è sempre 1. 837 00:37:02,330 --> 00:37:04,080 Quindi questo è come moltiplicare per 1. 838 00:37:04,080 --> 00:37:05,900 >> Così super criptico cercando riga di codice. 839 00:37:05,900 --> 00:37:09,320 Ma tutto ciò che fa è dà me un pezzo di memoria. 840 00:37:09,320 --> 00:37:13,590 Ma lo fa sembra essere la copia tutto ciò in quella memoria? 841 00:37:13,590 --> 00:37:14,560 Non ancora. 842 00:37:14,560 --> 00:37:22,040 E così quello che faccio sulla linea 22, e 23, 24, 25, beh, io semplicemente faccio. 843 00:37:22,040 --> 00:37:23,760 E questa è una sorta di roba vecchia scuola ora. 844 00:37:23,760 --> 00:37:26,010 Questo è come PSet 2, dove si sta appena muovendo le cose 845 00:37:26,010 --> 00:37:28,620 giro in memoria, o meglio nelle stringhe. 846 00:37:28,620 --> 00:37:31,920 >> Così sto iterazione da 0 a la lunghezza della stringa s. 847 00:37:31,920 --> 00:37:37,820 E sto copiando il carattere i-esimo in s nel personaggio i-esimo in t. 848 00:37:37,820 --> 00:37:41,820 E perché io, il programmatore, ha fatto Assicurarsi di assegnare esattamente tanti byte 849 00:37:41,820 --> 00:37:44,600 come ho bisogno, è perfetto uno-a-uno. 850 00:37:44,600 --> 00:37:47,060 E copio mamma in minuscolo a quello nuovo. 851 00:37:47,060 --> 00:37:50,170 E poi, infine, lo faccio questa linea. 852 00:37:50,170 --> 00:37:54,637 E così l'effetto è solo di capitalizzare questo t qui. 853 00:37:54,637 --> 00:37:56,470 Così un sacco di assorbire, ma se si considera solo 854 00:37:56,470 --> 00:37:58,220 quello che sta realmente accadendo sul sotto la cappa 855 00:37:58,220 --> 00:38:00,880 sta semplicemente spostando questi byte intorno, tutto ciò che 856 00:38:00,880 --> 00:38:06,617 è necessario per risolvere questo problema è solo per darci questo pezzo di memoria. 857 00:38:06,617 --> 00:38:08,450 Ora con il rischio di travolgente, mi permetta di mostrare 858 00:38:08,450 --> 00:38:13,200 un altro esempio che è quasi identici, tranne per questo 859 00:38:13,200 --> 00:38:14,350 linea di codice. 860 00:38:14,350 --> 00:38:18,870 Quindi questa è la versione degli hacker di questo programma, se si vuole. 861 00:38:18,870 --> 00:38:21,050 Ma facciamo solo distillare in quello che sta succedendo. 862 00:38:21,050 --> 00:38:28,920 Linea 24 usato per essere questo t Staffa mi viene s staffa i. 863 00:38:28,920 --> 00:38:33,370 Ora, sto cambiando questo a il molto più criptico stella t 864 00:38:33,370 --> 00:38:36,280 più 1 uguale stella s più 1. 865 00:38:36,280 --> 00:38:38,702 >> Così che cosa sta accadendo e perché abbiamo un personaggio stella? 866 00:38:38,702 --> 00:38:41,410 Abbiamo visto la stella prima, e è in uso in modo diverso qui. 867 00:38:41,410 --> 00:38:45,490 Abbiamo in precedenza visto char *, ora sto vedendo Una stella, all'inizio, e va bene. 868 00:38:45,490 --> 00:38:48,190 Perché si scopre che può tipo di dedurre solo 869 00:38:48,190 --> 00:38:50,280 da quelli prima principi che cosa sta succedendo. 870 00:38:50,280 --> 00:38:53,860 Quindi, tanto per essere chiari, che cosa è s? 871 00:38:53,860 --> 00:38:55,052 La scorsa settimana, è stata una stringa. 872 00:38:55,052 --> 00:38:56,260 Ciò non basta più. 873 00:38:56,260 --> 00:38:57,690 Ciò che è s, in particolare? 874 00:38:57,690 --> 00:38:58,590 >> PUBBLICO: [incomprensibile] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Si tratta di un puntatore. 876 00:38:59,881 --> 00:39:02,610 E 'l'indirizzo del primo personaggio abbiamo digitato in. 877 00:39:02,610 --> 00:39:04,780 OK, che cosa è t? 878 00:39:04,780 --> 00:39:05,660 >> PUBBLICO: [incomprensibile] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: Il indirizzo del primo byte 880 00:39:07,950 --> 00:39:10,490 in t, che pezzo di memoria riassegnati. 881 00:39:10,490 --> 00:39:14,720 Così si scopre che quando scorrere da 0 a fino alla stringa 882 00:39:14,720 --> 00:39:17,424 lunghezza-- innanzitutto, i inizia fuori a 0, perché 883 00:39:17,424 --> 00:39:18,840 di questa vecchia scuola per cosa ciclo. 884 00:39:18,840 --> 00:39:22,400 Quindi, solo per semplicità, facciamo supporre che la prima riga di codice 885 00:39:22,400 --> 00:39:23,760 è davvero solo questo, a destra. 886 00:39:23,760 --> 00:39:26,080 Se i è pari a zero, aggiungendo lo zero a qualcosa di presumibilmente 887 00:39:26,080 --> 00:39:27,540 non ha intenzione di avere un effetto. 888 00:39:27,540 --> 00:39:28,560 >> Così che cosa è questa parola? 889 00:39:28,560 --> 00:39:31,600 Si scopre che la stella operatore in questo contesto 890 00:39:31,600 --> 00:39:33,700 è il dereference operatore, che è solo 891 00:39:33,700 --> 00:39:37,530 un modo elegante per dire andare al seguente indirizzo. 892 00:39:37,530 --> 00:39:42,080 Quindi, se s è l'indirizzo del primo personaggio in questo pezzo di memoria, 893 00:39:42,080 --> 00:39:43,630 mezzi * s andare lì. 894 00:39:43,630 --> 00:39:45,630 E perché abbiamo disegnato l'immagine in questo modo, 895 00:39:45,630 --> 00:39:47,430 si può adottare la seguente modello mentale. 896 00:39:47,430 --> 00:39:51,030 Se questo è s, e tu dici s *, * s un po 'come scivoli e scale, 897 00:39:51,030 --> 00:39:54,540 se vi ricordate il gioco fin dall'infanzia, è come seguire quella freccia e andare 898 00:39:54,540 --> 00:39:55,570 all'indirizzo. 899 00:39:55,570 --> 00:39:57,080 >> * t è la stessa cosa. 900 00:39:57,080 --> 00:39:59,855 Così inizia qui, vai al suo pezzo. 901 00:39:59,855 --> 00:40:03,350 Non posso attingere questa schermata in quel modo. 902 00:40:03,350 --> 00:40:05,560 * t significa andare qui. 903 00:40:05,560 --> 00:40:08,830 E poi, il ciclo for è solo dicendo spostare questo personaggio qui, 904 00:40:08,830 --> 00:40:11,330 spostare questo personaggio qui, spostare questo personaggio qui. 905 00:40:11,330 --> 00:40:12,890 Ma come faccio a farlo l'incremento? 906 00:40:12,890 --> 00:40:15,430 Ho bisogno di disfare ciò che ho appena cancellato. 907 00:40:15,430 --> 00:40:18,140 Questo è ciò che generalmente chiamata l'aritmetica dei puntatori, che 908 00:40:18,140 --> 00:40:20,040 significa matematica con gli indirizzi. 909 00:40:20,040 --> 00:40:22,460 >> Se, in questo per ciclo, Continuo a incrementare i, 910 00:40:22,460 --> 00:40:26,880 ed s è un indirizzo e t è un indirizzo, se io continuo aggiungendo 1, 911 00:40:26,880 --> 00:40:31,406 che significa semplicemente andare avanti, e in avanti, e in avanti nella memoria. 912 00:40:31,406 --> 00:40:34,030 E 'come Oxford Street, la strada che l'edificio CS è acceso. 913 00:40:34,030 --> 00:40:36,490 Gli edifici CS è a 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Quindi, se si dovesse fare 33 Oxford Street più 1, 915 00:40:39,870 --> 00:40:42,870 che si porta a 34 Oxford Via, quindi 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 poi 36 Oxford Street, qualunque essi edifici sono in realtà - se esistono. 917 00:40:46,380 --> 00:40:50,540 E così, è tutto quello che stiamo facendo qui con l'aritmetica dei puntatori. 918 00:40:50,540 --> 00:40:53,820 >> Quindi è un modo eccellente di arcano di esprimere noi stessi. 919 00:40:53,820 --> 00:40:56,160 Ma tutto quello che sta succedendo sotto la cappa 920 00:40:56,160 --> 00:40:59,330 sta solo seguendo questi indirizzi, come seguire una mappa, se si vuole, 921 00:40:59,330 --> 00:41:02,692 o dopo le frecce come abbiamo disegnato sullo schermo. 922 00:41:02,692 --> 00:41:04,910 OK, molto da digerire. 923 00:41:04,910 --> 00:41:10,410 Tutta la domanda sulla sintassi, concetti, puntatori, malloc, o simili. 924 00:41:10,410 --> 00:41:11,480 Sì, qui prima. 925 00:41:11,480 --> 00:41:13,755 >> PUBBLICO: Allora, dove che dice * t uguale toupper * t, 926 00:41:13,755 --> 00:41:15,575 è che andando a capitalizzare tutte le lettere o solo-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, davvero bella domanda. 928 00:41:17,283 --> 00:41:19,805 Quindi, in questa linea qui, 31, è questa intenzione di capitalizzare 929 00:41:19,805 --> 00:41:21,430 la prima lettera o tutte le lettere. 930 00:41:21,430 --> 00:41:23,460 Quindi cerchiamo di rispondere che andando torna a principi primi. 931 00:41:23,460 --> 00:41:26,168 E primi principi qui voglio dire basta andare alle definizioni di base 932 00:41:26,168 --> 00:41:27,000 di ciò che è coinvolto. 933 00:41:27,000 --> 00:41:29,770 Quindi toupper è una funzione che capitalizza un char. 934 00:41:29,770 --> 00:41:30,530 Questo è tutto. 935 00:41:30,530 --> 00:41:36,740 * t significa andare al first-- andare all'indirizzo in t. 936 00:41:36,740 --> 00:41:40,350 Così, nella foto, se questo è il pezzo della memoria abbiamo stanziato con malloc, 937 00:41:40,350 --> 00:41:43,310 e questo è t, * t significa andare qui. 938 00:41:43,310 --> 00:41:46,710 >> Nel frattempo, si sta passando tale valore, m minuscola 939 00:41:46,710 --> 00:41:50,040 a toupper, che stai ricevendo indietro M maiuscola, dove stai mettendo esso? 940 00:41:50,040 --> 00:41:52,410 Si sta mettendo in quella stessa posizione. 941 00:41:52,410 --> 00:41:55,540 E così da questa logica di quelli definizioni di base è solo 942 00:41:55,540 --> 00:41:58,792 capitalizzando la prima lettera a meno che non si scorre con i o un 943 00:41:58,792 --> 00:42:02,000 per loop o un ciclo while, non sta andando a fare qualcosa di più di quello che chiedete. 944 00:42:02,000 --> 00:42:02,583 Bella domanda. 945 00:42:02,583 --> 00:42:03,237 Sì? 946 00:42:03,237 --> 00:42:05,369 >> PUBBLICO: Perché si utilizza il dereference metodo piuttosto che 947 00:42:05,369 --> 00:42:05,979 la matrice? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, bella domanda. 949 00:42:07,395 --> 00:42:10,672 Perché si usa il dereference il metodo invece del metodo array? 950 00:42:10,672 --> 00:42:12,130 Nessun motivo particolare, ad essere onesti. 951 00:42:12,130 --> 00:42:15,290 E, in effetti, per questo tipo di esempio, a destra, 952 00:42:15,290 --> 00:42:17,556 Sto solo sostenendo rendendo il programma più complicato, 953 00:42:17,556 --> 00:42:19,680 più gli occhi sono vetri sopra, persone stanno controllando 954 00:42:19,680 --> 00:42:22,830 perché questo sembra super arcano, ma anche se sta facendo la stessa cosa. 955 00:42:22,830 --> 00:42:26,695 E così, francamente, questo è un soluzione inutilmente visivamente complesso 956 00:42:26,695 --> 00:42:27,320 al problema. 957 00:42:27,320 --> 00:42:29,580 >> E 'ancora un buon design, cinque su cinque per la progettazione, 958 00:42:29,580 --> 00:42:33,140 se è nella staffa Notazione o la notazione puntatore. 959 00:42:33,140 --> 00:42:36,299 Ma-- soprattutto quando arriviamo più avanti nel corso di PSet 5 960 00:42:36,299 --> 00:42:39,340 quando implementiamo che dizionario che Ho citato un paio di times-- 961 00:42:39,340 --> 00:42:42,300 ci realmente a cuore la indirizzi di memoria di basso livello 962 00:42:42,300 --> 00:42:44,140 che abbiamo davvero capire cosa sta succedendo. 963 00:42:44,140 --> 00:42:48,300 >> Ma, per ora, si scopre che questo riga di codice parentesi quadre qui 964 00:42:48,300 --> 00:42:49,900 in realtà non esistono. 965 00:42:49,900 --> 00:42:52,230 Sono quello che si chiama zucchero sintattico, che 966 00:42:52,230 --> 00:42:58,390 è solo un modo stranamente fresco di dire la compilatore converte parentesi quadre siano 967 00:42:58,390 --> 00:43:00,420 che espressione matematica. 968 00:43:00,420 --> 00:43:02,660 Quindi è una convenzione umana per essere in grado di scrivere solo 969 00:43:02,660 --> 00:43:04,220 queste staffe molto user-friendly. 970 00:43:04,220 --> 00:43:06,850 Ma ciò che il compilatore, clang, sta realmente facendo qualsiasi momento 971 00:43:06,850 --> 00:43:10,970 si scrive ciò che è evidenziato in linea 24, sotto il cofano è davvero 972 00:43:10,970 --> 00:43:12,330 convertendolo in questo. 973 00:43:12,330 --> 00:43:16,200 E 'solo più piacevole come un essere umano per leggere e scrivere codice come linea 24. 974 00:43:16,200 --> 00:43:18,530 Ma alla fine quelli ruote di formazione anche venire fuori 975 00:43:18,530 --> 00:43:21,780 quando la propria comodità si fa più forte. 976 00:43:21,780 --> 00:43:27,240 >> Va bene, quindi ricordare poi che questo Era il tipo di problema più grande 977 00:43:27,240 --> 00:43:27,807 abbiamo incontrato. 978 00:43:27,807 --> 00:43:30,640 Ed è quello che ha scatenato tutto questo conversazione frega niente di puntatori, 979 00:43:30,640 --> 00:43:32,340 e indirizzi, e copia le cose. 980 00:43:32,340 --> 00:43:35,410 Era perché ci inciampò questo stupido, stupido problema, per cui 981 00:43:35,410 --> 00:43:38,830 Ho implementato logically-- con Lauren qui sul demo e il succo d'arancia 982 00:43:38,830 --> 00:43:43,770 nel milk-- perfettamente Funzione algoritmicamente corretto 983 00:43:43,770 --> 00:43:47,010 per scambiare due variabili ' valori, ma il dannato 984 00:43:47,010 --> 00:43:50,550 non ha avuto alcun persistente o permanente, effetto sul mio codice. 985 00:43:50,550 --> 00:43:51,820 >> E perché questo? 986 00:43:51,820 --> 00:43:54,650 In poche parole, perché è questo implementazione di scambio 987 00:43:54,650 --> 00:43:58,740 logicamente corretto, ma non ha alcun impatto sulle variabili che sono passati ad esso, 988 00:43:58,740 --> 00:44:01,119 come xey per principale? 989 00:44:01,119 --> 00:44:02,410 Qual era il nocciolo della questione? 990 00:44:02,410 --> 00:44:02,909 Sì? 991 00:44:02,909 --> 00:44:05,532 PUBBLICO: Perché ha fatto variabile copie della variabile nel passaggio 992 00:44:05,532 --> 00:44:06,240 attraverso la funzione. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Esattamente, quando si passa variabili in funzione, o argomenti 994 00:44:09,060 --> 00:44:11,030 in una funzione, sono passò la copia, che 995 00:44:11,030 --> 00:44:14,770 significa che per ottenere un identico alla ricerca modello di bit per xey, 996 00:44:14,770 --> 00:44:15,955 chiamato qui e b. 997 00:44:15,955 --> 00:44:18,080 E si può fare nulla vuoi con quelle copie, 998 00:44:18,080 --> 00:44:20,657 ma che stanno andando a non avere effetto sulla funzione chiamante. 999 00:44:20,657 --> 00:44:22,990 E, infatti, abbiamo pareggiato che immagine sullo schermo, richiamo 1000 00:44:22,990 --> 00:44:25,520 l'ultima volta, per cui se si davvero pensare a ciò che è 1001 00:44:25,520 --> 00:44:28,570 in corso sotto la hood-- se questa è la memoria del computer, 1002 00:44:28,570 --> 00:44:31,650 e qui è il pezzo di memoria in uso per principale, 1003 00:44:31,650 --> 00:44:34,020 questo è il pezzo di memoria utilizzata per lo swap, 1004 00:44:34,020 --> 00:44:37,090 e quindi, anche se principale ha due variabili, xey, 1005 00:44:37,090 --> 00:44:41,840 di swap potrebbe avere cercando identici valori, che sono entrambi 1 e 2, 1006 00:44:41,840 --> 00:44:44,520 ma sono completamente diversi blocchi di memoria. 1007 00:44:44,520 --> 00:44:46,130 >> Quindi abbiamo bisogno di una soluzione a questo. 1008 00:44:46,130 --> 00:44:51,580 E, francamente, sembrerebbe che ora avere una soluzione a questo problema, destra. 1009 00:44:51,580 --> 00:44:55,760 Se ora abbiamo la possibilità di manipolare le cose per mezzo di indirizzi 1010 00:44:55,760 --> 00:44:59,310 e, sorta di scivoli e scale stile, segui queste frecce 1011 00:44:59,310 --> 00:45:02,820 e andare ovunque vogliamo in memoria, non potremmo 1012 00:45:02,820 --> 00:45:06,220 risolvere questo problema passando da principale per scambiare 1013 00:45:06,220 --> 00:45:09,650 non i valori che vogliamo scambio, ma solo intuitivamente 1014 00:45:09,650 --> 00:45:11,630 quello che abbiamo potuto passare di scambiare invece? 1015 00:45:11,630 --> 00:45:12,620 >> [VOICES interponendo] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Perché non solo passarlo gli indirizzi, giusto? 1017 00:45:15,244 --> 00:45:17,470 Perché non diamo una di swap mappa del tesoro, se si vuole, 1018 00:45:17,470 --> 00:45:20,950 che conduce al valori reali xe y. 1019 00:45:20,950 --> 00:45:24,340 Facciamo di swap, effettivamente cambiare i bit originali, anziché 1020 00:45:24,340 --> 00:45:26,797 solo di passaggio le copie dei bit. 1021 00:45:26,797 --> 00:45:29,130 E così, infatti, che è ciò che è andando a essere la soluzione. 1022 00:45:29,130 --> 00:45:31,899 Questa versione è qui chiaramente male e imperfetta. 1023 00:45:31,899 --> 00:45:35,190 E ora, a prima vista, sembra proprio come abbiamo aggiunto un gruppo di stelle in modo casuale 1024 00:45:35,190 --> 00:45:37,106 e attraversato le nostre dita che avrebbe compilato. 1025 00:45:37,106 --> 00:45:38,460 Ma, sarebbe ora la compilazione. 1026 00:45:38,460 --> 00:45:40,090 >> Ma vediamo che cosa significano queste cose. 1027 00:45:40,090 --> 00:45:43,990 E, purtroppo, gli autori di C avrebbe potuto scegliere un altro simbolo 1028 00:45:43,990 --> 00:45:46,380 per rendere questo un po ' chiara, ma l'operatore stella 1029 00:45:46,380 --> 00:45:48,610 ha significato diverso in due contesti diversi. 1030 00:45:48,610 --> 00:45:50,890 E abbiamo visto entrambi, ma cerchiamo di distinguere. 1031 00:45:50,890 --> 00:45:55,310 >> Così in cima lì, quando ho cambiato A e B 1032 00:45:55,310 --> 00:46:00,470 dall'essere Int di nella cattiva versione a int stelle, a e b, 1033 00:46:00,470 --> 00:46:01,740 in precedenza, sono stati interi. 1034 00:46:01,740 --> 00:46:05,752 Quali sono a e b ora in il bene, versione verde? 1035 00:46:05,752 --> 00:46:06,900 Sono indirizzi. 1036 00:46:06,900 --> 00:46:09,610 Indirizzi di ciò che, per essere chiari? 1037 00:46:09,610 --> 00:46:10,770 Indirizzi di interi. 1038 00:46:10,770 --> 00:46:12,520 Quindi il fatto che io sono dicendo mezzi int stella 1039 00:46:12,520 --> 00:46:15,440 questo è l'indirizzo del un numero intero, specificamente. 1040 00:46:15,440 --> 00:46:19,120 >> Così ora notare nelle righe di codice, un'altra cosa è cambiato troppo. 1041 00:46:19,120 --> 00:46:22,770 tmp rimane lo stesso, perché è solo il numero intero temporanea, 1042 00:46:22,770 --> 00:46:24,110 nessuna memoria magia lì. 1043 00:46:24,110 --> 00:46:26,370 Ma un ora ha bisogno di una stella. 1044 00:46:26,370 --> 00:46:28,560 E, infatti, ogni altra menzione di ae b, 1045 00:46:28,560 --> 00:46:31,780 notare che tutto ciò che è cambia dal rosso al verde 1046 00:46:31,780 --> 00:46:34,209 è che io sto prefisso le variabili con le stelle. 1047 00:46:34,209 --> 00:46:35,750 Perché io non voglio copiare a e b. 1048 00:46:35,750 --> 00:46:40,350 Perché se io copio solo A e B e di scambio A e B, che cosa sono io in realtà scambiando? 1049 00:46:40,350 --> 00:46:43,760 A soli indirizzi, voglio scambiare cosa c'è in quegli indirizzi. 1050 00:46:43,760 --> 00:46:44,860 Voglio andare là. 1051 00:46:44,860 --> 00:46:48,000 E così l'operatore stella all'interno della mia funzione, 1052 00:46:48,000 --> 00:46:51,700 non all'interno dell'elenco dei parametri, significa che si va a quegli indirizzi 1053 00:46:51,700 --> 00:46:54,490 ed effettivamente modificare tali valori. 1054 00:46:54,490 --> 00:46:56,500 >> Così che cosa l'immagine apparire come invece. 1055 00:46:56,500 --> 00:47:03,250 Beh, se invece sto passando in per A e B non 1 e 2-- 1056 00:47:03,250 --> 00:47:05,790 Io in realtà bisogno di aggiungere un altra definizione qui. 1057 00:47:05,790 --> 00:47:09,030 Quindi supponiamo che questo pezzo di memoria è in posizione 10. 1058 00:47:09,030 --> 00:47:12,960 >> Questo è in posizione 11, ma questo è un po 'di una semplificazione, 1059 00:47:12,960 --> 00:47:18,900 Ora ho due scelte faccio a passare x e y o faccio a passare i loro indirizzi? 1060 00:47:18,900 --> 00:47:22,500 Se io passo i loro indirizzi in questo modo, ho appena 1061 00:47:22,500 --> 00:47:25,390 ora bisogno di attuare di swap per il codice verde 1062 00:47:25,390 --> 00:47:29,080 in modo che quando si vede un e quando b vede, non solo una copia e b 1063 00:47:29,080 --> 00:47:30,540 e spostare il latte e succo d'arancia. 1064 00:47:30,540 --> 00:47:32,664 Il latte e succo d'arancia metafora ora si rompe, 1065 00:47:32,664 --> 00:47:35,060 perché quelli sono coppe mappe di liquidi e non. 1066 00:47:35,060 --> 00:47:37,750 Abbiamo invece bisogno di andare per affrontare 10 e noi 1067 00:47:37,750 --> 00:47:42,420 bisogno di andare ad affrontare 11, e quindi eseguire questa logica swapping. 1068 00:47:42,420 --> 00:47:45,580 >> Così la logica è lo stesso, ma abbiamo bisogno di un modo leggermente diverso 1069 00:47:45,580 --> 00:47:47,160 di accedere a tali variabili. 1070 00:47:47,160 --> 00:47:52,400 E così, alla fine, ciò che il programma deve assomigliare a questo. 1071 00:47:52,400 --> 00:47:56,610 In swap.ce letteralmente copiato e incollato la versione verde. 1072 00:47:56,610 --> 00:47:58,450 Ma ho bisogno di fare un cambiamento. 1073 00:47:58,450 --> 00:48:00,180 Non è sufficiente solo per cambiare swap. 1074 00:48:00,180 --> 00:48:03,830 Quale altra riga di codice devo cambiare? 1075 00:48:03,830 --> 00:48:04,330 Sì? 1076 00:48:04,330 --> 00:48:05,770 >> PUBBLICO: Dove ci vogliono gli argomenti. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Dove prende il suo argomento. 1078 00:48:07,603 --> 00:48:09,985 Quindi, se ho scorrere fino al principale, ho non si può semplicemente passare xey, 1079 00:48:09,985 --> 00:48:12,820 e, lo prometto, l'ultimo pezzo di nuova sintassi oggi. 1080 00:48:12,820 --> 00:48:17,200 Ho bisogno di passare a non xe y ma l'indirizzo di xe y. 1081 00:48:17,200 --> 00:48:20,400 E si scopre, il simbolo che di C gli autori hanno scelto 1082 00:48:20,400 --> 00:48:23,860 è se si utilizza una e commerciale qui, per non essere confuso con la e commerciale bit per bit, 1083 00:48:23,860 --> 00:48:27,130 se si utilizza una e commerciale qui e una e commerciale qui, 1084 00:48:27,130 --> 00:48:29,570 questo capisce per voi, qual è l'indirizzo di x, 1085 00:48:29,570 --> 00:48:31,740 forse è 10, qual è la indirizzo di y, forse è 1086 00:48:31,740 --> 00:48:35,400 11, e passa in quelli invece. 1087 00:48:35,400 --> 00:48:37,210 >> Così un sacco di assorbire tutto in una volta. 1088 00:48:37,210 --> 00:48:40,190 Ma vediamo ora rapidamente i nostri restanti quattro minuti 1089 00:48:40,190 --> 00:48:42,150 dove le cose possono andare storte. 1090 00:48:42,150 --> 00:48:45,120 E per inciso, in realtà Ho scattato questa foto, 1091 00:48:45,120 --> 00:48:46,920 TF ha preso questa immagine di un anno o due fa. 1092 00:48:46,920 --> 00:48:49,190 Quindi questo è l'angolo posteriore di Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Puntatori sono forse il più difficile argomento che copriamo in CS50. 1094 00:48:52,310 --> 00:48:54,810 Quindi, se vi preoccupate il tipo di salita è come forse è 1095 00:48:54,810 --> 00:48:56,770 più di un bastone da hockey in questo modo, realizzare 1096 00:48:56,770 --> 00:49:00,160 ci stiamo avvicinando tipo di un picco nel termini di complessità concettuale. 1097 00:49:00,160 --> 00:49:02,300 >> E io portare questo foto, perché lo giuro 1098 00:49:02,300 --> 00:49:05,920 a Dio, in autunno 1996, quando ho preso CS50 con il mio compagno di insegnamento, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, mi si sedette nella angolo del Eliot D. sala durante il pranzo, 1100 00:49:09,620 --> 00:49:12,330 o cena, o qualcosa da provare per aiutarmi a capire i puntatori. 1101 00:49:12,330 --> 00:49:16,520 E questo è dove ero settimane dopo è stato introdotto in conferenza quando 1102 00:49:16,520 --> 00:49:18,170 Ho finalmente capito puntatori. 1103 00:49:18,170 --> 00:49:20,590 E sono fiducioso che questo si clicca molto prima per voi. 1104 00:49:20,590 --> 00:49:23,540 Ma realizzare questo assolutamente tra gli argomenti più sofisticati 1105 00:49:23,540 --> 00:49:24,420 abbiamo esaminato. 1106 00:49:24,420 --> 00:49:25,819 Ma è tra i più potenti. 1107 00:49:25,819 --> 00:49:28,860 E quando si arriva, è davvero tutto solo andando a venire finalmente insieme. 1108 00:49:28,860 --> 00:49:31,460 Quindi state tranquilli non è così bisogno di tutto lavandino in oggi. 1109 00:49:31,460 --> 00:49:32,980 >> Quindi, ecco l'ultimo programma stiamo andando a guardare. 1110 00:49:32,980 --> 00:49:35,605 E stiamo andando a finire con un veloci tre minuti di claymation 1111 00:49:35,605 --> 00:49:37,030 realizzato dal nostro amico, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Ecco un programma, che sulla parte superiore di due linee dichiara una variabile xe y. 1113 00:49:41,440 --> 00:49:44,780 Entrambi i quali sono gli indirizzi di interi, puntatori AKA. 1114 00:49:44,780 --> 00:49:48,125 Abbiamo poi allocare abbastanza memoria per memorizzare un int 1115 00:49:48,125 --> 00:49:51,344 e memorizzare l'indirizzo di quella memoria di x. 1116 00:49:51,344 --> 00:49:53,260 Quindi, è ancora più semplice rispetto all'esempio precedente. 1117 00:49:53,260 --> 00:49:56,100 Datemi quattro byte di memoria, che è la dimensione di un int, 1118 00:49:56,100 --> 00:49:58,000 e mettere l'indirizzo di x. 1119 00:49:58,000 --> 00:50:01,070 Questa riga qui significa andare all'indirizzo di x 1120 00:50:01,070 --> 00:50:05,270 e mettere il significato di la vita, il numero 42 c'è. 1121 00:50:05,270 --> 00:50:07,710 Ma questa linea mi preoccupa. 1122 00:50:07,710 --> 00:50:12,620 A stella Y significa andare all'indirizzo di y, e mettere il numero sfortunato 13 lì. 1123 00:50:12,620 --> 00:50:15,780 Perché è pericoloso, a questo punto nei tutta-- seppur rapidamente detto 1124 00:50:15,780 --> 00:50:17,980 nei nostri minuti calante qui-- perché è cattivo 1125 00:50:17,980 --> 00:50:19,660 per me dire, andare all'indirizzo di y? 1126 00:50:19,660 --> 00:50:21,077 >> PUBBLICO: non avete [incomprensibile]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: non ho mettere qualcosa in a. 1128 00:50:22,910 --> 00:50:25,520 Allora, qual è il valore di y, a questo punto della storia? 1129 00:50:25,520 --> 00:50:26,570 Non abbiamo idea. 1130 00:50:26,570 --> 00:50:29,190 E 'certo valore spazzatura e né sa Binky. 1131 00:50:29,190 --> 00:50:32,532 Se potessimo finire in questa nota. 1132 00:50:32,532 --> 00:50:34,832 >> [RIPRODUZIONE VIDEO] 1133 00:50:34,832 --> 00:50:36,500 >> Ehi, Binky, svegliati. 1134 00:50:36,500 --> 00:50:39,140 E 'il momento per l'indicatore del divertimento. 1135 00:50:39,140 --> 00:50:40,210 >> -Che cos'è? 1136 00:50:40,210 --> 00:50:41,690 Ulteriori informazioni su puntatori? 1137 00:50:41,690 --> 00:50:43,570 Oh, Goody. 1138 00:50:43,570 --> 00:50:46,600 >> -Bene, Per iniziare, credo che siamo andando a bisogno di un paio di puntatori. 1139 00:50:46,600 --> 00:50:47,380 >> -OK. 1140 00:50:47,380 --> 00:50:51,120 Questo codice assegna due puntatori che può puntare a numeri interi. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Beh vedo il due puntatori, ma che 1142 00:50:53,557 --> 00:50:55,140 non sembrano essere che punta a qualsiasi cosa. 1143 00:50:55,140 --> 00:50:55,970 >> -Giusto. 1144 00:50:55,970 --> 00:50:58,100 Inizialmente puntatori non puntare a nulla. 1145 00:50:58,100 --> 00:51:00,950 Le cose a cui puntano sono chiamato pointees e impostandole 1146 00:51:00,950 --> 00:51:02,330 è una fase separata. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, giusto, giusto. 1148 00:51:03,210 --> 00:51:03,940 Sapevo che. 1149 00:51:03,940 --> 00:51:05,730 I pointees sono separati. 1150 00:51:05,730 --> 00:51:08,310 Così come si fa assegnare una pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Anche questo codice alloca un nuovo pointee intero, 1152 00:51:11,960 --> 00:51:15,050 e questo imposta parte x per puntare ad esso. 1153 00:51:15,050 --> 00:51:16,240 >> Ehi, che sembra meglio. 1154 00:51:16,240 --> 00:51:17,743 Così fargli fare qualcosa. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Io dereference il puntatore x a memorizzare il numero 42 nella sua pointee. 1156 00:51:23,580 --> 00:51:27,130 Per questo trucco, avrò bisogno la mia bacchetta magica di dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> -La Tua bacchetta magica di dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh, che, che è grande. 1159 00:51:32,310 --> 00:51:34,270 >> -Questo È quello che il codice assomiglia. 1160 00:51:34,270 --> 00:51:35,970 Mi limiterò a impostare il numero di e- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Ehi, guarda lì si va. 1163 00:51:39,140 --> 00:51:43,980 Quindi, facendo un dereference su x segue la freccia per accedere sua pointee. 1164 00:51:43,980 --> 00:51:46,150 In questo caso, per memorizzare 42 lì. 1165 00:51:46,150 --> 00:51:50,700 Ehi, provare a utilizzare per memorizzare il numero 13 attraverso l'altro puntatore, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OK. 1167 00:51:51,840 --> 00:51:56,270 Vado a qui per y, e ottenere il numero 13 set up. 1168 00:51:56,270 --> 00:52:00,380 E poi prendere la bacchetta di dereferencing e solo-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER AUDIO] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey che non ha funzionato. 1171 00:52:04,080 --> 00:52:06,470 Di ', uh, Binky, non lo faccio pensare dereferencing 1172 00:52:06,470 --> 00:52:10,850 y è una buona idea, perché l'impostazione il pointee è una fase separata. 1173 00:52:10,850 --> 00:52:12,480 E non credo che abbiamo mai fatto. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Buon punto. 1175 00:52:14,620 --> 00:52:19,810 >> -Già, Abbiamo assegnato il puntatore, y, ma non abbiamo mai impostiamo a puntare a un pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Molto attento. 1177 00:52:21,590 --> 00:52:23,215 Ehi, stai guardando bene lì, Binky. 1178 00:52:23,215 --> 00:52:26,390 Riesci a risolvere il problema in modo che i punti y allo stesso pointee come x. 1179 00:52:26,390 --> 00:52:29,290 >> -Certo, Io uso la mia bacchetta magica di puntatore assegnazione. 1180 00:52:29,290 --> 00:52:31,970 >> -È Che sta per essere un problema, come prima? 1181 00:52:31,970 --> 00:52:33,790 >> No, questo non tocca i pointees. 1182 00:52:33,790 --> 00:52:35,840 Cambia solo un puntatore per puntare allo stesso cosa-- 1183 00:52:35,840 --> 00:52:36,465 >> [SCHIOCCANDO SOUND] 1184 00:52:36,465 --> 00:52:37,450 -come un'altra. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh ho visto. 1186 00:52:38,440 --> 00:52:41,200 Ora y punti allo stesso luogo di x. 1187 00:52:41,200 --> 00:52:42,950 Quindi, attendere, ora y è fissato. 1188 00:52:42,950 --> 00:52:44,110 Ha un pointee. 1189 00:52:44,110 --> 00:52:47,779 Così si può provare la bacchetta di dereferencing di nuovo per inviare il 13 sopra. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, qui va. 1191 00:52:51,110 --> 00:52:52,330 >> Ehi, guarda che. 1192 00:52:52,330 --> 00:52:53,570 Ora dereferencing opere a. 1193 00:52:53,570 --> 00:52:57,900 E poiché i puntatori sono la condivisione che uno pointee, entrambi vedono il 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Sì, Condivisione, uh, qualunque cosa. 1195 00:52:59,952 --> 00:53:01,535 Quindi, abbiamo intenzione di cambiare posti ora? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, guarda che siamo fuori tempo massimo. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Basta Ricordare le tre regole puntatore. 1199 00:53:06,520 --> 00:53:09,550 Numero 1, la struttura di base è che avete un puntatore, 1200 00:53:09,550 --> 00:53:11,630 e che punti verso un pointee. 1201 00:53:11,630 --> 00:53:13,740 Ma il puntatore e pointee sono separati. 1202 00:53:13,740 --> 00:53:15,620 E l'errore comune è di creare un puntatore 1203 00:53:15,620 --> 00:53:18,000 ma a dimenticare di dare un pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Numero 2, puntatore dereferenziazione inizia al puntatore 1205 00:53:21,170 --> 00:53:24,020 e segue la sua freccia sopra per accedere alla pointee. 1206 00:53:24,020 --> 00:53:27,815 Come tutti sappiamo, questo funziona solo se c'è è un pointee, che tipo di ottiene indietro 1207 00:53:27,815 --> 00:53:29,260 alla regola numero 1. 1208 00:53:29,260 --> 00:53:31,990 >> Numero 3, puntatore assegnazione prende un puntatore 1209 00:53:31,990 --> 00:53:35,330 e lo cambia per puntare al stesso pointee come un altro puntatore. 1210 00:53:35,330 --> 00:53:37,150 Così, dopo l'assegnazione, i due puntatori 1211 00:53:37,150 --> 00:53:40,927 punterà alla stessa pointee, a volte che si chiama la condivisione. 1212 00:53:40,927 --> 00:53:42,510 E questo è tutto ciò che devi fare, davvero. 1213 00:53:42,510 --> 00:53:43,130 Addio ora. 1214 00:53:43,130 --> 00:53:43,475 >> [FINE RIPRODUZIONE] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Questo è tutto per CS50. 1216 00:53:44,830 --> 00:53:46,246 Grazie al professor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Ci vediamo la prossima settimana. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [RIPRODUZIONE MUSICA ELETTRONICA] 1220 00:53:56,435 --> 00:57:22,775