1 00:00:00,000 --> 00:00:01,110 >> [GIOCO MUSICA] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. MALAN: Va bene. 4 00:00:11,650 --> 00:00:15,610 Questo è CS50, e questo è la fine della quarta settimana. 5 00:00:15,610 --> 00:00:19,420 E uno dei temi oggi è quello della digital forensics, 6 00:00:19,420 --> 00:00:20,989 l'arte di recuperare informazioni. 7 00:00:20,989 --> 00:00:22,780 E infatti, anche se siete nel bel mezzo 8 00:00:22,780 --> 00:00:25,070 in questo momento di pace a tre e Breakout, la prossima settimana, 9 00:00:25,070 --> 00:00:27,880 l'attenzione sarà focalizzata sulla Proprio questo dominio. 10 00:00:27,880 --> 00:00:30,686 >> Così uno dei lavori più cool che mai avuto era tornato a scuola di specializzazione, 11 00:00:30,686 --> 00:00:33,560 quando lavoravo per il locale Middlesex County procuratore distrettuale di 12 00:00:33,560 --> 00:00:34,950 ufficio, forensics fare il lavoro. 13 00:00:34,950 --> 00:00:37,450 Quindi, in sostanza, il Massachusetts Polizia di Stato, in occasione, 14 00:00:37,450 --> 00:00:40,100 quando si lavora su casi sarebbe portare a cose come hard disk 15 00:00:40,100 --> 00:00:42,185 e floppy disk e schede di memoria e simili. 16 00:00:42,185 --> 00:00:44,060 E li avrebbero portata di mano a me e il mio mentore, 17 00:00:44,060 --> 00:00:48,070 e il nostro obiettivo era quello di trovare le prove, se c'era, su questi terreni. 18 00:00:48,070 --> 00:00:50,700 Ora, potreste aver visto scorci di questo mondo di medicina legale 19 00:00:50,700 --> 00:00:53,000 nei media, TV e film. 20 00:00:53,000 --> 00:00:55,730 Ma il lavoro che ho avuto, e Oserei dire che il mondo, 21 00:00:55,730 --> 00:00:57,550 non è abbastanza come volete vederlo. 22 00:00:57,550 --> 00:01:00,794 Diamo un'occhiata a ciò che probabilmente avete visto. 23 00:01:00,794 --> 00:01:01,460 [RIPRODUZIONE VIDEO] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Ora, mettiamoci una buona occhiata a voi. 26 00:01:05,380 --> 00:01:06,850 >> [GIOCO MUSICA] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -hold Esso. 29 00:01:12,932 --> 00:01:13,657 Eseguire che indietro. 30 00:01:13,657 --> 00:01:14,733 >> -wait Un minuto. 31 00:01:14,733 --> 00:01:15,233 Andate a destra. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Ci. 34 00:01:16,870 --> 00:01:17,369 Congelare tale. 35 00:01:17,369 --> 00:01:17,930 Full-screen. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Congelare tale. 38 00:01:18,875 --> 00:01:20,160 -Tighten Su quella, vero? 39 00:01:20,160 --> 00:01:22,126 >> -vector In esso ragazzo dalla ruota posteriore. 40 00:01:22,126 --> 00:01:24,435 >> -zoom In proprio qui su questo luogo. 41 00:01:24,435 --> 00:01:28,580 >> -Con La giusta attrezzatura, il l'immagine può essere ingrandita e affilata. 42 00:01:28,580 --> 00:01:29,330 >> -Che È? 43 00:01:29,330 --> 00:01:30,780 >> -È Un programma di miglioramento. 44 00:01:30,780 --> 00:01:32,170 >> -Puoi Chiaro che qualsiasi? 45 00:01:32,170 --> 00:01:33,070 >> -Non Lo so. 46 00:01:33,070 --> 00:01:34,150 Facciamo valorizzarlo. 47 00:01:34,150 --> 00:01:35,440 >> -e La valorizzazione Sezione A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Ho migliorato il dettaglio, e-- 50 00:01:38,562 --> 00:01:40,020 -I Credo che ci sia sufficiente a migliorare. 51 00:01:40,020 --> 00:01:40,976 Rilasciare al mio schermo. 52 00:01:40,976 --> 00:01:42,559 >> -I Migliorato la riflessione nel suo occhio. 53 00:01:42,559 --> 00:01:44,322 -Let Gestito questo attraverso correzione video. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Si può migliorare questo? 55 00:01:45,210 --> 00:01:45,710 >> -hang Su. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Ho Lavorato su questa riflessione. 58 00:01:49,458 --> 00:01:50,402 >> La riflessione di qualcun -Ci. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -C'è Un riflesso del volto dell'uomo. 61 00:01:52,870 --> 00:01:53,694 >> Riflessione -Il! 62 00:01:53,694 --> 00:01:54,610 -C'è Una riflessione. 63 00:01:54,610 --> 00:01:55,880 -zoom In sullo specchio. 64 00:01:55,880 --> 00:01:57,860 Si può vedere un riflesso. 65 00:01:57,860 --> 00:01:59,630 >> -Can A migliorare l'immagine da qui? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Can A migliorare esso? 68 00:02:01,210 --> 00:02:02,190 -Can A migliorare esso? 69 00:02:02,190 --> 00:02:03,066 -Può Aumentiamo questo? 70 00:02:03,066 --> 00:02:03,898 -Can A migliorare esso? 71 00:02:03,898 --> 00:02:04,740 -hold Su un secondo. 72 00:02:04,740 --> 00:02:05,281 Io Migliora. 73 00:02:05,281 --> 00:02:06,470 -zoom In sulla porta. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 -Muovi In. 77 00:02:08,509 --> 00:02:09,340 -Più. 78 00:02:09,340 --> 00:02:10,094 -Aspetta, Stop. 79 00:02:10,094 --> 00:02:10,750 -Stop. 80 00:02:10,750 --> 00:02:11,250 -PAUSE Esso. 81 00:02:11,250 --> 00:02:13,542 Ci -rotate 75 gradi attorno alla verticale, per favore. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -Stop. 84 00:02:16,127 --> 00:02:19,330 Torna alla parte sulla porta di nuovo. 85 00:02:19,330 --> 00:02:21,420 >> -Got Intensificatore di immagine che può bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -Forse Possiamo usare il Pradeep Singh metodo per vedere le vetrine. 87 00:02:24,420 --> 00:02:25,902 >> -Il Software è lo stato dell'arte. 88 00:02:25,902 --> 00:02:26,866 >> -Il Autovalore è spento. 89 00:02:26,866 --> 00:02:29,758 >> -Con Destra combinazione di algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Preso l'illuminazione di -Lui algoritmi per il livello successivo, 91 00:02:32,168 --> 00:02:34,110 e io li posso usare per migliorare questa fotografia. 92 00:02:34,110 --> 00:02:36,840 >> -lock Su e ingrandire l'asse z. 93 00:02:36,840 --> 00:02:37,351 >> -e La valorizzazione. 94 00:02:37,351 --> 00:02:37,850 Migliora. 95 00:02:37,850 --> 00:02:38,720 -e La valorizzazione. 96 00:02:38,720 --> 00:02:40,070 -Freeze E migliorare. 97 00:02:40,070 --> 00:02:43,420 [FINE RIPRODUZIONE VIDEO] 98 00:02:43,420 --> 00:02:45,830 DAVID J. MALAN: Così quelli sono tutte le parole, ma non erano 99 00:02:45,830 --> 00:02:47,870 utilizzato in frasi correttamente. 100 00:02:47,870 --> 00:02:52,370 E infatti, in futuro, in qualsiasi momento, per favore, si sente qualcuno dire la parola, 101 00:02:52,370 --> 00:02:54,250 "Migliorare" risatina solo un po '. 102 00:02:54,250 --> 00:02:57,190 Perché quando si tenta di migliorare, per esempio, questo è ciò che accade. 103 00:02:57,190 --> 00:02:58,580 >> Quindi, ecco una foto bellissima. 104 00:02:58,580 --> 00:02:59,720 Questo è proprio Daven del CS50. 105 00:02:59,720 --> 00:03:03,740 E supponiamo che volevamo concentrarsi sulla scintillio negli occhi, 106 00:03:03,740 --> 00:03:05,870 o la riflessione della cattivo ragazzo che era chiaramente 107 00:03:05,870 --> 00:03:07,820 catturata dalla telecamera di sicurezza. 108 00:03:07,820 --> 00:03:10,330 Questo è ciò che accade quando si ingrandisce un'immagine che 109 00:03:10,330 --> 00:03:14,060 ha solo un numero finito di bit ad esso associati. 110 00:03:14,060 --> 00:03:15,420 >> Questo è ciò che si ottiene. 111 00:03:15,420 --> 00:03:19,190 E infatti, negli occhi di Daven è ma quattro, forse sei pixel 112 00:03:19,190 --> 00:03:22,110 che compongono esattamente quello è stato scintillante lì. 113 00:03:22,110 --> 00:03:25,890 Così Problema Set Quattro infine avrà esplorare questo mondo, in particolare 114 00:03:25,890 --> 00:03:28,090 dalla natura di qualcosa noi chiamiamo il file I / O, dove 115 00:03:28,090 --> 00:03:31,000 I / O è solo un modo elegante di dicendo ingresso e uscita. 116 00:03:31,000 --> 00:03:34,280 >> Quindi finora, tutte le interazioni abbiamo avuto con un computer 117 00:03:34,280 --> 00:03:36,770 sono stati in gran parte con il tastiera e lo schermo, 118 00:03:36,770 --> 00:03:40,770 ma non tanto con il disco rigido, o il salvataggio di file oltre quelli che 119 00:03:40,770 --> 00:03:41,620 te scrivere. 120 00:03:41,620 --> 00:03:44,570 I vostri programmi finora hanno non state creando e salvando, 121 00:03:44,570 --> 00:03:46,270 e aggiornare i propri file. 122 00:03:46,270 --> 00:03:47,150 >> Beh, che cosa è un file? 123 00:03:47,150 --> 00:03:48,105 Beh, qualcosa come un JPEG. 124 00:03:48,105 --> 00:03:50,520 Questa è l'immagine che si potrebbe avere o caricare su Facebook, 125 00:03:50,520 --> 00:03:51,690 o consultare ovunque sul web. 126 00:03:51,690 --> 00:03:54,460 In effetti, quella foto che abbiamo appena sega di Daven era un JPEG. 127 00:03:54,460 --> 00:03:57,570 E cosa c'è di interessante sui file come JPEG 128 00:03:57,570 --> 00:04:02,170 è che possono essere identificati, in genere, da certi schemi di bit. 129 00:04:02,170 --> 00:04:05,200 >> In altre parole, cos'è che distingue un JPEG da una GIF 130 00:04:05,200 --> 00:04:08,109 da un PING da un Word documento da un file di Excel? 131 00:04:08,109 --> 00:04:09,900 Beh, è ​​solo diverso pattern di bit. 132 00:04:09,900 --> 00:04:12,820 E quei diversi modelli sono solitamente all'inizio di tali file. 133 00:04:12,820 --> 00:04:18,200 >> In modo che quando il computer si apre una Parola doc, o quando un computer si apre un file JPEG, 134 00:04:18,200 --> 00:04:20,940 sembra tipicamente alla prime più bit nel file. 135 00:04:20,940 --> 00:04:24,059 E se riconosce un modello, si dice, oh, questa è l'immagine. 136 00:04:24,059 --> 00:04:25,850 Permettetemi lo mostro a l'utente come un grafico. 137 00:04:25,850 --> 00:04:27,870 In alternativa, oh, questo appare come un documento di Word. 138 00:04:27,870 --> 00:04:30,480 Mi permetta di mostrare all'utente come un saggio. 139 00:04:30,480 --> 00:04:33,020 >> Così, per esempio, JPEG, si scopre, sono 140 00:04:33,020 --> 00:04:35,460 abbastanza sofisticato sotto la cappa. 141 00:04:35,460 --> 00:04:40,140 Ma i primi tre byte in più ogni JPEG iniziare con questi tre numeri. 142 00:04:40,140 --> 00:04:44,680 Così byte zero, uno e due sono, in più ogni JPEG, 255, allora il numero 143 00:04:44,680 --> 00:04:46,675 216, poi il numero 255. 144 00:04:46,675 --> 00:04:48,990 >> E che cosa sarete in grado per iniziare a fare la prossima settimana 145 00:04:48,990 --> 00:04:52,920 è in realtà frugando sotto la cappa di file come file JPEG 146 00:04:52,920 --> 00:04:57,210 e come file bitmap, e vedendo quello che è sempre stato lì per tutto il tempo 147 00:04:57,210 --> 00:04:58,650 come sei stato utilizzando un computer. 148 00:04:58,650 --> 00:05:01,860 >> Ma ciò che è non vi è in genere scritto come numeri decimali come questo. 149 00:05:01,860 --> 00:05:04,620 Gli informatici non lo fanno tendono a parlare in decimale. 150 00:05:04,620 --> 00:05:06,139 Essi in realtà non parlano in binario. 151 00:05:06,139 --> 00:05:07,930 In genere, quando vogliamo per esprimere i numeri, 152 00:05:07,930 --> 00:05:10,710 abbiamo effettivamente utilizziamo esadecimale, che si può ricordare 153 00:05:10,710 --> 00:05:13,027 da, diciamo, Problem Set Uno, che ha sfidato 154 00:05:13,027 --> 00:05:14,610 a pensare a un sistema diverso. 155 00:05:14,610 --> 00:05:17,170 >> Noi, naturalmente, conosciamo con decimali, da zero a nove. 156 00:05:17,170 --> 00:05:18,215 Abbiamo parlato di binario. 157 00:05:18,215 --> 00:05:20,710 E in realtà non abbiamo utilizzare più di tanto qui 158 00:05:20,710 --> 00:05:22,470 in avanti, perché i computer che utilizzeranno. 159 00:05:22,470 --> 00:05:24,900 Ma i programmatori sarà molto spesso, ma non sempre, 160 00:05:24,900 --> 00:05:29,360 utilizzare esadecimale, che significa semplicemente si hanno 16 lettere nel vostro alfabeto, 161 00:05:29,360 --> 00:05:31,330 al contrario di due o 10. 162 00:05:31,330 --> 00:05:34,530 >> Così come si conta di più alto di nove in esadecimale? 163 00:05:34,530 --> 00:05:41,120 Si va 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, solo per convenzione. 164 00:05:41,120 --> 00:05:43,540 Ma ciò che è fondamentale è che ogni di questi è un unico simbolo. 165 00:05:43,540 --> 00:05:44,340 Non esiste 10. 166 00:05:44,340 --> 00:05:48,400 Non c'è 11, di per sé, poiché ogni delle vostre cifre, proprio come in decimale 167 00:05:48,400 --> 00:05:51,940 e proprio come in binario, dovrebbe solo essere un singolo carattere, per convenzione. 168 00:05:51,940 --> 00:05:55,280 >> In modo che poi è l'alfabeto che abbiamo a nostra disposizione per esadecimale. 169 00:05:55,280 --> 00:05:58,600 Che cosa fa un JPEG apparire come se si dovevano scrivere quelle prime tre 170 00:05:58,600 --> 00:06:01,980 Non byte come decimale, ma, per esempio, come esadecimale? 171 00:06:01,980 --> 00:06:03,640 E perché è hex anche tutto ciò che è utile? 172 00:06:03,640 --> 00:06:05,290 >> Beh, un rapido sguardo a un esempio. 173 00:06:05,290 --> 00:06:09,030 Quindi se scrivo i bit che rappresentare questi numbers-- decimale 174 00:06:09,030 --> 00:06:12,450 questo potrebbe essere un po 'arrugginito ormai da un paio di settimane fa, 175 00:06:12,450 --> 00:06:14,820 ma la sinistra e la quello di destra è abbastanza facile. 176 00:06:14,820 --> 00:06:17,990 255 era il numero più grande che potrebbe rappresentare con otto bit. 177 00:06:17,990 --> 00:06:18,820 Era tutti quelli. 178 00:06:18,820 --> 00:06:21,320 Quindi l'unico che è leggermente interessante è quella centrale. 179 00:06:21,320 --> 00:06:24,700 E se i tipi di fate fuori del matematica, si deduce che, in effetti, 180 00:06:24,700 --> 00:06:27,949 quel modello di uno e zeri rappresenta 216. 181 00:06:27,949 --> 00:06:30,240 Così facciamo solo per stipulare ora che questi sono corretti. 182 00:06:30,240 --> 00:06:31,730 Ma perché è interessante? 183 00:06:31,730 --> 00:06:33,970 >> Ebbene, un byte, naturalmente, è di otto bit. 184 00:06:33,970 --> 00:06:38,980 E si scopre che se si pensa di un byte come due blocchi di quattro bit, 185 00:06:38,980 --> 00:06:39,500 come questo. 186 00:06:39,500 --> 00:06:41,000 Vorrei solo aggiungere un po 'di spazio. 187 00:06:41,000 --> 00:06:42,550 Quindi, prima, dopo. 188 00:06:42,550 --> 00:06:46,520 Ho appena aggiunto un po 'di spazio bianco per l'amor di visualizzazione qui. 189 00:06:46,520 --> 00:06:51,840 Come possiamo ora rappresentare, per esempio, esadecimale ogni quad di bit, 190 00:06:51,840 --> 00:06:52,880 ogni serie di quattro bit? 191 00:06:52,880 --> 00:06:56,420 >> Così, per esempio, a sinistra Ora, noi abbiamo 1111 in binario. 192 00:06:56,420 --> 00:07:00,420 Qual è quel numero in decimale, se fate la matematica? 193 00:07:00,420 --> 00:07:03,780 Hai il posto quelli, il posto due, il posto a quattro zampe, e il luogo otto. 194 00:07:03,780 --> 00:07:04,341 >> PUBBLICO: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. MALAN: E '15. 196 00:07:05,340 --> 00:07:08,340 Quindi, se facciamo otto più quattro più due più uno, otteniamo 15. 197 00:07:08,340 --> 00:07:11,790 Così ho potuto scrivere le 15 di seguito 1111, ma il punto qui 198 00:07:11,790 --> 00:07:13,190 è esadecimale, non decimale. 199 00:07:13,190 --> 00:07:17,310 Così, invece di scrivere 15, 1-5, Ho intenzione di scrivere che in esadecimale, 200 00:07:17,310 --> 00:07:22,311 che se si pensa di nuovo, se si dispone di zero a f, ciò che è 15 sarà? 201 00:07:22,311 --> 00:07:22,810 PUBBLICO: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. MALAN: Così si scopre che di f. 203 00:07:24,434 --> 00:07:29,140 E si può lavorare che col dire, bene, se a è 10, quindi OK, f è 15. 204 00:07:29,140 --> 00:07:33,250 Così in effetti, potremmo riscrivere la stessa serie di numeri come f f. 205 00:07:33,250 --> 00:07:35,750 E poi se facciamo un po 'di matematica, ci deduciamo che questo è d. 206 00:07:35,750 --> 00:07:38,650 Otto è abbastanza facile, perché noi avere uno nel posto otto. 207 00:07:38,650 --> 00:07:40,620 E poi, abbiamo un altro paio di f f. 208 00:07:40,620 --> 00:07:44,669 >> Così che cosa gli esseri umani tendono a fare per convenzione quando usano esadecimale è semplicemente 209 00:07:44,669 --> 00:07:47,710 scrivere questo un po 'più succintamente, sbarazzarsi della maggior parte di quello spazio bianco. 210 00:07:47,710 --> 00:07:50,890 E tanto per essere super chiaro a lettori che questa è esadecimale, 211 00:07:50,890 --> 00:07:54,670 la semplice convenzione tra esseri umani è che si scrivono a zero 212 00:07:54,670 --> 00:07:58,000 x, che non ha significato altro di un identificatore visivo di, 213 00:07:58,000 --> 00:07:59,590 ecco che arriva un numero esadecimale. 214 00:07:59,590 --> 00:08:04,210 >> E poi, mettete le due cifre, f f in questo caso, allora d un, allora f f. 215 00:08:04,210 --> 00:08:06,700 Quindi, per farla breve, esadecimale tende solo 216 00:08:06,700 --> 00:08:11,990 essere utile perché ciascuno dei suoi cifre, zero attraverso f, perfettamente linee 217 00:08:11,990 --> 00:08:13,880 con un pattern di quattro bit. 218 00:08:13,880 --> 00:08:18,080 >> Quindi, se avete due cifre esadecimali, zero a F, ancora e ancora, 219 00:08:18,080 --> 00:08:20,256 che ti dà perfettamente otto bit o un byte. 220 00:08:20,256 --> 00:08:22,380 Ecco perché esso tende a essere convenzionalmente utile. 221 00:08:22,380 --> 00:08:24,990 Non c'è intellettuale contenuto davvero oltre che, 222 00:08:24,990 --> 00:08:27,010 altro che la sua effettiva utilità. 223 00:08:27,010 --> 00:08:29,310 >> Ora JPEG non sono l'unica formati di file per la grafica. 224 00:08:29,310 --> 00:08:33,230 Si potrebbe ricordare che ci sono i file di questo tipo nel mondo, 225 00:08:33,230 --> 00:08:34,830 almeno da un paio di anni fa. 226 00:08:34,830 --> 00:08:37,580 >> Quindi questo era in realtà installato in Windows XP 227 00:08:37,580 --> 00:08:39,960 su milioni di PC in tutto il mondo. 228 00:08:39,960 --> 00:08:43,000 E questo era un file bitmap, BMP. 229 00:08:43,000 --> 00:08:47,690 E un file bitmap, come vedrete prossimo settimana, significa semplicemente un modello di punti, 230 00:08:47,690 --> 00:08:51,710 pixel come si chiamano, Una mappa in bit, davvero. 231 00:08:51,710 --> 00:08:55,160 >> Così che cosa interessante, però, su questo formato di file, BMP, è 232 00:08:55,160 --> 00:08:58,590 che sotto il cofano, ha più di soli tre byte 233 00:08:58,590 --> 00:09:01,020 che compongono la sua intestazione, in modo a parlare, i primi morsi. 234 00:09:01,020 --> 00:09:03,330 In realtà sembra un po ' complicato a prima vista. 235 00:09:03,330 --> 00:09:04,704 E vedrete questo nel set P. 236 00:09:04,704 --> 00:09:06,810 E ottenere qualcosa particolare da questa ora 237 00:09:06,810 --> 00:09:10,720 non è così importante, in quanto solo il fatto che all'inizio di ogni bitmap 238 00:09:10,720 --> 00:09:13,823 file, un formato grafico, c'è un sacco di numeri. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Ora Microsoft, il autore di questo formato, 241 00:09:16,720 --> 00:09:18,820 tende a chiamare gli Le cose non interi e caratteri 242 00:09:18,820 --> 00:09:22,259 e carri, ma le parole e le d parole e anela e byte. 243 00:09:22,259 --> 00:09:23,800 Quindi sono solo diversi tipi di dati. 244 00:09:23,800 --> 00:09:25,170 Sono nomi diversi per la stessa cosa. 245 00:09:25,170 --> 00:09:26,740 Ma vedrai che in P Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Ma questo è solo per dire che se un umano doppio-clic qualche file BMP sul suo 247 00:09:31,450 --> 00:09:35,015 o il suo hard disk, e una finestra si apre up che mostra lui o lei che l'immagine, 248 00:09:35,015 --> 00:09:38,500 quello che è successo perché il funzionamento sistema presumibilmente notato non solo 249 00:09:38,500 --> 00:09:41,460 l'estensione del file BMP nel nome del file, 250 00:09:41,460 --> 00:09:45,010 ma anche il fatto che c'è una certa convenzione per il modello di bit 251 00:09:45,010 --> 00:09:47,490 all'inizio di quel file bitmap. 252 00:09:47,490 --> 00:09:50,270 >> Ma andiamo ora concentriamoci su un file complicata, 253 00:09:50,270 --> 00:09:52,120 ma invece su qualcosa di simile. 254 00:09:52,120 --> 00:09:55,190 Supponiamo qui in gedit, I basta avere gli inizi 255 00:09:55,190 --> 00:09:57,070 di un programma che è abbastanza semplice. 256 00:09:57,070 --> 00:09:58,860 Ho avuto qualche intende cima. 257 00:09:58,860 --> 00:10:02,120 Ora ho #include "structs.h", ma Tornerò a che in un attimo. 258 00:10:02,120 --> 00:10:03,974 Ma questo è utile per ora. 259 00:10:03,974 --> 00:10:05,890 Quindi questo è un programma che sta per implementare 260 00:10:05,890 --> 00:10:07,335 come database del registrar. 261 00:10:07,335 --> 00:10:09,710 Quindi un database di studenti, e ogni studente nel mondo 262 00:10:09,710 --> 00:10:13,190 ha un nome e una casa e, probabilmente, un po ' altre cose, ma noi terremo le cose semplici. 263 00:10:13,190 --> 00:10:15,140 Ogni studente ha un nome e una casa. 264 00:10:15,140 --> 00:10:17,700 >> Quindi, se volessi scrivere un programma il cui scopo nella vita 265 00:10:17,700 --> 00:10:19,860 era solo per scorrere da zero, su un massimo di tre, 266 00:10:19,860 --> 00:10:22,070 se ci sono tre studenti presso la Harvard University. 267 00:10:22,070 --> 00:10:25,350 E voglio solo per ottenere, utilizzando GetString, il nome e la casa di ogni studente, 268 00:10:25,350 --> 00:10:26,600 e poi basta stampare quelli fuori. 269 00:10:26,600 --> 00:10:28,630 >> Questo è un po 'come Settimana One, Two Week roba adesso, 270 00:10:28,630 --> 00:10:30,810 dove voglio solo una per loop o qualcosa del genere. 271 00:10:30,810 --> 00:10:34,500 E voglio chiamare GetString alcuni tempi, e quindi stampare f un paio di volte. 272 00:10:34,500 --> 00:10:37,340 Quindi, come potrei fare questo, però, quando sia un nome e una casa 273 00:10:37,340 --> 00:10:39,070 sono coinvolti per ogni studente? 274 00:10:39,070 --> 00:10:42,830 >> Quindi il mio primo istinto potrebbe essere quello di fare qualcosa di simile. 275 00:10:42,830 --> 00:10:49,620 Potrei dire prima, bene, dammi, dire, un array di stringhe chiamati nomi. 276 00:10:49,620 --> 00:10:51,530 E io non voglio un hardcode tre qui. 277 00:10:51,530 --> 00:10:53,064 Cosa voglio mettere lì? 278 00:10:53,064 --> 00:10:55,730 Così gli studenti, perché questo è solo una costante dichiarata in alto, 279 00:10:55,730 --> 00:10:57,860 solo così io non devo hardcode tre in più luoghi. 280 00:10:57,860 --> 00:11:00,859 In questo modo, posso cambiarlo un unico luogo, e colpisce un cambiamento in tutto il mondo. 281 00:11:00,859 --> 00:11:04,470 E poi, potrei fare stringa ospita STUDENTI. 282 00:11:04,470 --> 00:11:10,250 >> E ora, potrei fare qualcosa di simile for (int i = 0; i 00:11:14,390 Così sto scrivendo in fretta, ma questo è probabilmente sintassi familiare ora. 284 00:11:14,390 --> 00:11:17,030 >> E ora, questo era più recente. 285 00:11:17,030 --> 00:11:22,890 Se voglio mettere nel i-esimo il nome dello studente, penso che faccio questo. 286 00:11:22,890 --> 00:11:26,480 E poi, non nomi ma case staffa I. 287 00:11:26,480 --> 00:11:29,930 Lo faccio, GetString, e lasciare me tornare indietro e correggere questa linea. 288 00:11:29,930 --> 00:11:30,430 Accetto? 289 00:11:30,430 --> 00:11:31,200 Non sono d'accordo? 290 00:11:31,200 --> 00:11:32,366 Non è molto user-friendly. 291 00:11:32,366 --> 00:11:33,890 Io non ho detto che l'utente cosa fare. 292 00:11:33,890 --> 00:11:36,520 >> Ma ora, se anche voluto in seguito, cerchiamo di 293 00:11:36,520 --> 00:11:40,060 per esempio, stampare queste cose fuori-- così TODO tardi. 294 00:11:40,060 --> 00:11:42,330 Ho intenzione di fare di più con Questa poi questo probabilmente IS 295 00:11:42,330 --> 00:11:45,970 una corretta attuazione di ottenere i nomi e le case, tre 296 00:11:45,970 --> 00:11:48,870 di loro totale di ciascuna, da un utente. 297 00:11:48,870 --> 00:11:51,280 >> Ma questo non è molto buona progettazione, giusto? 298 00:11:51,280 --> 00:11:55,220 Che cosa succede se uno studente non ha solo un nome e una casa, ma anche un numero ID, 299 00:11:55,220 --> 00:11:57,770 e un numero telefonico, e un indirizzo e-mail, 300 00:11:57,770 --> 00:12:00,280 e magari una home page, e forse un manico Twitter, 301 00:12:00,280 --> 00:12:03,730 e qualsiasi numero di altri dettagli associata ad uno studente o una persona, 302 00:12:03,730 --> 00:12:04,610 più in generale. 303 00:12:04,610 --> 00:12:07,720 Come potremmo iniziare ad aggiungere funzionalità a questo programma? 304 00:12:07,720 --> 00:12:14,080 >> Beh, mi sento come il modo più semplice potrebbe essere quello di fare qualcosa di simile, diciamo, 305 00:12:14,080 --> 00:12:16,490 int IDS STUDENTI. 306 00:12:16,490 --> 00:12:18,380 Così posso mettere tutti i loro ID in là. 307 00:12:18,380 --> 00:12:22,240 E poi, per qualcosa come numeri di telefono, 308 00:12:22,240 --> 00:12:24,400 Io non sono sicuro di come rappresentare quella appena ancora. 309 00:12:24,400 --> 00:12:30,280 Quindi andiamo avanti e appena chiamata questo cinguetta STUDENTI, che 310 00:12:30,280 --> 00:12:33,550 è un po 'strano, ma-- e un gruppo più campi. 311 00:12:33,550 --> 00:12:36,360 >> Ho iniziato in modo efficace copia e incolla qui. 312 00:12:36,360 --> 00:12:39,416 E questo sta andando a crescere abbastanza ingombrante abbastanza rapidamente, giusto? 313 00:12:39,416 --> 00:12:42,290 Non sarebbe bello se ci fossero nel mondo noto una struttura dati 314 00:12:42,290 --> 00:12:45,600 non come un int o una stringa, ma qualcosa livello superiore, una astrazione, così 315 00:12:45,600 --> 00:12:47,570 a parlare, conosciuto come uno studente? 316 00:12:47,570 --> 00:12:50,220 C non è venuto con built-in funzionalità per gli studenti, 317 00:12:50,220 --> 00:12:52,260 ma cosa succede se volevo dargli tale? 318 00:12:52,260 --> 00:12:55,640 >> Beh, si scopre, ho intenzione di aprire un file chiamato structs.h qui, 319 00:12:55,640 --> 00:12:57,090 e si può fare esattamente questo. 320 00:12:57,090 --> 00:12:58,290 E abbiamo intenzione di iniziare a farlo ora. 321 00:12:58,290 --> 00:13:01,490 E sotto il cofano di P Set Tre, hai già fatto questo ora. 322 00:13:01,490 --> 00:13:05,920 Non esiste una cosa come un g rect o un g ovale nel linguaggio di programmazione C. 323 00:13:05,920 --> 00:13:10,570 >> Gente di Stanford attuate quelle tipi di dati utilizzando questo approccio qui, 324 00:13:10,570 --> 00:13:13,900 dichiarando la propria nuova dati tipi utilizzando una nuova parola chiave 325 00:13:13,900 --> 00:13:16,744 chiamato struct e un altro uno chiamato typedef. 326 00:13:16,744 --> 00:13:19,660 Ed in effetti, anche se la sintassi sembra un po 'diverso da roba 327 00:13:19,660 --> 00:13:23,550 abbiamo visto prima, in linea di principio, è super semplice. 328 00:13:23,550 --> 00:13:25,297 >> Questo significa solo "definire un tipo." 329 00:13:25,297 --> 00:13:27,255 Ciò sta andando essere un struttura, e una struttura 330 00:13:27,255 --> 00:13:29,400 è come un contenitore per di più le cose. 331 00:13:29,400 --> 00:13:31,780 E che la struttura sta avere una stringa chiamata nome, 332 00:13:31,780 --> 00:13:33,210 e una stringa chiamato casa. 333 00:13:33,210 --> 00:13:37,520 E chiamiamolo, solo per comodità, tutto questo studente struttura dati. 334 00:13:37,520 --> 00:13:40,320 >> Quindi il momento si arriva a il punto e virgola, che hai ora 335 00:13:40,320 --> 00:13:43,280 creato i propri dati tipo chiamato studente 336 00:13:43,280 --> 00:13:46,420 che ora si affianca int, e float e char, e la stringa, 337 00:13:46,420 --> 00:13:50,270 e g rect, e g ovale, e qualsiasi numero di altre cose che le persone hanno inventato. 338 00:13:50,270 --> 00:13:53,340 >> Quindi cosa c'è di utile su questo ora è che se vado indietro 339 00:13:53,340 --> 00:13:57,430 a struct 0 e finire questo implementazione, che ho scritto 340 00:13:57,430 --> 00:14:02,080 in anticipo qui, notare che tutti del disordine inevitabile che 341 00:14:02,080 --> 00:14:05,490 stava per cominciare accadendo come ho aggiunto numeri di telefono e cinguetta e tutti 342 00:14:05,490 --> 00:14:07,370 queste altre cose a definizione di uno studente, 343 00:14:07,370 --> 00:14:11,810 ora è succintamente avvolto come solo un array di studenti. 344 00:14:11,810 --> 00:14:15,500 >> E ciascuno di quegli studenti ora ha diverse cose all'interno di esso. 345 00:14:15,500 --> 00:14:16,930 In modo che lascia solo una domanda. 346 00:14:16,930 --> 00:14:19,700 Come si ottiene nel nome, e la casa, e l'ID, 347 00:14:19,700 --> 00:14:21,640 e quant'altro è all'interno dello studente? 348 00:14:21,640 --> 00:14:22,930 Super semplice, pure. 349 00:14:22,930 --> 00:14:25,730 Nuova sintassi, ma una semplice idea. 350 00:14:25,730 --> 00:14:29,239 >> È sufficiente indice nella matrice, come abbiamo fatto la settimana scorsa e questa. 351 00:14:29,239 --> 00:14:31,030 E qual è chiaramente il nuovo pezzo di sintassi? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Basta., Che significa "andare dentro l' la struttura e ottenere il campo chiamato 354 00:14:35,880 --> 00:14:39,030 nome, ottenere il campo chiamato casa, ottenere il campo denominato studente ". 355 00:14:39,030 --> 00:14:41,940 >> Quindi, in P Set Tre, se siete ancora lavorando su questo, 356 00:14:41,940 --> 00:14:44,020 e la maggior parte delle persone ancora sono, rendersi conto che, come si 357 00:14:44,020 --> 00:14:46,130 iniziare a utilizzare le cose come g rettangoli e ovali g 358 00:14:46,130 --> 00:14:50,201 e altre cose che non sembrano provengono da Settimana Zero, uno, o due, 359 00:14:50,201 --> 00:14:52,950 si rendono conto che questo è perché Stanford dichiarato alcuni nuovi tipi di dati. 360 00:14:52,950 --> 00:14:56,160 >> E in effetti, questo è esattamente quello che faremo fare, come pure, in P Set Four, quando 361 00:14:56,160 --> 00:14:59,880 cominciamo a che fare con le cose come le immagini, bitmap, e altro ancora. 362 00:14:59,880 --> 00:15:02,882 Ecco, questo è solo un teaser e un modello mentale di ciò che è a venire. 363 00:15:02,882 --> 00:15:04,590 Ora, ho procrastinato un po 'di questa mattina. 364 00:15:04,590 --> 00:15:09,560 Ero un po 'curioso di vedere cosa la carta da parati Microsoft in realtà 365 00:15:09,560 --> 00:15:10,310 sembra oggi. 366 00:15:10,310 --> 00:15:15,200 E si scopre che qualcuno nel 2006 in realtà è andato a quasi esattamente 367 00:15:15,200 --> 00:15:19,210 lo stesso posto per fotografare in realtà quello che sembra che questi giorni. 368 00:15:19,210 --> 00:15:21,380 Il campo è ormai un po 'troppo cresciuto. 369 00:15:21,380 --> 00:15:24,850 >> Così parlando adesso di immagini, cerchiamo di riportare Daven qui 370 00:15:24,850 --> 00:15:26,890 sullo schermo e Nicola, e solo ricordare 371 00:15:26,890 --> 00:15:30,540 che se vuoi unirti a noi per il pranzo questo Venerdì, la testa al nostro solito URL 372 00:15:30,540 --> 00:15:31,440 Qui. 373 00:15:31,440 --> 00:15:33,530 >> Allora, dove abbiamo lasciato fuori il Lunedi? 374 00:15:33,530 --> 00:15:35,140 Abbiamo introdotto questo problema, giusto? 375 00:15:35,140 --> 00:15:37,610 Questo è stato apparentemente un corretto implementazione di scambio, 376 00:15:37,610 --> 00:15:40,460 per cui si prendere due interi, uno chiamato, uno chiamato b, 377 00:15:40,460 --> 00:15:44,130 li scambiare, proprio come ha fatto Laura qui sul palco con il latte e l'acqua, 378 00:15:44,130 --> 00:15:46,820 utilizzando un temporaneo variabile, o una tazza vuota, 379 00:15:46,820 --> 00:15:50,540 in modo da poter mettere in un b e una in b senza fare un pasticcio di cose. 380 00:15:50,540 --> 00:15:51,560 Abbiamo usato una variabile. 381 00:15:51,560 --> 00:15:52,870 Si chiama temperatura. 382 00:15:52,870 --> 00:15:55,520 >> Ma quello che era il fondamentale problema con questo codice il Lunedi? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Qual era il problema? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Già. 387 00:16:00,605 --> 00:16:01,970 >> PUBBLICO: Ci vuole più spazio. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. MALAN: occupa più spazio, perché sto usando una variabile, 389 00:16:04,719 --> 00:16:05,400 e questo è OK. 390 00:16:05,400 --> 00:16:07,300 Questo è vero, ma io sono andando a dire che è OK. 391 00:16:07,300 --> 00:16:10,030 E 'solo 32 bit nella grande schema delle cose, quindi non è un grosso problema. 392 00:16:10,030 --> 00:16:10,655 Altri pensieri? 393 00:16:10,655 --> 00:16:12,572 PUBBLICO: Si scambia solo le variabili localmente. 394 00:16:12,572 --> 00:16:13,571 DAVID J. MALAN: Esattamente. 395 00:16:13,571 --> 00:16:15,090 Si scambia solo le variabili a livello locale. 396 00:16:15,090 --> 00:16:18,173 Perché ogni volta che si chiama una function-- quando ho avuto i vassoi da Annenberg 397 00:16:18,173 --> 00:16:19,840 l'ultima volta, avete principale sul fondo. 398 00:16:19,840 --> 00:16:23,560 Non appena si chiama una funzione chiamata di scambio, di swap non ottiene x e y, 399 00:16:23,560 --> 00:16:24,400 i valori originali. 400 00:16:24,400 --> 00:16:26,392 Che cosa fa di swap get, abbiamo pretendiamo? 401 00:16:26,392 --> 00:16:27,100 PUBBLICO: Copie. 402 00:16:27,100 --> 00:16:28,090 DAVID J. MALAN: Quindi copia. 403 00:16:28,090 --> 00:16:31,120 Così diventa uno e due, se si ricordare l'esempio dall'ultima volta, 404 00:16:31,120 --> 00:16:34,730 ma una copia di uno e due che vengono scambiati con successo. 405 00:16:34,730 --> 00:16:38,550 Ma purtroppo, alla fine, tali valori sono sempre gli stessi. 406 00:16:38,550 --> 00:16:41,880 Così possiamo vedere questo con la nostra nuovo amico, si spera GDB, 407 00:16:41,880 --> 00:16:45,180 che voi o il TF e Ca sono stato guidandovi verso come segue. 408 00:16:45,180 --> 00:16:51,210 >> Quindi nessun richiamo di swap sembra like-- facciamo aprire questo-- simile a questa. 409 00:16:51,210 --> 00:16:54,160 Abbiamo inizializzato x per uno, y per due. 410 00:16:54,160 --> 00:16:55,620 Aveva un mucchio di stampa di f. 411 00:16:55,620 --> 00:16:58,080 Ma poi, la chiamata chiave qui è stato quello di scambiare, che 412 00:16:58,080 --> 00:17:00,260 è esattamente il codice che appena visto un momento fa. 413 00:17:00,260 --> 00:17:03,180 Che è corretto in un primo momento sguardo, ma funzionale, 414 00:17:03,180 --> 00:17:06,800 questo programma non funziona, perché non scambiare permanentemente xe y. 415 00:17:06,800 --> 00:17:10,190 >> Quindi cerchiamo di vedere questo, un rapido caldo qui con GDB, un ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Un mucchio di informazioni travolgente che Prendo eliminare con controllo L per ora. 418 00:17:15,200 --> 00:17:17,516 E ora, ho intenzione di andare avanti ed eseguirlo. 419 00:17:17,516 --> 00:17:19,349 E purtroppo, che Non era che utile. 420 00:17:19,349 --> 00:17:22,355 Correva il programma all'interno di questo programma chiamato GDB, un debugger, 421 00:17:22,355 --> 00:17:23,730 ma non mi ha lasciato curiosare. 422 00:17:23,730 --> 00:17:26,229 >> Così come posso effettivamente mettere in pausa esecuzione all'interno di questo programma? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Così rompere. 425 00:17:28,329 --> 00:17:32,340 E potrei rompere su qualsiasi numero, uno, 10, 15 linea. 426 00:17:32,340 --> 00:17:35,530 Ma posso anche rompere simbolicamente dicendo pausa principale. 427 00:17:35,530 --> 00:17:38,980 E che sta per impostare una pausa punto, a quanto pare in linea 16 in principale. 428 00:17:38,980 --> 00:17:40,050 E dove è la linea 16? 429 00:17:40,050 --> 00:17:42,960 Andiamo fino al codice e andare fino a noswap. 430 00:17:42,960 --> 00:17:46,930 E in effetti, la linea 16 è il prima nel programma. 431 00:17:46,930 --> 00:17:52,130 >> Così ora, se vado avanti e tipo eseguire questa volta, Enter, si fermò. 432 00:17:52,130 --> 00:17:53,080 Quindi cerchiamo di curiosare. 433 00:17:53,080 --> 00:17:55,716 Stampa X-- perché è x pari a zero? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 E ignorare il simbolo del dollaro. 436 00:17:57,830 --> 00:17:59,725 Questo è solo per amatore Utilizzo del programma. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Perché è x nulla in questo momento? 439 00:18:03,140 --> 00:18:03,640 Già. 440 00:18:03,640 --> 00:18:07,061 >> PUBBLICO: Si fermò proprio davanti linea 16, in realtà non in linea 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. MALAN: Esattamente. 442 00:18:08,060 --> 00:18:11,630 GDB, per impostazione predefinita, è in pausa esecuzione appena prima linea 16. 443 00:18:11,630 --> 00:18:14,820 Così non è stato eseguito, che significa x è di qualche valore sconosciuto. 444 00:18:14,820 --> 00:18:17,150 E siamo stati fortunati che è qualcosa di pulito come zero. 445 00:18:17,150 --> 00:18:20,310 Così ora se digito il prossimo, ora eseguito 16. 446 00:18:20,310 --> 00:18:22,000 Sta aspettando che io eseguo 17. 447 00:18:22,000 --> 00:18:23,400 Lasciami andare avanti e stampa x. 448 00:18:23,400 --> 00:18:24,094 E 'uno. 449 00:18:24,094 --> 00:18:25,260 Lasciami andare avanti e di stampa y. 450 00:18:25,260 --> 00:18:26,176 Cosa devo vedere ora? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBBLICO: [incomprensibile] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. MALAN: Un po 'più forte. 454 00:18:29,165 --> 00:18:30,040 >> PUBBLICO: [incomprensibile] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. MALAN: Non proprio un consenso. 457 00:18:32,120 --> 00:18:34,760 Quindi sì, vediamo un certo valore spazzatura. 458 00:18:34,760 --> 00:18:37,862 Ora, y è 134514064 lì. 459 00:18:37,862 --> 00:18:39,320 Beh, è ​​solo un valore spazzatura. 460 00:18:39,320 --> 00:18:41,350 Il mio programma utilizza RAM per scopi diversi. 461 00:18:41,350 --> 00:18:42,350 Ci sono altre funzioni. 462 00:18:42,350 --> 00:18:44,040 Altre persone hanno scritto dentro il mio computer. 463 00:18:44,040 --> 00:18:46,789 Quindi i bit sono stati utilizzati per altri valori, e quello che sto vedendo 464 00:18:46,789 --> 00:18:49,470 è i resti di alcuni uso precedente di quella memoria. 465 00:18:49,470 --> 00:18:53,350 >> Quindi un grosso problema, perché appena mentre sto scrivendo il prossimo e quindi stampare y, 466 00:18:53,350 --> 00:18:55,640 è inizializzato a il valore che voglio. 467 00:18:55,640 --> 00:18:57,400 Così ora, andiamo avanti un po 'più veloce. 468 00:18:57,400 --> 00:18:58,540 N per il prossimo. 469 00:18:58,540 --> 00:18:59,570 Facciamolo di nuovo. 470 00:18:59,570 --> 00:19:00,530 Facciamolo di nuovo. 471 00:19:00,530 --> 00:19:02,404 Ma io non voglio colpire qui, perché se io 472 00:19:02,404 --> 00:19:05,110 voglio vedere cosa sta succedendo all'interno di scambio, qual è il comando? 473 00:19:05,110 --> 00:19:05,520 >> PUBBLICO: passaggi. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. MALAN: passaggi. 475 00:19:06,436 --> 00:19:09,800 Quindi questo mi passi in un funzione, piuttosto che su di esso. 476 00:19:09,800 --> 00:19:12,270 E ora, è un po 'criptico onestamente, ma questo è solo 477 00:19:12,270 --> 00:19:14,581 mi dice che sono in linea 33 ora. 478 00:19:14,581 --> 00:19:15,580 E facciamolo di nuovo. 479 00:19:15,580 --> 00:19:16,080 Stampa temperatura. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Valore Garbage, negativo questa volta, ma questo è solo ancora un valore spazzatura. 482 00:19:20,170 --> 00:19:22,810 Allora, facciamo il prossimo, temp stampa. 483 00:19:22,810 --> 00:19:27,130 E 'inizializzato a 1, che era il valore di x, aka a. 484 00:19:27,130 --> 00:19:29,110 >> Ora, dove sono la A e X provenienti da? 485 00:19:29,110 --> 00:19:32,510 Beh, notiamo in principale, abbiamo chiamato questi valori x e y. 486 00:19:32,510 --> 00:19:34,740 Siamo poi passati loro di scambiare come segue. 487 00:19:34,740 --> 00:19:37,010 X è venuto prima, comma a. 488 00:19:37,010 --> 00:19:40,020 E poi, di swap potrebbe chiamarli x e y. 489 00:19:40,020 --> 00:19:42,630 Ma per chiarezza, è chiamandoli a e b. 490 00:19:42,630 --> 00:19:45,970 Ma a e b sono ora in corso per essere copie di xey, rispettivamente. 491 00:19:45,970 --> 00:19:50,660 >> Quindi, se torno a GDB, temp è ora uno e ora è uno. 492 00:19:50,660 --> 00:19:56,130 Ma se lo faccio dopo e ora fare stampare una, una è già stato spostato. 493 00:19:56,130 --> 00:20:00,030 Il latte è stato versato nella ex bicchiere di succo d'arancia, o viceversa. 494 00:20:00,030 --> 00:20:04,750 >> E se lo faccio la prossima volta, e ora se stampo come un controllo di integrità, 495 00:20:04,750 --> 00:20:07,687 una è ancora due, ma b è ora uno. 496 00:20:07,687 --> 00:20:08,770 Francamente, è ancora lì. 497 00:20:08,770 --> 00:20:10,670 Non mi interessa quello che temp è. 498 00:20:10,670 --> 00:20:16,850 Ma appena ho ora Tipo, diciamo, Continuo a tornare indietro, ora sono alla fine 499 00:20:16,850 --> 00:20:17,480 il programma. 500 00:20:17,480 --> 00:20:20,730 E purtroppo, x è ancora uno e y è ancora due. 501 00:20:20,730 --> 00:20:22,272 >> Allora, qual era l'utilità del GDB lì? 502 00:20:22,272 --> 00:20:23,980 E non ha aiutato me fix il problema di per sé, 503 00:20:23,980 --> 00:20:26,265 ma speriamo mi aiuti capire realizzando 504 00:20:26,265 --> 00:20:30,000 che sì, la mia logica è giusta, ma il mio codice non è in ultima analisi, avendo 505 00:20:30,000 --> 00:20:31,450 un impatto permanente. 506 00:20:31,450 --> 00:20:34,570 Ecco, questo è un problema che siamo andando a risolvere ora di oggi. 507 00:20:34,570 --> 00:20:37,870 >> Ma veniamo lì per mezzo di questo. 508 00:20:37,870 --> 00:20:39,230 String è una menzogna. 509 00:20:39,230 --> 00:20:41,860 Essa, inoltre, non un tipo di dati che esiste in C. E ' 510 00:20:41,860 --> 00:20:44,750 sinonimo per alcuni tempo per qualcos'altro, 511 00:20:44,750 --> 00:20:47,300 e possiamo rivelare che, come segue. 512 00:20:47,300 --> 00:20:53,282 >> Lasciami andare avanti e apro un programma chiamato confrontare-0. 513 00:20:53,282 --> 00:20:56,240 E piuttosto che scrivere questo fuori, inizieremo a camminare attraverso il codice 514 00:20:56,240 --> 00:20:58,040 Ho già scritto, ma è solo poche righe. 515 00:20:58,040 --> 00:20:59,570 Quindi questo è confrontare-0. 516 00:20:59,570 --> 00:21:02,380 E la prima cosa che sto facendo è sempre una riga di testo. 517 00:21:02,380 --> 00:21:05,610 >> Ma accorgo di quello che sto facendo per la prima volta. 518 00:21:05,610 --> 00:21:07,910 Che cosa è diverso chiaramente sulla linea 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 In realtà, aspetta un minuto. 521 00:21:11,402 --> 00:21:12,110 Questa è la copia di due. 522 00:21:12,110 --> 00:21:13,568 Che non è nemmeno il programma giusto. 523 00:21:13,568 --> 00:21:14,780 Va bene, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Va bene, quindi non importa che. 525 00:21:16,890 --> 00:21:18,520 Questa è la risposta ad una futura domanda. 526 00:21:18,520 --> 00:21:21,450 >> Qui si confronta-0, e sono per cominciare una riga di testo. 527 00:21:21,450 --> 00:21:22,435 Programma di molto più semplice. 528 00:21:22,435 --> 00:21:23,560 Quindi questo è semplice. 529 00:21:23,560 --> 00:21:28,070 Questo è come la Settimana One, Two Week roba al momento. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Ora, lo dico di nuovo qui. 531 00:21:29,700 --> 00:21:31,830 stringa t = GetString. 532 00:21:31,830 --> 00:21:35,300 E poi, l'ultima cosa in questo programma, come suggerisce il nome, 533 00:21:35,300 --> 00:21:37,090 è ho intenzione di provare a confrontarli. 534 00:21:37,090 --> 00:21:40,709 >> Così se s, la prima stringa, uguale = t, allora sono 535 00:21:40,709 --> 00:21:42,250 per dire si digita la stessa cosa. 536 00:21:42,250 --> 00:21:44,291 Altrimenti, ho intenzione di dire si digita cose diverse. 537 00:21:44,291 --> 00:21:45,880 Quindi cerchiamo di compilare ed eseguire il programma. 538 00:21:45,880 --> 00:21:48,481 Quindi, fare confrontare zero. 539 00:21:48,481 --> 00:21:48,980 Sembra buono. 540 00:21:48,980 --> 00:21:50,490 Nessun errore di compilazione. 541 00:21:50,490 --> 00:21:52,386 >> Lasciami andare avanti ora e digitare ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Lasciami andare avanti e dire qualcosa : Daven e qualcosa: Rob. 544 00:21:59,220 --> 00:22:00,450 E scrivo cose diverse. 545 00:22:00,450 --> 00:22:01,250 Fin qui tutto bene. 546 00:22:01,250 --> 00:22:02,680 Programma sembra essere corretta. 547 00:22:02,680 --> 00:22:03,880 >> Ma corriamo di nuovo. 548 00:22:03,880 --> 00:22:05,800 Dire qualcosa: Gabe. 549 00:22:05,800 --> 00:22:07,140 Dire qualcosa: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Bene. 552 00:22:09,020 --> 00:22:10,851 Forse mi ha colpito la barra spaziatrice o qualcosa del genere funky. 553 00:22:10,851 --> 00:22:11,600 Facciamolo di nuovo. 554 00:22:11,600 --> 00:22:13,020 Così Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Cose diverse. 559 00:22:17,330 --> 00:22:19,430 Così che cosa sta succedendo? 560 00:22:19,430 --> 00:22:23,200 >> Quindi abbiamo queste due linee di codice, GetString chiamato due volte. 561 00:22:23,200 --> 00:22:25,760 E poi, io sono semplicemente cercando di confrontare s e t. 562 00:22:25,760 --> 00:22:28,370 Ma ciò che realmente poi sta succedendo? 563 00:22:28,370 --> 00:22:31,180 Beh, in merito alla mia calligrafia macellare questo esempio un po '. 564 00:22:31,180 --> 00:22:34,630 E diciamo effettivamente gettare questo fino qui, pure. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Quindi abbiamo una linea simile string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Ecco, questo è semplicemente il primo interessante linea da quel programma. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Ma ciò che è stato tutto questo tempo succedendo sotto il cofano? 570 00:22:52,974 --> 00:22:55,890 Beh, sul-lato sinistro è stringa, che è un certo tipo di variabile, 571 00:22:55,890 --> 00:22:56,785 e si chiama s. 572 00:22:56,785 --> 00:23:00,019 Quindi so che questo sta usando memoria, o RAM, nel mio computer in qualche modo. 573 00:23:00,019 --> 00:23:02,060 Quindi ho intenzione di astrattamente disegnare che come un quadrato. 574 00:23:02,060 --> 00:23:04,820 32 bit, si scopre, ma più in futuro. 575 00:23:04,820 --> 00:23:06,410 E allora, che cosa sta succedendo qui? 576 00:23:06,410 --> 00:23:08,700 >> Beh, ovviamente GetString Ottiene una stringa dall'utente. 577 00:23:08,700 --> 00:23:11,360 E GetString ottenuto Zamyla o Gabe o Daven. 578 00:23:11,360 --> 00:23:14,640 Quindi cerchiamo di scegliere il primo di quelli, che era Daven. 579 00:23:14,640 --> 00:23:19,174 Così efficace, cosa GetString ottenuto me in quel primo caso era D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 E poi, che altro ha fatto mi dà di nascosto? 582 00:23:25,045 --> 00:23:25,920 PUBBLICO: [incomprensibile] 583 00:23:25,920 --> 00:23:28,720 DAVID J. MALAN: Sì, il carattere / 0 o nullo. 584 00:23:28,720 --> 00:23:30,550 Così effettivamente mi ha dato una stringa. 585 00:23:30,550 --> 00:23:34,550 Ma sappiamo già da precedente sembra che una stringa è semplicemente un array 586 00:23:34,550 --> 00:23:37,895 di caratteri, ed è terminato da questo speciale carattere sentinella, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Ma se questo è vero e questo è un quadrato, 589 00:23:42,310 --> 00:23:44,160 questo è chiaramente un rettangolo molto più grande. 590 00:23:44,160 --> 00:23:46,830 E in effetti, questo è, Io rivendico, solo 32 bit. 591 00:23:46,830 --> 00:23:49,500 E questo è chiaramente più di 32 bit, perché questo è probabilmente 592 00:23:49,500 --> 00:23:51,583 otto più otto più otto più otto più otto, 593 00:23:51,583 --> 00:23:53,320 solo a causa di byte in ASCII. 594 00:23:53,320 --> 00:23:57,030 Come diavolo stiamo andando per adattarsi Daven in questa piccola scatola qui? 595 00:23:57,030 --> 00:23:59,880 >> Ebbene, ciò che è GetString effettivamente facendo? 596 00:23:59,880 --> 00:24:03,680 Beh, questa griglia qui rappresenta memoria del mio computer o RAM. 597 00:24:03,680 --> 00:24:07,564 Quindi cerchiamo di arbitrariamente dire che se ciascuno di questi rappresenta un byte, 598 00:24:07,564 --> 00:24:09,730 allora possiamo pensare di ogni byte come avere un indirizzo, 599 00:24:09,730 --> 00:24:13,830 come 33 Oxford Street, o 34 Oxford Street, o 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Quindi, proprio come le case dispongono di indirizzi e gli edifici hanno indirizzi, 601 00:24:16,700 --> 00:24:19,810 così fanno i singoli byte di memoria hanno indirizzi o numeri 602 00:24:19,810 --> 00:24:21,042 che li identificano in modo univoco. 603 00:24:21,042 --> 00:24:22,000 Ora, questo è arbitrario. 604 00:24:22,000 --> 00:24:25,370 Ma per mantenere le cose semplici, ho intenzione di utilizzare esadecimale solo per convenzione, 605 00:24:25,370 --> 00:24:28,200 ma la 0x significa altro che "questo è esadecimale." 606 00:24:28,200 --> 00:24:31,030 e ho intenzione di affermare che la "D" finisce a Byte One in memoria. 607 00:24:31,030 --> 00:24:34,210 >> Non ho niente altro in corso in memoria, in modo da Daven ottenuto il primo posto 608 00:24:34,210 --> 00:24:35,509 a Byte One. 609 00:24:35,509 --> 00:24:36,800 Questo, quindi, sta per essere 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Questo sta per 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Questo sta per essere 0x4. 614 00:24:41,800 --> 00:24:43,025 Questo sta per 0x5. 615 00:24:43,025 --> 00:24:44,025 Questo sta per essere 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Ma una volta che iniziare a pensare su ciò che fatto dal computer 618 00:24:48,290 --> 00:24:50,710 sotto la cappa, si può iniziare a dedurre 619 00:24:50,710 --> 00:24:54,960 come, qualche anno fa, sarebbe hanno attuato C sé. 620 00:24:54,960 --> 00:24:58,360 Che cosa è GetString probabilmente returning-- perché 621 00:24:58,360 --> 00:25:00,946 si sente come non è ritorno Daven, di per sé, 622 00:25:00,946 --> 00:25:03,320 perché non è certo andando per adattarsi in questo piccolo box-- 623 00:25:03,320 --> 00:25:05,090 Così che cosa è GetString probabilmente tornando? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBBLICO: [incomprensibile] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. MALAN: La posizione di Daven. 627 00:25:10,540 --> 00:25:12,770 Ed è fatto questo da allora Week One. 628 00:25:12,770 --> 00:25:16,150 Quello che è veramente GetString il ritorno non è una stringa, di per sé. 629 00:25:16,150 --> 00:25:17,780 Questa è una delle piccole bugie bianche. 630 00:25:17,780 --> 00:25:22,520 È restituendo l'indirizzo del stringa in memoria, l'indirizzo univoco. 631 00:25:22,520 --> 00:25:24,820 Daven vive a 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Ma più succintamente, Gavin vive a 0x1, Indirizzo Numero Uno. 633 00:25:29,310 --> 00:25:32,280 >> Così che cosa viene messo in questo piccola scatola poi, per intenderci, 634 00:25:32,280 --> 00:25:35,930 è solo l'indirizzo di quella stringa. 635 00:25:35,930 --> 00:25:38,110 Quindi tutto questo tempo, questo è andata avanti. 636 00:25:38,110 --> 00:25:41,650 Ma ciò che questo suggerisce ora è che se tutti S ha 637 00:25:41,650 --> 00:25:44,710 è un numero all'interno di esso, che è di fermarti, il programmatore, 638 00:25:44,710 --> 00:25:47,970 dal mettere qualsiasi numero in qualsiasi variabile e proprio salto 639 00:25:47,970 --> 00:25:49,080 a quel pezzo di memoria? 640 00:25:49,080 --> 00:25:51,320 E infatti, vedremo che è una minaccia prossima volta. 641 00:25:51,320 --> 00:25:53,500 >> Ma per ora, questo si sente insufficiente. 642 00:25:53,500 --> 00:25:55,630 Se dico, farmi una stringa, tu mi dai Daven. 643 00:25:55,630 --> 00:25:57,230 Ma in realtà non mi dai Daven. 644 00:25:57,230 --> 00:25:59,310 Tutto mi dai è l'indirizzo di Daven. 645 00:25:59,310 --> 00:26:04,310 Come faccio poi so per certo Daven dove inizia e ends-- 646 00:26:04,310 --> 00:26:07,140 la storia di sempre weird-- Daven dove inizia e finisce, 647 00:26:07,140 --> 00:26:10,435 quindi, la successiva stringa in memoria inizia? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Beh, se si sta consegnando me l'inizio di Daven, 650 00:26:13,620 --> 00:26:17,230 in sostanza, come faccio a sapere dove alla fine del suo nome è? 651 00:26:17,230 --> 00:26:20,550 Questo speciale carattere null, che è tanto più importante ora 652 00:26:20,550 --> 00:26:23,040 se le stringhe sotto il cappuccio sono semplicemente identificati 653 00:26:23,040 --> 00:26:25,820 unicamente dalla loro posizione nella memoria. 654 00:26:25,820 --> 00:26:28,130 Quindi tutto questo tempo, che è cosa sta succedendo su. 655 00:26:28,130 --> 00:26:32,470 >> Così, quando guardiamo ora il codice qui, spiegare 656 00:26:32,470 --> 00:26:35,790 se si farebbe il bug in linea 26. 657 00:26:35,790 --> 00:26:39,560 Perché Zamyla e Zamyla diverso? 658 00:26:39,560 --> 00:26:41,330 Perché Gabe e Gabe diverso? 659 00:26:41,330 --> 00:26:42,154 Sì, in indietro. 660 00:26:42,154 --> 00:26:43,390 >> PUBBLICO: Hanno indirizzi diversi. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. MALAN: Semplicemente perché hanno indirizzi diversi. 662 00:26:45,931 --> 00:26:48,820 Perché quando si chiama GetString ancora una volta, che io farò in fretta qui, 663 00:26:48,820 --> 00:26:52,870 se questa è la seconda linea, corda t, come ho fatto in quel programma, 664 00:26:52,870 --> 00:26:55,030 equivale un'altra chiamata a GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 La prossima volta che chiamo GetString, io vado 667 00:26:58,670 --> 00:27:00,190 per ottenere un diverso pezzo di memoria. 668 00:27:00,190 --> 00:27:02,220 >> GetString è consentito di chiedere al funzionamento 669 00:27:02,220 --> 00:27:03,800 sistema per ulteriori e più memoria. 670 00:27:03,800 --> 00:27:07,894 Non sta andando a riutilizzare lo stesso sei byte ogni singola volta. 671 00:27:07,894 --> 00:27:09,810 E 'intenzione di ottenere un nuovo pezzo di memoria, che 672 00:27:09,810 --> 00:27:12,780 significa t sta per arrivare un altro valore qui. 673 00:27:12,780 --> 00:27:15,380 >> Così, quando faccio s uguale = t, non stai confrontando 674 00:27:15,380 --> 00:27:17,880 D contro questo e contro A questo e V contro questo. 675 00:27:17,880 --> 00:27:19,588 Stai confrontando questo contro questa, che 676 00:27:19,588 --> 00:27:24,020 francamente è abbastanza useless-- useful-- è abbastanza inutile, perché chi veramente 677 00:27:24,020 --> 00:27:25,830 se ne frega dove le stringhe sono nella memoria? 678 00:27:25,830 --> 00:27:26,850 >> E infatti, noi non abbiamo. 679 00:27:26,850 --> 00:27:28,980 E non stiamo andando a avviare particolarmente attento. 680 00:27:28,980 --> 00:27:34,180 Solo nella misura in cui i bug possono sorgere e le minacce alla sicurezza possono sorgere volontà 681 00:27:34,180 --> 00:27:36,100 abbiamo effettivamente iniziare a preoccuparsi di questo. 682 00:27:36,100 --> 00:27:37,230 Quindi cerchiamo di risolvere questo problema. 683 00:27:37,230 --> 00:27:39,650 Risulta, a risolvere il problema semplicemente eccellente. 684 00:27:39,650 --> 00:27:42,600 >> E andiamo in realtà, prima di rivelano che ancora una volta, che cosa sarebbe 685 00:27:42,600 --> 00:27:47,170 fate se in una classe CS50, e si doveva implementare 686 00:27:47,170 --> 00:27:48,600 un confronto con due stringhe. 687 00:27:48,600 --> 00:27:51,440 È chiaro che non si può semplicemente usare s è uguale a = t. 688 00:27:51,440 --> 00:27:54,090 Ma logicamente, come vuoi confrontare questa stringa 689 00:27:54,090 --> 00:27:56,370 contro questa stringa utilizzando il codice C? 690 00:27:56,370 --> 00:27:56,880 Già. 691 00:27:56,880 --> 00:27:58,780 >> PUBBLICO: Basta fare il per il ciclo [incomprensibile] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. MALAN: Perfetto. 694 00:28:01,670 --> 00:28:02,900 PUBBLICO: [incomprensibile] 695 00:28:02,900 --> 00:28:03,310 DAVID J. MALAN: Già. 696 00:28:03,310 --> 00:28:05,390 Basta usare un ciclo for o di una while o qualsiasi altra cosa. 697 00:28:05,390 --> 00:28:08,710 Ma basta applicare l'idea di base che se questo è un pezzo di memoria o un array 698 00:28:08,710 --> 00:28:11,590 e questo è, un'iterazione su entrambi allo stesso tempo. 699 00:28:11,590 --> 00:28:12,960 E basta confrontare le lettere. 700 00:28:12,960 --> 00:28:14,260 >> E devi essere un poco attenti, perché si 701 00:28:14,260 --> 00:28:16,247 non vogliono un dito andare oltre l'altra 702 00:28:16,247 --> 00:28:18,080 perché una stringa è più lunga dell'altra. 703 00:28:18,080 --> 00:28:21,380 Così si sta andando a voler verificare per questo valore speciale alla fine, nullo. 704 00:28:21,380 --> 00:28:24,017 Ma è realmente, nella fine, così semplice. 705 00:28:24,017 --> 00:28:26,100 E, francamente, non abbiamo bisogno di di reinventare quella ruota. 706 00:28:26,100 --> 00:28:27,960 Ecco Version Two. 707 00:28:27,960 --> 00:28:32,910 E quello che sto per dire qui è che invece di confrontare s è uguale a = t, 708 00:28:32,910 --> 00:28:38,964 Io invece vado a dire, se la stringa confronto di s virgola t è uguale a = 0. 709 00:28:38,964 --> 00:28:40,130 Ora, ciò che si stringa confrontare? 710 00:28:40,130 --> 00:28:43,046 >> Si scopre, è una funzione che viene fornito con C, il cui scopo nella vita 711 00:28:43,046 --> 00:28:44,650 è quello di confrontare due stringhe. 712 00:28:44,650 --> 00:28:48,300 E mescolare confrontare, se leggiamo la sua pagina o documentazione o CS50 uomo 713 00:28:48,300 --> 00:28:50,630 riferimento, sarà semplicemente dirvi che stir 714 00:28:50,630 --> 00:28:55,730 confrontare i rendimenti sia un negativo numero o un numero positivo o pari a zero, 715 00:28:55,730 --> 00:28:57,660 dove lo zero indica che sono uguali. 716 00:28:57,660 --> 00:28:58,570 >> Quindi, solo congetture. 717 00:28:58,570 --> 00:29:00,390 Che cosa potrebbe significare se mescolate rendimenti confrontare 718 00:29:00,390 --> 00:29:02,110 valore negativo o un valore positivo? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBBLICO: Maggiore o meno. 721 00:29:04,285 --> 00:29:05,570 DAVID J. MALAN: Sì, superiore o inferiore. 722 00:29:05,570 --> 00:29:08,640 Quindi, se si vuole ordinare un intero mazzo di stringhe in un dictionary-- 723 00:29:08,640 --> 00:29:12,975 come ci sarà finalmente giù strada-- funzione perfetta da utilizzare potenzialmente, 724 00:29:12,975 --> 00:29:15,850 perché sta andando a farlo confronto di stringhe per voi, e dire 725 00:29:15,850 --> 00:29:20,060 si fa una viene prima di b, o fa b venire prima di un ordine alfabetico. 726 00:29:20,060 --> 00:29:21,490 Possiamo fare esattamente questo. 727 00:29:21,490 --> 00:29:23,620 >> E notate che ho fatto un altro cosa in questo esempio. 728 00:29:23,620 --> 00:29:26,870 Cos'altro è cambiato più alto in questa funzione principale? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 E questa è l'altra bugia bianca. 732 00:29:31,150 --> 00:29:33,750 Per tutto questo tempo, quando hai state scrivendo stringa, 733 00:29:33,750 --> 00:29:38,350 siamo stati segretamente riscrivendo stringa char * in modo che clang realtà 734 00:29:38,350 --> 00:29:39,270 si capisce. 735 00:29:39,270 --> 00:29:42,450 >> In altre parole, in CS50.h e come ci vediamo alla fine, 736 00:29:42,450 --> 00:29:45,950 abbiamo fatto una stringa sinonimo chiamato che è la stessa cosa di char *. 737 00:29:45,950 --> 00:29:49,910 E per ora, so solo che il *, In questo contesto, almeno, 738 00:29:49,910 --> 00:29:51,286 indica l'indirizzo. 739 00:29:51,286 --> 00:29:52,210 >> L'indirizzo di cosa? 740 00:29:52,210 --> 00:29:56,390 Beh, il fatto che ho detto char *, e non int * o * float, 741 00:29:56,390 --> 00:30:00,820 significa che char * è l'indirizzo di un char. 742 00:30:00,820 --> 00:30:06,770 Così questa piccola scatola qui, aka stringa, è in realtà di tipo char *, 743 00:30:06,770 --> 00:30:10,490 che è semplicemente un modo elegante per dire, in questa casella andrà un indirizzo. 744 00:30:10,490 --> 00:30:12,430 E cosa che indirizzo si riferisce a? 745 00:30:12,430 --> 00:30:13,780 A quanto pare, un char. 746 00:30:13,780 --> 00:30:16,410 >> Ma potremmo assolutamente hanno int * e altre cose. 747 00:30:16,410 --> 00:30:20,790 Ma per ora, char * è davvero il più semplice e uno di interesse. 748 00:30:20,790 --> 00:30:23,310 Quindi questo problema sta a salire, però, di nuovo. 749 00:30:23,310 --> 00:30:24,830 >> Supponiamo che io apro questo programma. 750 00:30:24,830 --> 00:30:27,670 Vediamo se ora siamo in grado di prevedere cosa c'è di sbagliato in questo codice. 751 00:30:27,670 --> 00:30:31,140 Quindi, in questo programma, copia-0, sono intenzione di andare avanti e di nuovo chiamare 752 00:30:31,140 --> 00:30:34,190 GetString e memorizzare il valore in s. 753 00:30:34,190 --> 00:30:38,800 >> E allora, perché sto facendo questo, proprio come un richiamo da settimane passato? 754 00:30:38,800 --> 00:30:40,960 Abbiamo fatto dire che GetString a volte restituisce null. 755 00:30:40,960 --> 00:30:42,793 Cosa significa se GetString restituisce null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Qualcosa è andato storto. 758 00:30:46,034 --> 00:30:48,950 Probabilmente significa che la corda è troppo grande, il computer di memoria. 759 00:30:48,950 --> 00:30:51,724 Succede super, super, super raramente, ma potrebbe succedere. 760 00:30:51,724 --> 00:30:53,890 Vogliamo verificare la presenza di esso, e questo è tutto quello che stiamo facendo. 761 00:30:53,890 --> 00:30:57,910 >> Perché vedremo ora, se non lo fai avviare il controllo abitualmente per le cose 762 00:30:57,910 --> 00:31:00,870 come null, si potrebbe effettivamente iniziare ad andare 763 00:31:00,870 --> 00:31:03,106 agli indirizzi di memoria che non sono validi. 764 00:31:03,106 --> 00:31:05,980 E si sta andando ad avviare indurre sempre più difetti di segmentazione. 765 00:31:05,980 --> 00:31:08,360 O in un Mac o un PC, basta causando un blocco del computer 766 00:31:08,360 --> 00:31:10,340 o un programma per congelare, potenzialmente. 767 00:31:10,340 --> 00:31:14,930 >> Così ora, rivendico in copia-0.c, che io sto andando a copiare queste stringhe in via 768 00:31:14,930 --> 00:31:15,685 della linea 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 E poi, io vado la rivendicazione sul fondo 771 00:31:18,750 --> 00:31:21,430 qui che sto andando cambiare uno di loro. 772 00:31:21,430 --> 00:31:22,330 >> Quindi notare questo. 773 00:31:22,330 --> 00:31:24,370 Sto chiamando il nostro vecchio amico strlen. 774 00:31:24,370 --> 00:31:28,960 E proprio spiegare in inglese cosa questa linea 34 sta facendo? 775 00:31:28,960 --> 00:31:32,480 Che cosa fa t staffa 0 rappresentare sulla sinistra. 776 00:31:32,480 --> 00:31:32,980 Già. 777 00:31:32,980 --> 00:31:34,339 >> PUBBLICO: Primo carattere di t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. MALAN: Primo carattere di t. 779 00:31:35,880 --> 00:31:36,379 Questo è tutto. 780 00:31:36,379 --> 00:31:40,024 Primo carattere di t, voglio per assegnare la versione maiuscola 781 00:31:40,024 --> 00:31:41,190 del primo carattere in t. 782 00:31:41,190 --> 00:31:43,200 Quindi questo sta capitalizzando la prima lettera. 783 00:31:43,200 --> 00:31:46,340 E poi, l'ultima cosa che faccio in questo programma è sostengo qui è 784 00:31:46,340 --> 00:31:50,340 l'originale, s, ed ecco la copia, t. 785 00:31:50,340 --> 00:31:54,610 >> Ma basato sulla storia che abbiamo appena raccontato ciò che le stringhe sono realmente, 786 00:31:54,610 --> 00:31:57,520 ciò che è davvero la linea 28 fare, e ciò che è 787 00:31:57,520 --> 00:31:59,405 il bug risultante in corso di essere sullo schermo? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Quindi, prima, la prima domanda, 28. 790 00:32:03,500 --> 00:32:09,040 Che cosa è la stringa t = s davvero facendo? 791 00:32:09,040 --> 00:32:16,430 Se abbiamo in-mano sinistra lato qui stringa t = s; 792 00:32:16,430 --> 00:32:19,400 che mi dà una scatola qui e una scatola qui. 793 00:32:19,400 --> 00:32:25,530 E supponiamo che questo indirizzo è 0x, diciamo, 50 questa volta, arbitrariamente. 794 00:32:25,530 --> 00:32:28,847 Cosa stringa t = s fare sotto il cofano? 795 00:32:28,847 --> 00:32:30,340 >> PUBBLICO: [incomprensibile] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. MALAN: Memorizza la memoria affrontare lì, quindi 0x50 va là. 797 00:32:34,100 --> 00:32:37,980 Quindi, se ora, vado alla prima carattere in maiuscolo e t esso, 798 00:32:37,980 --> 00:32:39,535 cosa sto effettivamente facendo per s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Sto davvero facendo la stessa cosa, giusto? 801 00:32:43,450 --> 00:32:47,680 Perché se 0x50-- Indirizzo e giusto, io non hanno molto spazio sulla scheda di qui, 802 00:32:47,680 --> 00:32:51,750 ma per scontato che questo sia 0x50 quaggiù, da qualche parte nella memoria del mio computer. 803 00:32:51,750 --> 00:32:55,825 >> E ho, per esempio, Gabe in minuscolo qui, come questo. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 E ho detto staffa t 0 ottiene capitalizzati. 806 00:33:01,980 --> 00:33:04,860 Beh, t staffa 0 è la prima lettera t. 807 00:33:04,860 --> 00:33:07,840 Così poco g sta per diventare grande G. Ma il problema 808 00:33:07,840 --> 00:33:09,410 è, ciò che s anche il punto di? 809 00:33:09,410 --> 00:33:10,300 >> PUBBLICO: Lo stesso. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. MALAN: La stessa cosa esatta. 811 00:33:11,841 --> 00:33:16,342 Quindi una semplice spiegazione, forse, anche se la sintassi è un po 'strano. 812 00:33:16,342 --> 00:33:17,050 Quindi cerchiamo di fare questo. 813 00:33:17,050 --> 00:33:20,210 Fai copia-0 e poi ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Dire qualcosa: Gabe. 816 00:33:24,110 --> 00:33:26,760 E purtroppo, entrambi loro ora sono stati capitalizzati, 817 00:33:26,760 --> 00:33:29,500 ma per quella sottostante ragione che siamo semplicemente 818 00:33:29,500 --> 00:33:32,350 ora si tratta di indirizzi. 819 00:33:32,350 --> 00:33:36,470 >> Quindi, come si comincia a address-- no pun intended-- 820 00:33:36,470 --> 00:33:39,270 come possiamo cominciare ad affrontare questo particolare problema? 821 00:33:39,270 --> 00:33:44,400 Beh, in copy1.c, le cose stanno andando per ottenere un po 'più complicato. 822 00:33:44,400 --> 00:33:49,310 Ma vorrei rivendicare un soluzione concettualmente semplice. 823 00:33:49,310 --> 00:33:50,852 >> Così difficile da ottenere a prima vista. 824 00:33:50,852 --> 00:33:53,560 Non sarà facile per la prima volta che si digita fuori, forse, 825 00:33:53,560 --> 00:33:57,440 ma se il problema è che semplicemente facendo t = s solo 826 00:33:57,440 --> 00:33:59,694 copia l'indirizzo, cosa, ancora se posso prendere su di te, 827 00:33:59,694 --> 00:34:02,110 sta per essere la soluzione per realtà la copia di una stringa? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBBLICO: noi probabilmente utilizzare nuovamente un ciclo. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. MALAN: Già. 831 00:34:06,890 --> 00:34:08,390 Quindi stiamo andando ad avere bisogno di nuovo un ciclo. 832 00:34:08,390 --> 00:34:11,800 E perché se vogliamo copiare una stringa s in un'altra stringa, 833 00:34:11,800 --> 00:34:14,120 probabilmente vogliamo farlo carattere per carattere. 834 00:34:14,120 --> 00:34:17,199 Ma il problema è, se questo è di origine s, 835 00:34:17,199 --> 00:34:22,159 ora abbiamo bisogno di cominciare in modo esplicito allocazione di memoria per t. 836 00:34:22,159 --> 00:34:24,320 >> In altre parole, cerchiamo di ridisegnare per l'ultima volta. 837 00:34:24,320 --> 00:34:28,659 Se questa è la stringa s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 E mettiamo questo qui, pure. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Questo è GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 E poi, l'immagine di qualcosa come che sta per essere come prima, 844 00:34:43,860 --> 00:34:44,360 g-a-b-e-/ 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Che sembra un po 'di qualcosa come questo. 847 00:34:48,960 --> 00:34:53,650 E s quindi, noi chiamiamo questo 0x50, e che sta per essere 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Quindi questo è 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 E poi, io faccio stringa t. 851 00:34:59,690 --> 00:35:02,450 In memoria, che sta solo andando a dammi un po 'quadrato come questo. 852 00:35:02,450 --> 00:35:04,080 Allora qual è il passo fondamentale adesso? 853 00:35:04,080 --> 00:35:09,870 Se voglio copiare s in t, ciò che blank abbiamo bisogno di compilare qui? 854 00:35:09,870 --> 00:35:12,050 O che cosa abbiamo bisogno per fare ad alto livello? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Sì? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Qualcuno? 859 00:35:17,020 --> 00:35:17,690 Già. 860 00:35:17,690 --> 00:35:19,214 >> PUBBLICO: Abbiamo bisogno di [incomprensibile]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. MALAN: Sì, abbiamo necessario compilare in questo vuoto. 862 00:35:21,380 --> 00:35:24,340 Non riesco a copiare e poi capitalizzare il nome di Gabe 863 00:35:24,340 --> 00:35:28,120 fino Chiedo il sistema operativo per un altro pezzo di memoria 864 00:35:28,120 --> 00:35:30,640 che è almeno altrettanto grande come l'originale. 865 00:35:30,640 --> 00:35:32,130 In modo che ci lascia con una domanda. 866 00:35:32,130 --> 00:35:36,080 >> Come faccio a chiedere il sistema operativo non solo per un semplice piccolo pointer-- 867 00:35:36,080 --> 00:35:38,530 come questo è chiamato, un indirizzo, un non pointer-- 868 00:35:38,530 --> 00:35:40,980 per una semplice piccola scatola come questo chiamato una stringa? 869 00:35:40,980 --> 00:35:44,200 Come faccio a chiedere il funzionamento sistema per una grossa fetta di memoria? 870 00:35:44,200 --> 00:35:48,430 Finora, ho ottenuto solo che indietro indirettamente chiamando GetString. 871 00:35:48,430 --> 00:35:50,740 Così come è GetString anche ottenere la sua memoria? 872 00:35:50,740 --> 00:35:53,430 >> Beh, si scopre che non c'è questa altra funzione qui 873 00:35:53,430 --> 00:35:55,160 che ora inizieremo ad usare. 874 00:35:55,160 --> 00:35:59,780 Ora, questo sembra than-- modo più criptico e io sono l'unico che può vedere it-- 875 00:35:59,780 --> 00:36:03,150 questa linea sembra molto più criptico poi dovrebbe a prima vista. 876 00:36:03,150 --> 00:36:04,650 Ma cerchiamo di prendere in giro a parte. 877 00:36:04,650 --> 00:36:07,950 >> Sul lato sinistro, ho char * t. 878 00:36:07,950 --> 00:36:13,280 Quindi, in inglese, cominciamo a formulare frasi appropriate in gergo tecnico. 879 00:36:13,280 --> 00:36:19,757 Quindi questo è l'allocazione di un variabile di tipo char * chiamato t. 880 00:36:19,757 --> 00:36:21,090 Ora, che cosa significa in realtà? 881 00:36:21,090 --> 00:36:23,881 >> Bene, questo significa, che cosa sono io che vado di mettere in questa variabile chiamata t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Un indirizzo di un char. 884 00:36:26,402 --> 00:36:28,360 Ecco, questo è solo il più semplice, modo più ragionevole 885 00:36:28,360 --> 00:36:29,930 di descrivere il lato sinistro. 886 00:36:29,930 --> 00:36:32,890 Così che crea questa casella qui solo. 887 00:36:32,890 --> 00:36:34,760 Quindi il lato destro, presumibilmente, sta andando 888 00:36:34,760 --> 00:36:37,170 di destinare tale grande pezzo di memoria come? 889 00:36:37,170 --> 00:36:38,340 Quindi cerchiamo di prendere in giro questa parte. 890 00:36:38,340 --> 00:36:41,131 >> E 'sconvolgente a prima vista, ma cosa sta succedendo qui dentro? 891 00:36:41,131 --> 00:36:43,740 In primo luogo, c'è malloc, che è apparentemente il nostro nuovo amico, 892 00:36:43,740 --> 00:36:45,450 "Memoria allocare." 893 00:36:45,450 --> 00:36:49,560 Quindi questo è l'argomento di essere passati in esso, quindi è una bella grande argomento. 894 00:36:49,560 --> 00:36:50,970 Quindi cerchiamo di prendere in giro questa parte. 895 00:36:50,970 --> 00:36:53,410 >> strlen di s, naturalmente, rappresenta the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 PUBBLICO: Il numero di caratteri. 898 00:36:55,600 --> 00:36:56,710 DAVID J. MALAN: Solo il numero di caratteri in s. 899 00:36:56,710 --> 00:36:59,040 Quindi la lunghezza s, la stringa originale. 900 00:36:59,040 --> 00:37:00,350 Quindi G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Quindi è probabilmente quattro in questo caso. 902 00:37:02,320 --> 00:37:05,485 Perché sto facendo uno dopo chiamando strlen di s? 903 00:37:05,485 --> 00:37:06,360 PUBBLICO: [incomprensibile] 904 00:37:06,360 --> 00:37:07,590 DAVID J. MALAN: Per questo speciale carattere null. 905 00:37:07,590 --> 00:37:11,260 Se mi chiedete qual è la lunghezza di Il nome di Gabe, vado a dire quattro. 906 00:37:11,260 --> 00:37:14,480 Sotto il cofano, però, ho bisogno di che il quinto byte per il carattere null. 907 00:37:14,480 --> 00:37:16,100 Ecco perché sto facendo il +1. 908 00:37:16,100 --> 00:37:21,730 >> Ora, nel caso in cui si esegue questa programma su un computer diverso, diciamo, 909 00:37:21,730 --> 00:37:24,610 l'apparecchio CS50, in cui la dimensione di un char 910 00:37:24,610 --> 00:37:26,350 potrebbe essere diverso dalla mia computer-- 911 00:37:26,350 --> 00:37:30,590 Risulta che posso chiamare questo sizeof operatore, basta chiedere al computer, 912 00:37:30,590 --> 00:37:32,870 quali sono le dimensioni di un char su questo computer? 913 00:37:32,870 --> 00:37:37,400 >> E moltiplicando cinque in questo esempio la dimensione di un carattere, che 914 00:37:37,400 --> 00:37:40,440 sulla maggior parte dei computer sarà essere solo uno, malloc 915 00:37:40,440 --> 00:37:44,830 sta per allocare per me questo grande pezzo di memoria qui a destra. 916 00:37:44,830 --> 00:37:47,140 E sta andando a return-- è un function-- quindi è 917 00:37:47,140 --> 00:37:48,265 intenzione di tornare a me che cosa? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 PUBBLICO: L'indirizzo? 920 00:37:51,830 --> 00:37:53,709 DAVID J. MALAN: l'indirizzo di cosa? 921 00:37:53,709 --> 00:37:55,250 PUBBLICO: della memoria è allocata? 922 00:37:55,250 --> 00:37:56,450 DAVID J. MALAN: Del la memoria è allocata. 923 00:37:56,450 --> 00:37:59,189 Quindi non ho idea, francamente, dove questo sta per finire. 924 00:37:59,189 --> 00:38:01,480 Ho intenzione di proporre che sta andando a finire a 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Completamente arbitrario, ma altrove rispetto 0x50, 927 00:38:06,009 --> 00:38:08,800 perché il sistema operativo, cosa Windows e Mac OS fanno per me, è 928 00:38:08,800 --> 00:38:11,230 assicurarsi che sta dando Mi diversi pezzi di RAM. 929 00:38:11,230 --> 00:38:14,210 >> Quindi questo è il valore in cui questo pezzo di memoria potrebbe finire. 930 00:38:14,210 --> 00:38:16,060 Quindi questo è quello che finisce qui, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Così ora chiaramente, posso capire che questo non è lo stesso di questo, 933 00:38:21,570 --> 00:38:23,960 perché sono che punta a diversi blocchi di memoria. 934 00:38:23,960 --> 00:38:29,980 Quindi, se io ora effettivamente voglio copiare questo in, facciamo la soluzione proposta. 935 00:38:29,980 --> 00:38:36,870 >> Andiamo, creare un ciclo for, e fare la staffa t i s ottiene staffa i. 936 00:38:36,870 --> 00:38:39,760 Perché ora posso usare questa notazione array-like, 937 00:38:39,760 --> 00:38:43,390 perché anche se malloc molto genericamente mi alloca memoria, 938 00:38:43,390 --> 00:38:45,290 memoria è solo byte contigui. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, back to back to back. 940 00:38:47,240 --> 00:38:50,030 >> Posso sicuramente come programmatore trattarlo come un array, che 941 00:38:50,030 --> 00:38:55,090 significa che posso usare questo finalmente familiare notazione di solo alcuni parentesi quadre. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Quindi lasciatemi pausa lì, perché questo è un sacco tutto in una volta, anche 944 00:39:00,020 --> 00:39:03,530 se l'idea di base di ricapitolare è che stringa, tutto questo tempo, 945 00:39:03,530 --> 00:39:05,550 Non è un nuovo tipo di dati di per sé. 946 00:39:05,550 --> 00:39:10,150 E 'solo un cosiddetto puntatore, l'indirizzo di un personaggio, 947 00:39:10,150 --> 00:39:12,650 il che significa semplicemente che è un numero che per convenzione umana 948 00:39:12,650 --> 00:39:15,350 tendiamo a scrivere come 0x qualcosa. 949 00:39:15,350 --> 00:39:18,590 >> Ma è solo un numero, come 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 che sembra essere il Indirizzo di CS dell'edificio. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Hai domande su questi dettagli? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Sì? 955 00:39:25,289 --> 00:39:28,530 >> PUBBLICO: Perché controlliamo per t uguale a null? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. MALAN: Perché noi verificare la presenza di t uguale a null? 957 00:39:30,740 --> 00:39:33,250 Se leggiamo la documentation-- grande interrogo per malloc, 958 00:39:33,250 --> 00:39:37,020 sta andando a dire in stampa fine, a volte malloc potrebbe restituire null, 959 00:39:37,020 --> 00:39:38,080 proprio come GetString. 960 00:39:38,080 --> 00:39:41,820 E infatti, GetString restituisce null se, a sua volta, malloc restituisce null, 961 00:39:41,820 --> 00:39:43,130 perché GetString utilizza malloc. 962 00:39:43,130 --> 00:39:46,400 >> E che potrebbe accadere se il sistema operativo, Mac OS, Windows, qualunque sia, è semplicemente 963 00:39:46,400 --> 00:39:48,130 di memoria per voi. 964 00:39:48,130 --> 00:39:49,820 Ecco, questo è quello che è successo lì. 965 00:39:49,820 --> 00:39:52,910 >> E mi permetta di rivelare un'altra cosa che potrebbe solo saltare la vostra mente 966 00:39:52,910 --> 00:39:55,100 o completamente essere troppo lontano oltre la linea. 967 00:39:55,100 --> 00:39:59,770 Ma mi permetta di tirare il stesso ciclo for per la copia, 968 00:39:59,770 --> 00:40:05,480 che un momento fa, il richiamo era questo. staffa t i s ottiene staffa i. 969 00:40:05,480 --> 00:40:06,740 >> Bello e facile da usare. 970 00:40:06,740 --> 00:40:09,330 Sembra Week Two di nuovo. 971 00:40:09,330 --> 00:40:14,920 Ma questa versione in realtà può essere riscritto come questo, che sembra criptico. 972 00:40:14,920 --> 00:40:18,280 Si tratta di un puntatore tecnica chiamata aritmetica, indirizzo aritmetica. 973 00:40:18,280 --> 00:40:19,600 Ma perché fa questo lavoro? 974 00:40:19,600 --> 00:40:22,220 >> Ora fastidiosamente, il autori di C ha deciso di utilizzare 975 00:40:22,220 --> 00:40:25,070 il simbolo * per scopi diversi. 976 00:40:25,070 --> 00:40:29,020 Abbiamo visto in passato già una volta, char *, che significa "dammi una variabile 977 00:40:29,020 --> 00:40:31,210 che sta per contenere l'indirizzo di un carattere. " 978 00:40:31,210 --> 00:40:33,990 * Così char in quel contesto significa "dammi una variabile." 979 00:40:33,990 --> 00:40:40,050 >> Purtroppo, se si utilizza il *, senza una parola di fronte ad esso, come char, 980 00:40:40,050 --> 00:40:41,905 è ora chiamato il operatore dereference. 981 00:40:41,905 --> 00:40:43,530 E vedremo più di questa prima lunga. 982 00:40:43,530 --> 00:40:44,930 Ma significa solo "andare lì." 983 00:40:44,930 --> 00:40:49,070 E 'come dire, se qualcuno mi porse su un pezzo di carta "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 se faccio "* 33 Oxford Street," che significa "Andare giù per la strada per la costruzione CS." 985 00:40:53,830 --> 00:40:57,220 >> Quindi * significa semplicemente andare lì se non c'è nessuna parola di fronte ad essa. 986 00:40:57,220 --> 00:40:59,100 Così che cosa è t, per essere chiari? 987 00:40:59,100 --> 00:41:03,250 t è l'indirizzo del blocco di memoria che è stato dato a me. 988 00:41:03,250 --> 00:41:06,650 s è l'indirizzo di quello che, per intenderci, nell'esempio di cui abbiamo discusso, 989 00:41:06,650 --> 00:41:07,500 di Gabe minuscolo? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s è l'indirizzo di-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 PUBBLICO: La stringa. 994 00:41:12,460 --> 00:41:14,126 DAVID J. MALAN: Di nome originale di Gabe. 995 00:41:14,126 --> 00:41:16,660 Quindi è l'indirizzo del questo pezzo di memoria. 996 00:41:16,660 --> 00:41:22,220 Quindi, se io dico t + i-- i, comunicazione, è solo il nostro vecchio amico. 997 00:41:22,220 --> 00:41:24,770 E 'solo una variabile indice che è l'iterazione da zero in su 998 00:41:24,770 --> 00:41:26,960 alla lunghezza della stringa s. 999 00:41:26,960 --> 00:41:30,367 Quindi sarà pari a zero, poi uno, poi due, poi tre, poi quattro. 1000 00:41:30,367 --> 00:41:33,200 Quindi cerchiamo di montare questi nuovi Pezzi del puzzle Scratch-come, se si vuole, 1001 00:41:33,200 --> 00:41:36,140 anche se, di nuovo, la sintassi è molto più arcana di Scratch. 1002 00:41:36,140 --> 00:41:39,522 Quindi t è un indirizzo + i è andando a dare me 1003 00:41:39,522 --> 00:41:42,480 un numero, perché questi sono tutti numeri che abbiamo disegno come esadecimale. 1004 00:41:42,480 --> 00:41:43,560 Ma sono solo numeri. 1005 00:41:43,560 --> 00:41:49,960 >> Quindi, se l'indirizzo di t abbiamo detto era 0x88, 0x88 che cosa è più zero. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Anche se non stai bene con ancora un hex, prendere una supposizione. 1008 00:41:53,980 --> 00:41:54,410 >> PUBBLICO: L'originale. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. MALAN: Still 0x88. 1010 00:41:55,850 --> 00:41:58,910 Così che cosa * 0x88 significa? 1011 00:41:58,910 --> 00:42:02,670 Significa, "andare là", che significa efficace, "mettere il dito qui." 1012 00:42:02,670 --> 00:42:06,930 E ora sul lato destro della questa espressione, * e poi in parentesi, 1013 00:42:06,930 --> 00:42:11,586 s + i significa s, che rappresenta l' indirizzare fino qui del piccolo g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 è, naturalmente, s, qualunque s è. 1015 00:42:16,220 --> 00:42:21,230 >> Così adesso, è s *, che proprio come * 33 Oxford Street significa andare all'indirizzo 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Quindi, ecco questo dito, mano destra. 1018 00:42:24,170 --> 00:42:26,050 Così che cosa sto andando a copiare in che cosa? 1019 00:42:26,050 --> 00:42:30,260 La cosa sulla destra, che è Gabe, poco g qui, in questa sede. 1020 00:42:30,260 --> 00:42:32,750 >> E così l'effetto di tale prima iterazione del ciclo, 1021 00:42:32,750 --> 00:42:36,200 come avete proposto, anche se sembra pazzo più complicato di qualsiasi cosa 1022 00:42:36,200 --> 00:42:42,110 abbiamo visto prima, è semplicemente dicendo andate qui e copiare quel personaggio qui. 1023 00:42:42,110 --> 00:42:44,700 Ti sta dando una mappa per entrambe le posizioni. 1024 00:42:44,700 --> 00:42:46,130 >> E vedremo molto più di questo. 1025 00:42:46,130 --> 00:42:50,600 Ma per ora, la speranza è solo quello di introdurre alcune di queste idee di base. 1026 00:42:50,600 --> 00:42:53,550 E infatti, diamo un'occhiata a un programma definitivo qui, 1027 00:42:53,550 --> 00:42:57,480 e poi la claymation promesso, che renderà tutto bene. 1028 00:42:57,480 --> 00:42:57,980 Bene. 1029 00:42:57,980 --> 00:43:01,680 Così mi permetta di aprire up-- ci andiamo. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Quindi cerchiamo me-- ci torneremo a questo quadro poco tempo. 1032 00:43:05,440 --> 00:43:08,360 Permettetemi di aprire questo ultimo esempio qui. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Così qui è un super, super programma che compie 1035 00:43:12,710 --> 00:43:15,050 niente nella vita che fa quanto segue. 1036 00:43:15,050 --> 00:43:18,740 E prima dichiara due variabili, x e y, che non sono numeri questa volta, 1037 00:43:18,740 --> 00:43:19,240 per sé. 1038 00:43:19,240 --> 00:43:20,448 Non sono numeri interi, di per sé. 1039 00:43:20,448 --> 00:43:22,899 Essi sono apparentemente int *. 1040 00:43:22,899 --> 00:43:25,690 Così chiunque, cosa significa se il tipo di dati, la variabile, 1041 00:43:25,690 --> 00:43:26,860 è di tipo int * stelle? 1042 00:43:26,860 --> 00:43:30,240 Questo è l'indirizzo di un int. 1043 00:43:30,240 --> 00:43:31,990 >> Quindi non ho idea di dove si trova ancora. 1044 00:43:31,990 --> 00:43:35,150 Significa solo "mettere, alla fine, l'indirizzo di un int qui. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, ovunque esso si trovi memoria, un indirizzo è andare lì. 1046 00:43:38,340 --> 00:43:40,200 Ed è quello che y è andando essere, pure. 1047 00:43:40,200 --> 00:43:44,920 >> Se io ora dico x = malloc (sizeof (int)), questo è un modo elegante per dire, 1048 00:43:44,920 --> 00:43:49,000 hey sistema operativo, tramite malloc, dammi memoria sufficiente per la dimensione 1049 00:43:49,000 --> 00:43:52,370 di un int, che è probabilmente sta per essere a 32 bit o quattro byte. 1050 00:43:52,370 --> 00:43:53,680 >> Così che cosa fa tornare malloc? 1051 00:43:53,680 --> 00:43:55,250 Malloc restituisce un indirizzo. 1052 00:43:55,250 --> 00:43:57,020 Allora, cosa sta per ottenere memorizzato in x? 1053 00:43:57,020 --> 00:44:00,600 L'indirizzo del pezzo di memoria, i quattro byte, che malloc 1054 00:44:00,600 --> 00:44:03,360 appena trovato per me chiedendo il sistema operativo. 1055 00:44:03,360 --> 00:44:08,240 >> Ora nel frattempo, la linea quattro qui, il * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Giusto per essere chiari, cosa sta succedendo laggiù? 1057 00:44:09,990 --> 00:44:11,530 Sul lato sinistro, * x. 1058 00:44:11,530 --> 00:44:13,610 che è come * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Così * x cosa significa? 1060 00:44:15,523 --> 00:44:16,450 >> PUBBLICO: Vai a. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. MALAN: Vai a questo indirizzo. 1062 00:44:17,908 --> 00:44:20,466 Ovunque quel pezzo di memoria è, andare a esso. 1063 00:44:20,466 --> 00:44:21,979 E mettere quello che c'è, ovviamente? 1064 00:44:21,979 --> 00:44:22,520 PUBBLICO: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Va bene, * y, stessa idea. 1067 00:44:25,650 --> 00:44:26,860 Vai all'indirizzo in y. 1068 00:44:26,860 --> 00:44:31,740 Mettere il numero 13 lì, ma ciò che è y in questo momento? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBBLICO: Non c'è memoria per y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. MALAN: Ci non è memoria per y. 1072 00:44:35,710 --> 00:44:38,215 Così che cosa y fa probabilmente contengono, come stiamo dicendo? 1073 00:44:38,215 --> 00:44:38,520 >> PUBBLICO: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. MALAN: Alcuni valore spazzatura. 1075 00:44:39,480 --> 00:44:41,320 Ora, il valore spazzatura è ancora un numero. 1076 00:44:41,320 --> 00:44:43,160 Si può ancora essere scambiato per un indirizzo. 1077 00:44:43,160 --> 00:44:45,160 E 'come se qualcuno scarabocchiato qualcosa verso il basso, 1078 00:44:45,160 --> 00:44:48,002 e ho interpretato male come significato qualche edificio in fondo alla strada. 1079 00:44:48,002 --> 00:44:50,460 E se si tenta di andare in qualche edificio non si possiede, 1080 00:44:50,460 --> 00:44:53,710 o qualche pezzo di memoria che non hai stata data, le cose brutte possono accadere. 1081 00:44:53,710 --> 00:44:57,740 Computer potrebbe bloccarsi, o qualche altro comportamento indeterminato potrebbe accadere. 1082 00:44:57,740 --> 00:45:01,310 >> Così l'intro, poi, a Binky è questo. 1083 00:45:01,310 --> 00:45:04,290 Ricordo ancora, 20 alcuni anni dispari dopo, 1084 00:45:04,290 --> 00:45:07,200 dove ero quando ho finalmente capito puntatori. 1085 00:45:07,200 --> 00:45:09,520 >> Vale a dire, se si lasciare qui in tre minuti 1086 00:45:09,520 --> 00:45:12,170 e credo che non lo faccio capire i puntatori, realizzare 1087 00:45:12,170 --> 00:45:14,410 Ho ricordato per 20 anni per qualche ragione pazzo 1088 00:45:14,410 --> 00:45:17,140 quando e perché finalmente affondato in, seduto con il mio insegnamento 1089 00:45:17,140 --> 00:45:19,501 compagno, Nishat Mehta nel indietro di Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Ora, ho ricordato questo perché questo era 1091 00:45:21,250 --> 00:45:23,920 uno dei temi che, in particolare, lottato con. 1092 00:45:23,920 --> 00:45:26,470 E poi, finalmente cliccato, come oserei dire un sacco di argomenti 1093 00:45:26,470 --> 00:45:27,460 alla fine sarà. 1094 00:45:27,460 --> 00:45:32,590 E ora, per fare che sentire tutto il più felice e ancor più convincente, 1095 00:45:32,590 --> 00:45:35,360 diamo uno sguardo finale del nostro ultimi tre minuti qui a Binky, 1096 00:45:35,360 --> 00:45:37,675 dal nostro amico, Nick Parlante da Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [RIPRODUZIONE VIDEO] 1099 00:45:41,580 --> 00:45:42,750 >> Ehi, Binky. 1100 00:45:42,750 --> 00:45:43,500 Svegliati! 1101 00:45:43,500 --> 00:45:45,960 E 'tempo di puntatore divertimento. 1102 00:45:45,960 --> 00:45:47,012 >> -Che È? 1103 00:45:47,012 --> 00:45:48,723 Ulteriori informazioni su puntatori? 1104 00:45:48,723 --> 00:45:50,580 Oh, goody! 1105 00:45:50,580 --> 00:45:53,563 >> Be ', per iniziare, direi che siamo andando a bisogno di un paio di puntatori. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Questo codice assegna due puntatori, che può puntare a numeri interi. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Beh, vedo i due puntatori, ma non sembrano essere che punta a nulla. 1110 00:46:02,140 --> 00:46:02,980 >> -Che È di destra. 1111 00:46:02,980 --> 00:46:05,100 Inizialmente, puntatori non puntare a nulla. 1112 00:46:05,100 --> 00:46:08,030 Le cose a cui puntano sono chiamati pointees, e la loro istituzione del 1113 00:46:08,030 --> 00:46:09,370 una fase separata. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, giusto, giusto. 1115 00:46:10,220 --> 00:46:10,950 Sapevo che. 1116 00:46:10,950 --> 00:46:12,385 I pointees sono separati. 1117 00:46:12,385 --> 00:46:14,315 Er, così come si fa assegnare una pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Beh, questo codice alloca un nuovo pointee intero, 1121 00:46:18,970 --> 00:46:20,950 e questo set parte x per puntare ad esso. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Ehi, che sembra meglio. 1124 00:46:23,230 --> 00:46:25,060 Così fanno fare qualcosa. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Io dereference il puntatore x a memorizzare il numero 42 nella sua pointee. 1127 00:46:30,455 --> 00:46:32,830 Per questo trucco, ho bisogno il mio Bacchetta magica di Dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Il Bacchetta magica di Dereferenziare? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Che-- che è grande. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Questo È ciò che il codice è simile. 1134 00:46:41,080 --> 00:46:44,110 Mi limiterò a impostare il numero, e [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Ehi, guarda. 1136 00:46:44,700 --> 00:46:46,140 Ci va. 1137 00:46:46,140 --> 00:46:50,980 >> -Quindi Facendo un dereference su x segue la freccia per accedere sua pointee. 1138 00:46:50,980 --> 00:46:53,160 In questo caso, un negozio di 42 in là. 1139 00:46:53,160 --> 00:46:57,710 Hey provare a utilizzare per memorizzare il numero 13 attraverso l'altro puntatore, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Ti basta andare qui per y, e ottenere il numero 13 set up. 1142 00:47:03,270 --> 00:47:07,930 E poi, prendere la Bacchetta di Dereferenziare e proprio [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 Che non ha funzionato. 1146 00:47:11,090 --> 00:47:15,630 Dite, Binky, non credo dereferencing y è una buona idea, perché si sa, 1147 00:47:15,630 --> 00:47:17,850 impostazione della pointee è una fase separata. 1148 00:47:17,850 --> 00:47:20,450 E non credo che abbiamo mai fatto. 1149 00:47:20,450 --> 00:47:21,480 >> Punto -Buona. 1150 00:47:21,480 --> 00:47:21,980 -Già. 1151 00:47:21,980 --> 00:47:25,680 Abbiamo assegnato il puntatore y, ma noi mai impostarlo per puntare a un pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Molto Attento. 1154 00:47:28,616 --> 00:47:30,240 Ehi, stai guardando bene lì, Binky. 1155 00:47:30,240 --> 00:47:33,400 Riesci a risolvere il problema in modo che i punti y allo stesso pointee come x? 1156 00:47:33,400 --> 00:47:34,000 >> -Certo. 1157 00:47:34,000 --> 00:47:36,780 Userò la mia bacchetta magica Assegnazione di Pointer. 1158 00:47:36,780 --> 00:47:38,740 >> -È Che sta per essere un problema come prima? 1159 00:47:38,740 --> 00:47:39,240 -No. 1160 00:47:39,240 --> 00:47:40,660 Questo non tocca i pointees. 1161 00:47:40,660 --> 00:47:44,450 Si cambia solo un puntatore a indicare la stessa cosa di un altro. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, vedo. 1163 00:47:45,450 --> 00:47:48,200 Ora y punti allo stesso posto come x. 1164 00:47:48,200 --> 00:47:48,910 Quindi aspettare. 1165 00:47:48,910 --> 00:47:49,950 Ora, y è fissa. 1166 00:47:49,950 --> 00:47:51,120 Ha un pointee. 1167 00:47:51,120 --> 00:47:54,510 Così si può provare la Bacchetta di Dereferenziare nuovamente di inviare il 13 sopra. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Qui si va. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Ehi, guarda che. 1171 00:47:59,340 --> 00:48:00,750 Ora dereferencing opere su y. 1172 00:48:00,750 --> 00:48:04,991 E poiché i puntatori sono la condivisione che uno pointee, entrambi vedono il 13. 1173 00:48:04,991 --> 00:48:05,490 -Già. 1174 00:48:05,490 --> 00:48:06,870 Condivisione, qualunque sia. 1175 00:48:06,870 --> 00:48:08,820 Quindi stiamo andando a cambiare posti ora? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, guarda. 1177 00:48:09,440 --> 00:48:10,830 Siamo fuori tempo. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Basta Ricordare le tre regole puntatore. 1180 00:48:13,530 --> 00:48:16,560 Numero Uno, la struttura di base è che avete un puntatore, 1181 00:48:16,560 --> 00:48:18,680 e che punti verso un pointee. 1182 00:48:18,680 --> 00:48:20,640 Ma il puntatore e pointee sono separati, 1183 00:48:20,640 --> 00:48:22,610 e l'errore comune è quello di creare un puntatore, 1184 00:48:22,610 --> 00:48:25,000 ma a dimenticare di dare un pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Numero Due, puntatore dereferenziazione inizia in corrispondenza del puntatore 1186 00:48:28,170 --> 00:48:31,050 e segue la sua freccia su per accedere al suo pointee. 1187 00:48:31,050 --> 00:48:33,400 Come tutti sappiamo, questo funziona solo se c'è 1188 00:48:33,400 --> 00:48:36,270 un pointee, che tipo di si rimette alla regola numero uno. 1189 00:48:36,270 --> 00:48:39,000 >> Numero Tre, puntatore Assegnazione prende un puntatore 1190 00:48:39,000 --> 00:48:42,320 e lo cambia per puntare al stesso pointee come un altro puntatore. 1191 00:48:42,320 --> 00:48:44,160 Così, dopo l'assegnazione, i due puntatori 1192 00:48:44,160 --> 00:48:45,910 punterà alla stessa pointee. 1193 00:48:45,910 --> 00:48:47,990 A volte, che si chiama condivisione. 1194 00:48:47,990 --> 00:48:49,740 E questo è tutto quello che c'è da fare, davvero. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye ora. 1196 00:48:50,277 --> 00:48:51,110 [FINE RIPRODUZIONE VIDEO] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. MALAN: Questo è tutto per CS50. 1198 00:48:52,568 --> 00:48:55,110 Vedremo la prossima settimana. 1199 00:48:55,110 --> 00:48:56,064