1 00:00:00,000 --> 00:00:01,110 >> [MUSIQUE LECTURE] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: Très bien. 4 00:00:11,650 --> 00:00:15,610 C'est CS50, et ce est la fin de la quatrième semaine. 5 00:00:15,610 --> 00:00:19,420 Et l'un des sujets aujourd'hui est celui de la criminalistique numérique, 6 00:00:19,420 --> 00:00:20,989 l'art de la récupération des informations. 7 00:00:20,989 --> 00:00:22,780 Et en effet, même si vous êtes dans le milieu 8 00:00:22,780 --> 00:00:25,070 en ce moment de paix à trois et Breakout, la semaine prochaine, 9 00:00:25,070 --> 00:00:27,880 l'accent sera mis sur précisément ce domaine. 10 00:00:27,880 --> 00:00:30,686 >> Donc, l'un des emplois les plus cool que jamais eu était de retour à l'école diplômé, 11 00:00:30,686 --> 00:00:33,560 quand je travaillais pour les locaux Middlesex County District Attorney de 12 00:00:33,560 --> 00:00:34,950 bureau, la médecine légale qui font travailler. 13 00:00:34,950 --> 00:00:37,450 Donc, essentiellement, le Massachusetts Police d'Etat, à l'occasion, 14 00:00:37,450 --> 00:00:40,100 lorsque l'on travaille sur des cas serait apporter des choses comme les disques durs 15 00:00:40,100 --> 00:00:42,185 et les disquettes et cartes mémoire et similaires. 16 00:00:42,185 --> 00:00:44,060 Et ils les remettre pour moi et mon mentor, 17 00:00:44,060 --> 00:00:48,070 et notre objectif était de trouver des preuves, s'il y avait, sur ces médias. 18 00:00:48,070 --> 00:00:50,700 Aperçus Maintenant, vous avez peut-être vu de ce monde de la médecine légale 19 00:00:50,700 --> 00:00:53,000 dans les médias, de la télévision et des films. 20 00:00:53,000 --> 00:00:55,730 Mais le travail, j'ai eu, et disons-le, ce monde, 21 00:00:55,730 --> 00:00:57,550 n'est pas tout à fait comme vous le voir. 22 00:00:57,550 --> 00:01:00,794 Jetons un oeil à ce que vous avez probablement vu. 23 00:01:00,794 --> 00:01:01,460 [VIDEO LECTURE] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Maintenant, passons un bon coup d'oeil à vous. 26 00:01:05,380 --> 00:01:06,850 >> [MUSIQUE LECTURE] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -hold Il. 29 00:01:12,932 --> 00:01:13,657 Exécutez ce retour. 30 00:01:13,657 --> 00:01:14,733 >> -wait Une minute. 31 00:01:14,733 --> 00:01:15,233 Allez à droite. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Il. 34 00:01:16,870 --> 00:01:17,369 Congeler que. 35 00:01:17,369 --> 00:01:17,930 -Full Écran. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Congeler que. 38 00:01:18,875 --> 00:01:20,160 -Serrez Là-dessus, vous? 39 00:01:20,160 --> 00:01:22,126 >> En ce que sur -vector type de la roue arrière. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom En droit ici à cet endroit. 41 00:01:24,435 --> 00:01:28,580 >> -Avec Le bon équipement, la image peut être agrandie et aiguisé. 42 00:01:28,580 --> 00:01:29,330 >> -Quel Ce que c'est? 43 00:01:29,330 --> 00:01:30,780 >> -C'est Un programme d'amélioration. 44 00:01:30,780 --> 00:01:32,170 >> -Pouvez Vous clair que n'importe quel? 45 00:01:32,170 --> 00:01:33,070 >> Je n'en sais rien. 46 00:01:33,070 --> 00:01:34,150 Disons améliorer. 47 00:01:34,150 --> 00:01:35,440 >> -Améliorez Section A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 J'ai amélioré le détail, et-- 50 00:01:38,562 --> 00:01:40,020 -I Pense qu'il ya assez d'améliorer. 51 00:01:40,020 --> 00:01:40,976 Relâchez-le pour mon écran. 52 00:01:40,976 --> 00:01:42,559 >> -I Amélioré la réflexion dans son oeil. 53 00:01:42,559 --> 00:01:44,322 -Let Est géré par ce l'amélioration de la vidéo. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Pouvez-vous améliorer cela? 55 00:01:45,210 --> 00:01:45,710 >> -hang Sur. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -J'ai Travaillé sur cette réflexion. 58 00:01:49,458 --> 00:01:50,402 >> La réflexion de la personne de -Il. 59 00:01:50,402 --> 00:01:50,902 >> -Réflexion. 60 00:01:50,902 --> 00:01:52,870 -Il C'est une réflexion du visage de l'homme. 61 00:01:52,870 --> 00:01:53,694 >> Réflexion -Le! 62 00:01:53,694 --> 00:01:54,610 -Il C'est une réflexion. 63 00:01:54,610 --> 00:01:55,880 -Zoom Dans le miroir. 64 00:01:55,880 --> 00:01:57,860 Vous pouvez voir un reflet. 65 00:01:57,860 --> 00:01:59,630 >> -Peut Vous améliorez l'image à partir d'ici? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 -Peut Vous améliorer? 68 00:02:01,210 --> 00:02:02,190 -Peut Vous améliorer? 69 00:02:02,190 --> 00:02:03,066 -Peut Nous améliorons ce? 70 00:02:03,066 --> 00:02:03,898 -Peut Vous améliorer? 71 00:02:03,898 --> 00:02:04,740 -hold Une seconde. 72 00:02:04,740 --> 00:02:05,281 Je vais à améliorer. 73 00:02:05,281 --> 00:02:06,470 -Zoom Dans la porte. 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 Vous suffit de placer dans. 77 00:02:08,509 --> 00:02:09,340 -Plus. 78 00:02:09,340 --> 00:02:10,094 Attends, arrêter. 79 00:02:10,094 --> 00:02:10,750 -stop. 80 00:02:10,750 --> 00:02:11,250 -PAUSE Il. 81 00:02:11,250 --> 00:02:13,542 Nous -tourner 75 degrés autour de la verticale, s'il vous plaît. 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 Retour à la partie sur la porte. 85 00:02:19,330 --> 00:02:21,420 >> -Got Un activateur d'image qui peut bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -peut-Être nous pouvons utiliser la Pradeep Singh méthode de voir dans les fenêtres. 87 00:02:24,420 --> 00:02:25,902 >> -Le Logiciel est l'état de l'art. 88 00:02:25,902 --> 00:02:26,866 >> -Le Valeur propre est éteint. 89 00:02:26,866 --> 00:02:29,758 >> -Avec Le droit combinaison de algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> L'illumination pris de -Il algorithmes au niveau suivant, 91 00:02:32,168 --> 00:02:34,110 et je peux les utiliser pour améliorer cette photo. 92 00:02:34,110 --> 00:02:36,840 >> -lock Sur et agrandir l'axe z. 93 00:02:36,840 --> 00:02:37,351 >> -Améliorez. 94 00:02:37,351 --> 00:02:37,850 Améliorer. 95 00:02:37,850 --> 00:02:38,720 -Améliorez. 96 00:02:38,720 --> 00:02:40,070 -Freeze Et améliorer. 97 00:02:40,070 --> 00:02:43,420 [FIN LECTURE VIDÉO] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Ce sont donc les tous les mots, mais ils ne sont pas 99 00:02:45,830 --> 00:02:47,870 utilisé dans des phrases correctement. 100 00:02:47,870 --> 00:02:52,370 Et en effet, à l'avenir, à tout moment, s'il vous plaît, vous entendez quelqu'un dire le mot, 101 00:02:52,370 --> 00:02:54,250 «Améliorer», rire un peu. 102 00:02:54,250 --> 00:02:57,190 Parce que quand vous essayez d'améliorer, par exemple, c'est ce qui arrive. 103 00:02:57,190 --> 00:02:58,580 >> Alors, voici une photo magnifique. 104 00:02:58,580 --> 00:02:59,720 C'est propre Daven de CS50. 105 00:02:59,720 --> 00:03:03,740 Et supposons que nous voulions concentrer sur l'étincelle dans les yeux, 106 00:03:03,740 --> 00:03:05,870 ou la réflexion de l' méchant qui était clairement 107 00:03:05,870 --> 00:03:07,820 capturée par la caméra de surveillance. 108 00:03:07,820 --> 00:03:10,330 C'est ce qui arrive quand vous zoomez sur une image 109 00:03:10,330 --> 00:03:14,060 a un nombre fini de bits qui lui sont associés. 110 00:03:14,060 --> 00:03:15,420 >> C'est ce que vous obtiendrez. 111 00:03:15,420 --> 00:03:19,190 Et en effet, dans l'œil de Daven est mais quatre, peut-être six pixels 112 00:03:19,190 --> 00:03:22,110 composer exactement ce que il a été étincelant. 113 00:03:22,110 --> 00:03:25,890 Donc problème Set Four aura finalement d'explorer ce monde, en particulier 114 00:03:25,890 --> 00:03:28,090 par la nature de quelque chose nous appelons fichier i / o, où 115 00:03:28,090 --> 00:03:31,000 i / o est juste une façon élégante de disant entrée et de sortie. 116 00:03:31,000 --> 00:03:34,280 >> Donc, jusqu'à présent, toutes les interactions nous avons eu avec un ordinateur 117 00:03:34,280 --> 00:03:36,770 ont été largement avec votre clavier et l'écran, 118 00:03:36,770 --> 00:03:40,770 mais pas autant avec le disque dur, ou de l'enregistrement de fichiers au-delà de celles que vous 119 00:03:40,770 --> 00:03:41,620 vous écrire. 120 00:03:41,620 --> 00:03:44,570 Vos programmes ont jusqu'à présent pas été la création et l'enregistrement, 121 00:03:44,570 --> 00:03:46,270 et mettre à jour leurs propres fichiers. 122 00:03:46,270 --> 00:03:47,150 >> Eh bien, ce qui est un fichier? 123 00:03:47,150 --> 00:03:48,105 Eh bien, quelque chose comme un JPEG. 124 00:03:48,105 --> 00:03:50,520 C'est une image que vous pourriez avoir ou télécharger sur Facebook, 125 00:03:50,520 --> 00:03:51,690 ou voir n'importe où sur le web. 126 00:03:51,690 --> 00:03:54,460 En effet, cette photo nous venons de scie de Daven était un JPEG. 127 00:03:54,460 --> 00:03:57,570 Et ce qui est intéressant sur les fichiers comme les fichiers JPEG 128 00:03:57,570 --> 00:04:02,170 est qu'ils peuvent être identifiés, typiquement, par certains motifs de bits. 129 00:04:02,170 --> 00:04:05,200 >> En d'autres termes, qu'est-ce que distingue un JPEG de GIF 130 00:04:05,200 --> 00:04:08,109 d'un PING à partir d'un mot document à partir d'un fichier Excel? 131 00:04:08,109 --> 00:04:09,900 Eh bien, c'est juste différent motifs de bits. 132 00:04:09,900 --> 00:04:12,820 Et ces différents modèles sont généralement au début de ces fichiers. 133 00:04:12,820 --> 00:04:18,200 >> De sorte que lorsque votre ordinateur ouvrait un fichier Word doc, ou quand un ordinateur ouvre un fichier JPEG, 134 00:04:18,200 --> 00:04:20,940 il ressemble généralement à la premiers plusieurs bits dans le fichier. 135 00:04:20,940 --> 00:04:24,059 Et si elle reconnaît un motif, il dit, oh, c'est une image. 136 00:04:24,059 --> 00:04:25,850 Permettez-moi de l'afficher à l'utilisateur sous forme graphique. 137 00:04:25,850 --> 00:04:27,870 Ou, oh, cela ressemble à un document Word. 138 00:04:27,870 --> 00:04:30,480 Permettez-moi de montrer à l'utilisateur comme un essai. 139 00:04:30,480 --> 00:04:33,020 >> Ainsi, par exemple, JPEG, il s'avère, sont 140 00:04:33,020 --> 00:04:35,460 assez sophistiqué sous la hotte. 141 00:04:35,460 --> 00:04:40,140 Mais les trois premiers octets de plus chaque JPEG commencer par ces trois numéros. 142 00:04:40,140 --> 00:04:44,680 Donc octet zéro, un, et deux sont en plus tous les JPEG, 255, puis le numéro 143 00:04:44,680 --> 00:04:46,675 216, puis le numéro 255. 144 00:04:46,675 --> 00:04:48,990 >> Et ce que vous serez en mesure de commencer à faire la semaine prochaine 145 00:04:48,990 --> 00:04:52,920 est en fait piquer dessous le capot de fichiers comme les fichiers JPEG 146 00:04:52,920 --> 00:04:57,210 et comme les fichiers bitmap, et de voir ce qui a toujours été là pour aussi longtemps 147 00:04:57,210 --> 00:04:58,650 que vous avez été en utilisant un ordinateur. 148 00:04:58,650 --> 00:05:01,860 >> Mais ce qui est là n'est généralement pas écrite comme nombres décimaux de ce genre. 149 00:05:01,860 --> 00:05:04,620 Les informaticiens ne font pas tendance à parler en décimal. 150 00:05:04,620 --> 00:05:06,139 Ils ne parlent pas vraiment en binaire. 151 00:05:06,139 --> 00:05:07,930 En règle générale, lorsque l'on veut pour exprimer des nombres, 152 00:05:07,930 --> 00:05:10,710 nous utilisons effectivement hexadécimal, que vous pouvez rappeler 153 00:05:10,710 --> 00:05:13,027 de, disons, ensemble de problèmes Un, qui a contesté 154 00:05:13,027 --> 00:05:14,610 vous pensez à un système différent. 155 00:05:14,610 --> 00:05:17,170 >> Nous, bien sûr, connaît avec décimale, de zéro à neuf. 156 00:05:17,170 --> 00:05:18,215 Nous avons parlé de binaire. 157 00:05:18,215 --> 00:05:20,710 Et nous n'avons pas vraiment à utiliser que beaucoup ici 158 00:05:20,710 --> 00:05:22,470 sur, parce que les ordinateurs vont utiliser cela. 159 00:05:22,470 --> 00:05:24,900 Mais les programmeurs sera très souvent, mais pas toujours, 160 00:05:24,900 --> 00:05:29,360 utiliser hexadécimal, ce qui signifie tout simplement vous avez 16 lettres dans votre alphabet, 161 00:05:29,360 --> 00:05:31,330 au lieu de deux ou 10. 162 00:05:31,330 --> 00:05:34,530 >> Alors, comment comptez-vous de la hausse de neuf en hexadécimal? 163 00:05:34,530 --> 00:05:41,120 On va à 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, juste par convention. 164 00:05:41,120 --> 00:05:43,540 Mais ce qui est important est que chaque de ceux-ci est un symbole unique. 165 00:05:43,540 --> 00:05:44,340 Il n'y a pas 10. 166 00:05:44,340 --> 00:05:48,400 Il n'y a pas 11, en soi, car chaque de vos chiffres, tout comme en décimal 167 00:05:48,400 --> 00:05:51,940 et tout comme dans binaire, si juste être un caractère unique, par convention. 168 00:05:51,940 --> 00:05:55,280 >> Donc, qui est alors l'alphabet que nous avons à notre disposition pour hexadécimal. 169 00:05:55,280 --> 00:05:58,600 Alors qu'est-ce qu'un JPEG ressembler si vous étaient d'écrire les trois premiers 170 00:05:58,600 --> 00:06:01,980 octets pas en décimal mais, par exemple, comme hexadécimal? 171 00:06:01,980 --> 00:06:03,640 Et pourquoi est-hex même si utile que ça? 172 00:06:03,640 --> 00:06:05,290 >> Eh bien, un coup d'oeil à un exemple. 173 00:06:05,290 --> 00:06:09,030 Donc, si j'écris sur les bits représenter ces numbers-- décimal 174 00:06:09,030 --> 00:06:12,450 cela pourrait être un peu rouillé maintenant de quelques semaines, 175 00:06:12,450 --> 00:06:14,820 mais l'un à gauche et l' droite sont assez facile. 176 00:06:14,820 --> 00:06:17,990 255 est le plus grand nombre nous pourrait représenter huit bits. 177 00:06:17,990 --> 00:06:18,820 Il était tout petits. 178 00:06:18,820 --> 00:06:21,320 Donc, le seul qui est légèrement intéressant est celui du milieu. 179 00:06:21,320 --> 00:06:24,700 Et si vous sorte de faire le mathématiques, vous en déduire que, en effet, 180 00:06:24,700 --> 00:06:27,949 ce modèle d'une seule et zéros représente 216. 181 00:06:27,949 --> 00:06:30,240 Alors disons simplement stipuler maintenant que ce sont correctes. 182 00:06:30,240 --> 00:06:31,730 Mais pourquoi est-ce intéressant? 183 00:06:31,730 --> 00:06:33,970 >> Bien, un octet, bien sûr, est de huit bits. 184 00:06:33,970 --> 00:06:38,980 Et il s'avère que si vous pensez d'un octet en tant que deux blocs de quatre bits, 185 00:06:38,980 --> 00:06:39,500 comme ça. 186 00:06:39,500 --> 00:06:41,000 Permettez-moi d'ajouter un peu d'espace. 187 00:06:41,000 --> 00:06:42,550 Donc, avant, après. 188 00:06:42,550 --> 00:06:46,520 Je viens d'ajouter un espace blanc pour l'amour de visualisation ici. 189 00:06:46,520 --> 00:06:51,840 Comment pourrions-nous représenter maintenant, par exemple, hexadécimal chaque quad de bits, 190 00:06:51,840 --> 00:06:52,880 chaque groupe de quatre bits? 191 00:06:52,880 --> 00:06:56,420 >> Ainsi, par exemple, sur la gauche maintenant, nous avons 1 111 en binaire. 192 00:06:56,420 --> 00:07:00,420 Quel est ce nombre en décimal, si vous faites le calcul? 193 00:07:00,420 --> 00:07:03,780 Vous avez la position des unités, le lieu de deux, la place à quatre pattes, et le lieu de huit. 194 00:07:03,780 --> 00:07:04,341 >> PUBLIC: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. Malan: C'est 15. 196 00:07:05,340 --> 00:07:08,340 Donc, si nous faisons huit plus quatre plus deux plus un, on obtient 15. 197 00:07:08,340 --> 00:07:11,790 Ainsi, j'ai pu écrire 15 ci-dessous 1111, mais toute la question ici 198 00:07:11,790 --> 00:07:13,190 est hexadécimal, décimal pas. 199 00:07:13,190 --> 00:07:17,310 Ainsi, au lieu d'écrire 15, 1-5, Je vais écrire que dans l'hexagone, 200 00:07:17,310 --> 00:07:22,311 qui si vous pensez en arrière, si vous avez zéro à f, ce qui est 15 va être? 201 00:07:22,311 --> 00:07:22,810 PUBLIC: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Donc, il s'avère que c'est f. 203 00:07:24,434 --> 00:07:29,140 Et vous pouvez travailler que par dire: bien, si a est 10, puis sur OK, f est 15. 204 00:07:29,140 --> 00:07:33,250 Donc, en effet, nous pourrions réécrire cette même série de numéros que f f. 205 00:07:33,250 --> 00:07:35,750 Et puis, si nous faisons un peu de maths, nous en déduisons que c'est d. 206 00:07:35,750 --> 00:07:38,650 Huit est assez facile, parce que nous en avoir un à la place de huit. 207 00:07:38,650 --> 00:07:40,620 Et puis, nous avons un couple plus f f de. 208 00:07:40,620 --> 00:07:44,669 >> Donc, ce que les humains ont tendance à faire par convention quand ils utilisent hexadécimal est qu'ils viennent 209 00:07:44,669 --> 00:07:47,710 écrire ce un peu plus succinctement, se débarrasser de la plupart de l'espace blanc. 210 00:07:47,710 --> 00:07:50,890 Et juste pour être super clair lecteurs que ce n'est hexadécimal, 211 00:07:50,890 --> 00:07:54,670 simple convention entre l'homme est que vous écrivez zéro 212 00:07:54,670 --> 00:07:58,000 x, qui n'a pas d'autre sens d'un identifiant visuel de, 213 00:07:58,000 --> 00:07:59,590 voici un nombre hexadécimal. 214 00:07:59,590 --> 00:08:04,210 >> Et puis, vous mettez les deux chiffres, f f dans ce cas, d un, alors f f. 215 00:08:04,210 --> 00:08:06,700 Donc, longue histoire courte, hexadécimal tend juste 216 00:08:06,700 --> 00:08:11,990 pour être utile, car chacune de ses chiffres, de zéro à f, parfaitement lignes 217 00:08:11,990 --> 00:08:13,880 avec un motif de quatre bits. 218 00:08:13,880 --> 00:08:18,080 >> Donc, si vous avez deux chiffres hexadécimaux, zéro à F, encore et encore, 219 00:08:18,080 --> 00:08:20,256 qui vous donne parfaitement ou huit bits d'un octet. 220 00:08:20,256 --> 00:08:22,380 Voilà pourquoi il a tendance à classiquement être utile. 221 00:08:22,380 --> 00:08:24,990 Il n'y a pas intellectuelle contenu vraiment au-delà, 222 00:08:24,990 --> 00:08:27,010 autre que son utilité réelle. 223 00:08:27,010 --> 00:08:29,310 >> Maintenant JPEG ne sont pas la seule formats de fichier pour les graphiques. 224 00:08:29,310 --> 00:08:33,230 Vous vous rappelez peut qu'il existe fichiers de ce genre dans le monde, 225 00:08:33,230 --> 00:08:34,830 au moins de quelques années en arrière. 226 00:08:34,830 --> 00:08:37,580 >> Il s'agissait donc d' installé dans Windows XP 227 00:08:37,580 --> 00:08:39,960 sur des millions de PC dans le monde entier. 228 00:08:39,960 --> 00:08:43,000 Et ce fut un fichier bitmap, BMP. 229 00:08:43,000 --> 00:08:47,690 Et un fichier bitmap, comme vous le verrez à côté semaine, signifie simplement un motif de points, 230 00:08:47,690 --> 00:08:51,710 pixels comme on les appelle, une carte sur les bits, vraiment. 231 00:08:51,710 --> 00:08:55,160 >> Donc ce qui est intéressant, cependant, sur ce format de fichier, BMP, est 232 00:08:55,160 --> 00:08:58,590 que sous le capot, il a plus que seulement trois octets 233 00:08:58,590 --> 00:09:01,020 qui composent son en-tête, de sorte de parler, les premières bouchées. 234 00:09:01,020 --> 00:09:03,330 Il semble en fait un peu compliqué à première vue. 235 00:09:03,330 --> 00:09:04,704 Et vous verrez ce dans l'ensemble de P. 236 00:09:04,704 --> 00:09:06,810 Et obtenir quelque chose particulier de cette entreprise 237 00:09:06,810 --> 00:09:10,720 n'est pas si important, que le simple fait que, au début de chaque bitmap 238 00:09:10,720 --> 00:09:13,823 fichier, un format graphique, il ya tout un tas de chiffres. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Maintenant Microsoft, l' auteur de ce format, 241 00:09:16,720 --> 00:09:18,820 ont tendance à appeler les Choses à ne pas ints et chars 242 00:09:18,820 --> 00:09:22,259 et flotteurs mais les mots et d des mots et des longs et des octets. 243 00:09:22,259 --> 00:09:23,800 Donc, ils ne sont que des types de données différents. 244 00:09:23,800 --> 00:09:25,170 Ils sont des noms différents pour la même chose. 245 00:09:25,170 --> 00:09:26,740 Mais vous verrez que dans P Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Mais ce n'est que de dire que si un humain double-clique sur un fichier quelconque BMP sur son 247 00:09:31,450 --> 00:09:35,015 ou son disque dur, et une fenêtre s'ouvre jusqu'à lui que l'image montrant, 248 00:09:35,015 --> 00:09:38,500 ce qui s'est passé parce que l'exploitation Système probablement remarqué non seulement 249 00:09:38,500 --> 00:09:41,460 l'extension de fichier BMP dans le nom du fichier, 250 00:09:41,460 --> 00:09:45,010 mais aussi le fait que il ya un certain convention pour le modèle de bits 251 00:09:45,010 --> 00:09:47,490 au début de ce fichier bitmap. 252 00:09:47,490 --> 00:09:50,270 >> Mais concentrons-nous maintenant sur un tel fichier complexe, 253 00:09:50,270 --> 00:09:52,120 mais plutôt sur quelque chose comme ça. 254 00:09:52,120 --> 00:09:55,190 Suppose ici dans GEdit, je avoir juste les débuts 255 00:09:55,190 --> 00:09:57,070 d'un programme qui est assez simple. 256 00:09:57,070 --> 00:09:58,860 J'ai quelques inclut en haut. 257 00:09:58,860 --> 00:10:02,120 "Structs.h" #include Maintenant j'ai mais Je reviendrai dans un instant. 258 00:10:02,120 --> 00:10:03,974 Mais ce qui est utile pour l'instant. 259 00:10:03,974 --> 00:10:05,890 Il s'agit donc d'un programme qui va mettre en œuvre 260 00:10:05,890 --> 00:10:07,335 comme la base de données de l'état civil. 261 00:10:07,335 --> 00:10:09,710 Ainsi, une base de données des étudiants, et chaque élève dans le monde 262 00:10:09,710 --> 00:10:13,190 a un nom et une maison et probablement certains autres choses, mais nous allons garder les choses simples. 263 00:10:13,190 --> 00:10:15,140 Chaque élève a un nom et une maison. 264 00:10:15,140 --> 00:10:17,700 >> Donc, si je voulais écrire une programme dont le but dans la vie 265 00:10:17,700 --> 00:10:19,860 vient d'une itération d' zéro sur un maximum de trois, 266 00:10:19,860 --> 00:10:22,070 s'il ya trois étudiants à l'Université Harvard. 267 00:10:22,070 --> 00:10:25,350 Et je veux juste, en utilisant GetString, le nom et le domicile de chaque élève, 268 00:10:25,350 --> 00:10:26,600 et puis il suffit de les imprimer sur. 269 00:10:26,600 --> 00:10:28,630 >> C'est un peu comme la Semaine Un: Semaine Deux choses maintenant, 270 00:10:28,630 --> 00:10:30,810 où je veux juste un pour boucle ou quelque chose comme ça. 271 00:10:30,810 --> 00:10:34,500 Et je tiens à appeler GetString un peu fois, puis imprimer f à quelques reprises. 272 00:10:34,500 --> 00:10:37,340 Alors, comment pourrais-je faire cela, cependant, quand à la fois un nom et une maison 273 00:10:37,340 --> 00:10:39,070 sont impliqués pour chaque élève? 274 00:10:39,070 --> 00:10:42,830 >> Donc, mon premier instinct pourrait être de faire quelque chose comme ça. 275 00:10:42,830 --> 00:10:49,620 Je pourrais d'abord dire, eh bien, donnez-moi, dire, un tableau de chaînes de tous les noms. 276 00:10:49,620 --> 00:10:51,530 Et je ne veux pas un hardcode trois ici. 277 00:10:51,530 --> 00:10:53,064 Que dois-je veux y mettre? 278 00:10:53,064 --> 00:10:55,730 Ainsi, les étudiants, parce que c'est juste une constante déclarée au sommet, 279 00:10:55,730 --> 00:10:57,860 juste pour que je n'ai pas à coder en dur trois en plusieurs endroits. 280 00:10:57,860 --> 00:11:00,859 De cette façon, je peux changer un seul endroit, et elle affecte un changement partout. 281 00:11:00,859 --> 00:11:04,470 Et puis, je pourrais faire chaîne abrite ÉTUDIANTS. 282 00:11:04,470 --> 00:11:10,250 >> Et maintenant, je pourrais faire quelque chose comme for (int i = 0; i <ÉTUDIANTS; i ++. 283 00:11:10,250 --> 00:11:14,390 Donc je tape vite, mais c'est probablement syntaxe familière maintenant. 284 00:11:14,390 --> 00:11:17,030 >> Et maintenant, ce n'était plus récente. 285 00:11:17,030 --> 00:11:22,890 Si je veux mettre dans le i-ème nom de l'étudiant, je pense que je fais ça. 286 00:11:22,890 --> 00:11:26,480 Et puis, pas les noms mais les maisons encadrent i. 287 00:11:26,480 --> 00:11:29,930 Je le fais, GetString, et laissez- moi de revenir et corriger cette ligne. 288 00:11:29,930 --> 00:11:30,430 D'accord? 289 00:11:30,430 --> 00:11:31,200 Pas d'accord? 290 00:11:31,200 --> 00:11:32,366 Ce n'est pas très convivial. 291 00:11:32,366 --> 00:11:33,890 Je n'ai pas dit à l'utilisateur ce qu'il faut faire. 292 00:11:33,890 --> 00:11:36,520 >> Mais maintenant, si j'ai aussi voulu plus tard, nous allons 293 00:11:36,520 --> 00:11:40,060 par exemple, imprimer ces choses out-- si TODO plus tard. 294 00:11:40,060 --> 00:11:42,330 Je vais faire plus avec this-- ce est sans contredit l' 295 00:11:42,330 --> 00:11:45,970 une mise en œuvre correcte de obtenir des noms et des maisons, trois 296 00:11:45,970 --> 00:11:48,870 de leur total de chacun, à partir d'un utilisateur. 297 00:11:48,870 --> 00:11:51,280 >> Mais ce n'est pas une très bonne conception, non? 298 00:11:51,280 --> 00:11:55,220 Que faire si un élève n'a pas seulement un nom et une maison, mais aussi un numéro d'identification, 299 00:11:55,220 --> 00:11:57,770 et un numéro de téléphone, et une adresse e-mail, 300 00:11:57,770 --> 00:12:00,280 et peut-être une page d'accueil, et peut-être une poignée Twitter, 301 00:12:00,280 --> 00:12:03,730 et un nombre quelconque d'autres détails associé à un étudiant ou une personne, 302 00:12:03,730 --> 00:12:04,610 plus généralement. 303 00:12:04,610 --> 00:12:07,720 Comment pourrions-nous commencer à ajouter fonctionnalité de ce programme? 304 00:12:07,720 --> 00:12:14,080 >> Eh bien, je me sens comme la façon la plus simple pourrait être faire quelque chose comme, disons, 305 00:12:14,080 --> 00:12:16,490 int étudiants en EDI. 306 00:12:16,490 --> 00:12:18,380 Je peux donc mettre tous leurs papiers d'identité à l'intérieur. 307 00:12:18,380 --> 00:12:22,240 Et puis, quelque chose comme les numéros de téléphone, 308 00:12:22,240 --> 00:12:24,400 Je ne suis pas sûr de savoir comment représenter que pour l'instant. 309 00:12:24,400 --> 00:12:30,280 Donc, nous allons aller de l'avant et juste appel ce gazouille étudiants, ce qui 310 00:12:30,280 --> 00:12:33,550 est un peu étrange, mais-- et un tas plusieurs champs. 311 00:12:33,550 --> 00:12:36,360 >> J'ai commencé à efficacement copier et coller ici. 312 00:12:36,360 --> 00:12:39,416 Et cela va se développer assez lourd assez rapidement, non? 313 00:12:39,416 --> 00:12:42,290 Ce ne serait pas bien s'il y avait dans le monde d'une structure de données connu 314 00:12:42,290 --> 00:12:45,600 pas comme un int ou une chaîne, mais quelque chose niveau plus élevé, une abstraction, si 315 00:12:45,600 --> 00:12:47,570 de parler, connu en tant qu'étudiant? 316 00:12:47,570 --> 00:12:50,220 C n'est pas venu avec haut- fonctionnalité pour les étudiants, 317 00:12:50,220 --> 00:12:52,260 mais si je voulais lui donner telle? 318 00:12:52,260 --> 00:12:55,640 >> Eh bien, il s'avère, je vais ouvrir un fichier appelé structs.h ici, 319 00:12:55,640 --> 00:12:57,090 et vous pouvez faire exactement cela. 320 00:12:57,090 --> 00:12:58,290 Et nous allons commencer à le faire maintenant. 321 00:12:58,290 --> 00:13:01,490 Et sous le capot de P Set Trois, vous avez déjà fait cela maintenant. 322 00:13:01,490 --> 00:13:05,920 Il n'y a pas une telle chose comme un g rect ou g un ovale dans le langage de programmation C. 323 00:13:05,920 --> 00:13:10,570 >> Gens de Stanford en œuvre les types de données à l'aide de cette approche ici, 324 00:13:10,570 --> 00:13:13,900 déclarant leur propre nouvelles données types en utilisant un nouveau mot-clé 325 00:13:13,900 --> 00:13:16,744 et une autre appelée struct un appelé typedef. 326 00:13:16,744 --> 00:13:19,660 Et en effet, même si la syntaxe est un peu différent de trucs 327 00:13:19,660 --> 00:13:23,550 nous avons vu auparavant, dans principe, c'est super simple. 328 00:13:23,550 --> 00:13:25,297 >> Cela signifie simplement «définir un type." 329 00:13:25,297 --> 00:13:27,255 Cela va être un la structure, et une structure 330 00:13:27,255 --> 00:13:29,400 c'est comme un conteneur pour de multiples choses. 331 00:13:29,400 --> 00:13:31,780 Et cette structure va d'avoir une chaîne appelée nom, 332 00:13:31,780 --> 00:13:33,210 et une chaîne appelée maison. 333 00:13:33,210 --> 00:13:37,520 Et disons, simplement pour des raisons pratiques, toute cette élève de structure de données. 334 00:13:37,520 --> 00:13:40,320 >> Donc, au moment où vous arrivez à le point-virgule, vous avez maintenant 335 00:13:40,320 --> 00:13:43,280 créé vos propres données type appelé étudiant 336 00:13:43,280 --> 00:13:46,420 qui se tient maintenant aux côtés int, et le flotteur, et char, et la chaîne, 337 00:13:46,420 --> 00:13:50,270 et g rect, et g ovale, et un certain nombre d'autres choses que les gens ont inventé. 338 00:13:50,270 --> 00:13:53,340 >> Donc, ce qui est utile à ce sujet c'est maintenant que si je reviens 339 00:13:53,340 --> 00:13:57,430 struct 0 et terminer cette mise en œuvre, que j'ai écrit 340 00:13:57,430 --> 00:14:02,080 à l'avance ici, vous remarquerez que tous les du désordre inévitable que 341 00:14:02,080 --> 00:14:05,490 était sur le point de commencer à se produire comme je l'ai ajouté les numéros de téléphone et gazouille et tous 342 00:14:05,490 --> 00:14:07,370 ces autres choses à la définition d'un étudiant, 343 00:14:07,370 --> 00:14:11,810 maintenant il est succinctement enveloppé comme tout un réseau d'étudiants. 344 00:14:11,810 --> 00:14:15,500 >> Et chacun de ces étudiants maintenant a plusieurs choses à l'intérieur de celui-ci. 345 00:14:15,500 --> 00:14:16,930 Alors que tout laisse une question. 346 00:14:16,930 --> 00:14:19,700 Comment obtenez-vous au nom, et la maison, et l'ID, 347 00:14:19,700 --> 00:14:21,640 et tout ce qui est l'intérieur de l'étudiant? 348 00:14:21,640 --> 00:14:22,930 Super simple, aussi. 349 00:14:22,930 --> 00:14:25,730 Nouvelle syntaxe, mais une idée simple. 350 00:14:25,730 --> 00:14:29,239 >> Vous indice simplement dans le tableau, comme nous l'avons fait la semaine dernière et ce. 351 00:14:29,239 --> 00:14:31,030 Et ce qui est clairement le nouveau morceau de syntaxe? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Just., Qui signifie «aller à l'intérieur du structure et faire le champ appelé 354 00:14:35,880 --> 00:14:39,030 nom, obtenir le champ appelé maison, obtenir le champ appelé étudiant. " 355 00:14:39,030 --> 00:14:41,940 >> Donc, en P Set Trois, si vous êtes travaille encore, 356 00:14:41,940 --> 00:14:44,020 et la plupart des gens encore sont, réaliser que vous 357 00:14:44,020 --> 00:14:46,130 commencer à utiliser des choses comme g rectangles et ovales g 358 00:14:46,130 --> 00:14:50,201 et d'autres choses qui ne semblent pas provenir de la semaine zéro, un, ou deux, 359 00:14:50,201 --> 00:14:52,950 se rendent compte que c'est parce que Stanford déclaré certains nouveaux types de données. 360 00:14:52,950 --> 00:14:56,160 >> Et en effet, c'est exactement ce que nous allons faire, ainsi, dans P Set Quatre, quand 361 00:14:56,160 --> 00:14:59,880 nous commençons à traiter avec les choses comme des images, bitmaps, et plus encore. 362 00:14:59,880 --> 00:15:02,882 Donc, c'est juste un teaser et une modèle mental de ce qui est à venir. 363 00:15:02,882 --> 00:15:04,590 Maintenant, je tergiverse un peu ce matin. 364 00:15:04,590 --> 00:15:09,560 J'étais un peu curieux de voir ce le fond d'écran Microsoft fait 365 00:15:09,560 --> 00:15:10,310 ressemble aujourd'hui. 366 00:15:10,310 --> 00:15:15,200 Et il se trouve quelqu'un en 2006 effectivement allé à presque exactement 367 00:15:15,200 --> 00:15:19,210 au même endroit à photographier, en réalité, ce qui ressemble à ce que ces jours-ci. 368 00:15:19,210 --> 00:15:21,380 Le champ est maintenant un peu envahi. 369 00:15:21,380 --> 00:15:24,850 >> Ainsi parle maintenant d'images, nous allons ramener Daven ici 370 00:15:24,850 --> 00:15:26,890 sur l'écran et Nicolas, et vous rappeler 371 00:15:26,890 --> 00:15:30,540 que si vous souhaitez vous joindre à nous pour le déjeuner ce vendredi, à la tête de notre URL habituelle 372 00:15:30,540 --> 00:15:31,440 Ici. 373 00:15:31,440 --> 00:15:33,530 >> Alors, où en sommes-nous faire abandonner le lundi? 374 00:15:33,530 --> 00:15:35,140 Nous avons introduit ce problème, non? 375 00:15:35,140 --> 00:15:37,610 C'est apparemment une bonne la mise en œuvre de swap, 376 00:15:37,610 --> 00:15:40,460 lequel vous prendre deux ints, un appelé, un appelé b, 377 00:15:40,460 --> 00:15:44,130 échanger entre eux, tout comme Laura a fait ici sur scène avec le lait et l'eau, 378 00:15:44,130 --> 00:15:46,820 en utilisant un temporaire variable ou une tasse vide, 379 00:15:46,820 --> 00:15:50,540 afin que nous puissions mettre b dans un et un en b sans faire un tas de choses. 380 00:15:50,540 --> 00:15:51,560 Nous avons utilisé une variable. 381 00:15:51,560 --> 00:15:52,870 C'est ce qu'on appelle température. 382 00:15:52,870 --> 00:15:55,520 >> Mais ce qui était fondamental problème avec ce code le lundi? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Quel était le problème ici? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Ouais. 387 00:16:00,605 --> 00:16:01,970 >> PUBLIC: Il prend plus de place. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: prend plus l'espace, parce que je suis en utilisant une variable, 389 00:16:04,719 --> 00:16:05,400 et c'est OK. 390 00:16:05,400 --> 00:16:07,300 C'est vrai, mais je suis va dire que c'est OK. 391 00:16:07,300 --> 00:16:10,030 C'est seulement 32 bits dans le grand schéma des choses, donc pas une grosse affaire. 392 00:16:10,030 --> 00:16:10,655 D'autres pensées? 393 00:16:10,655 --> 00:16:12,572 PUBLIC: Il permute seulement les variables localement. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Exactement. 395 00:16:13,571 --> 00:16:15,090 Il ne permute les variables localement. 396 00:16:15,090 --> 00:16:18,173 Parce que chaque fois que vous appelez un function-- quand j'ai eu les plateaux de Annenberg 397 00:16:18,173 --> 00:16:19,840 la dernière fois, vous avez principal sur le fond. 398 00:16:19,840 --> 00:16:23,560 Dès que vous appelez une fonction appelée swap, swap de n'obtient pas x et y, 399 00:16:23,560 --> 00:16:24,400 les valeurs d'origine. 400 00:16:24,400 --> 00:16:26,392 Qu'est-ce que échange get, avons-nous prétendons? 401 00:16:26,392 --> 00:16:27,100 PUBLIC: Exemplaires. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Donc copies. 403 00:16:28,090 --> 00:16:31,120 Donc, il obtient un et deux, si vous rappeler l'exemple de la dernière fois, 404 00:16:31,120 --> 00:16:34,730 mais une copie d'un et deux qui est échangé avec succès. 405 00:16:34,730 --> 00:16:38,550 Mais, malheureusement, à la fin, ces valeurs sont toujours les mêmes. 406 00:16:38,550 --> 00:16:41,880 Ainsi, nous pouvons voir cela à notre nouvel ami, j'espère que GDB, 407 00:16:41,880 --> 00:16:45,180 que vous ou les fonds fiduciaires et de Ca avez été en vous guidant vers la suivante. 408 00:16:45,180 --> 00:16:51,210 >> Donc, pas de rappel de swap regarde like-- de laisser ouvrir this-- ressemble à ceci. 409 00:16:51,210 --> 00:16:54,160 Nous avons initialisé x pour un, y à deux. 410 00:16:54,160 --> 00:16:55,620 Il y avait un tas de f impression de. 411 00:16:55,620 --> 00:16:58,080 Mais alors, la touche d'appel ici était d'échanger, ce qui 412 00:16:58,080 --> 00:17:00,260 est exactement le code que nous juste vu il ya un moment. 413 00:17:00,260 --> 00:17:03,180 Lequel est le bon à première coup d'oeil, mais fonctionnellement, 414 00:17:03,180 --> 00:17:06,800 ce programme ne fonctionne pas, parce que ne pas intervertir x et y de façon permanente. 415 00:17:06,800 --> 00:17:10,190 >> Voyons donc cela, une ambiance chaleureuse rapide ici avec GDB, un ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Un tas d'informations écrasante que Je vais me débarrasser de contrôle avec L pour l'instant. 418 00:17:15,200 --> 00:17:17,516 Et maintenant, je vais aller de l'avant et l'exécuter. 419 00:17:17,516 --> 00:17:19,349 Et malheureusement, que était pas très utile. 420 00:17:19,349 --> 00:17:22,355 Il a dirigé le programme à l'intérieur de cette programme appelé GDB, un débogueur, 421 00:17:22,355 --> 00:17:23,730 mais il ne m'a pas laissé fouiller. 422 00:17:23,730 --> 00:17:26,229 >> Alors, comment puis-je fait une pause exécution à l'intérieur de ce programme? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Alors briser. 425 00:17:28,329 --> 00:17:32,340 Et je ne pouvais briser sur tout nombre, un, 10, 15 ligne. 426 00:17:32,340 --> 00:17:35,530 Mais je peux aussi casser symboliquement en disant bris. 427 00:17:35,530 --> 00:17:38,980 Et cela va définir un saut moment-là, apparemment à la ligne 16 dans le principal. 428 00:17:38,980 --> 00:17:40,050 Et où est la ligne 16? 429 00:17:40,050 --> 00:17:42,960 Montons au code et aller jusqu'à NOSWAP. 430 00:17:42,960 --> 00:17:46,930 Et en effet, la ligne 16 est la tout premier dans le programme. 431 00:17:46,930 --> 00:17:52,130 >> Alors maintenant, si je vais de l'avant et le type exécuter ce temps, Entrez, il s'arrêta. 432 00:17:52,130 --> 00:17:53,080 Donc, nous allons fouiller. 433 00:17:53,080 --> 00:17:55,716 Imprimer x-- pourquoi x zéro? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Et ignorer le signe du dollar. 436 00:17:57,830 --> 00:17:59,725 C'est juste pour amateur l'utilisation du programme. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Pourquoi est-x zéro en ce moment? 439 00:18:03,140 --> 00:18:03,640 Ouais. 440 00:18:03,640 --> 00:18:07,061 >> PUBLIC: Il s'arrêta juste avant ligne 16, pas vraiment sur la ligne 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Exactement. 442 00:18:08,060 --> 00:18:11,630 GDB, par défaut, a suspendu exécution juste avant la ligne 16. 443 00:18:11,630 --> 00:18:14,820 Donc, il n'a pas exécuté, qui signifie x est d'une certaine valeur inconnue. 444 00:18:14,820 --> 00:18:17,150 Et nous avons eu de la chance que c'est quelque chose de propre comme zéro. 445 00:18:17,150 --> 00:18:20,310 Alors maintenant, si je tape suivante, maintenant il a exécuté 16. 446 00:18:20,310 --> 00:18:22,000 Il m'attend à exécuter 17. 447 00:18:22,000 --> 00:18:23,400 Permettez-moi d'aller de l'avant et print x. 448 00:18:23,400 --> 00:18:24,094 C'est l'un. 449 00:18:24,094 --> 00:18:25,260 Permettez-moi d'aller de l'avant et print y. 450 00:18:25,260 --> 00:18:26,176 Que dois-je voir maintenant? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBLIC: [inaudible] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: Un peu plus fort. 454 00:18:29,165 --> 00:18:30,040 >> PUBLIC: [inaudible] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: Pas tout à fait un consensus. 457 00:18:32,120 --> 00:18:34,760 Alors oui, nous voyons une certaine valeur d'ordures. 458 00:18:34,760 --> 00:18:37,862 Or, il y est 134514064. 459 00:18:37,862 --> 00:18:39,320 Eh bien, c'est juste une valeur d'ordures. 460 00:18:39,320 --> 00:18:41,350 Mon programme utilise la mémoire vive à des fins différentes. 461 00:18:41,350 --> 00:18:42,350 Il ya d'autres fonctions. 462 00:18:42,350 --> 00:18:44,040 D'autres personnes ont écrit à l'intérieur de mon ordinateur. 463 00:18:44,040 --> 00:18:46,789 Donc, ces bits sont utilisés pour d'autres valeurs, et ce que je vois 464 00:18:46,789 --> 00:18:49,470 est les restes de certains utilisation antérieure de cette mémoire. 465 00:18:49,470 --> 00:18:53,350 >> Donc, pas grand-chose, parce que dès que je tape suivante, puis imprimer y, 466 00:18:53,350 --> 00:18:55,640 il est initialisé à la valeur que je veux. 467 00:18:55,640 --> 00:18:57,400 Alors maintenant, allons-y un peu plus vite. 468 00:18:57,400 --> 00:18:58,540 N pour une livraison. 469 00:18:58,540 --> 00:18:59,570 Faisons-le à nouveau. 470 00:18:59,570 --> 00:19:00,530 Faisons-le à nouveau. 471 00:19:00,530 --> 00:19:02,404 Mais je ne veux pas frapper ici, parce que si je 472 00:19:02,404 --> 00:19:05,110 vous voulez voir ce qui se passe à l'intérieur de swap, ce qui est la commande? 473 00:19:05,110 --> 00:19:05,520 >> PUBLIC: étapes. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: étapes. 475 00:19:06,436 --> 00:19:09,800 Donc cela me étapes dans un fonction, plutôt que sur elle. 476 00:19:09,800 --> 00:19:12,270 Et maintenant, c'est un peu cryptique honnêtement, mais ce n'est que 477 00:19:12,270 --> 00:19:14,581 me disant que je suis dans la ligne 33 maintenant. 478 00:19:14,581 --> 00:19:15,580 Et nous allons le faire à nouveau. 479 00:19:15,580 --> 00:19:16,080 Imprimer température. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 valeur des ordures, négatif cette fois, mais c'est juste encore une valeur d'ordures. 482 00:19:20,170 --> 00:19:22,810 Alors, faisons prochain, impression température. 483 00:19:22,810 --> 00:19:27,130 Il est initialisée à 1, ce qui était la valeur de x, alias un. 484 00:19:27,130 --> 00:19:29,110 >> Maintenant, où sont nos A et X en venir? 485 00:19:29,110 --> 00:19:32,510 Eh bien, remarquons en principal, nous appelé ces valeurs x et y. 486 00:19:32,510 --> 00:19:34,740 Nous avons ensuite passé les d'échanger de la façon suivante. 487 00:19:34,740 --> 00:19:37,010 X est venu en premier, y virgule. 488 00:19:37,010 --> 00:19:40,020 Et puis, échange pourrait les appeler x et y. 489 00:19:40,020 --> 00:19:42,630 Mais pour plus de clarté, c'est les appelant a et b. 490 00:19:42,630 --> 00:19:45,970 Mais a et b vont maintenant être copies de x et y, respectivement. 491 00:19:45,970 --> 00:19:50,660 >> Donc, si je reviens à GDB, la température est maintenant un an et est aujourd'hui l'un. 492 00:19:50,660 --> 00:19:56,130 Mais si je le fais à côté et maintenant faire imprimer un, une a déjà été déplacé sur. 493 00:19:56,130 --> 00:20:00,030 Le lait a été répandu dans l'ancien le verre de jus d'orange, ou vice versa. 494 00:20:00,030 --> 00:20:04,750 >> Et si je fais prochaine fois, et maintenant si j'imprime comme un test de cohérence, 495 00:20:04,750 --> 00:20:07,687 un est encore deux, mais b est aujourd'hui l'un. 496 00:20:07,687 --> 00:20:08,770 Franchement, il est toujours là. 497 00:20:08,770 --> 00:20:10,670 Je n'aime pas ce temp est. 498 00:20:10,670 --> 00:20:16,850 Mais dès que je tape maintenant, disons, continue à revenir en arrière, maintenant je suis à la fin 499 00:20:16,850 --> 00:20:17,480 le programme. 500 00:20:17,480 --> 00:20:20,730 Et malheureusement, x est encore un et y est toujours deux. 501 00:20:20,730 --> 00:20:22,272 >> Alors quelle est l'utilité de GDB il? 502 00:20:22,272 --> 00:20:23,980 Il n'a pas aidé moi de résoudre le problème en soi, 503 00:20:23,980 --> 00:20:26,265 mais il me espérons aider comprendre en réalisant 504 00:20:26,265 --> 00:20:30,000 que oui, ma logique est bonne, mais mon code n'est pas d'avoir en fin de compte 505 00:20:30,000 --> 00:20:31,450 un effet permanent. 506 00:20:31,450 --> 00:20:34,570 Donc, c'est un problème que nous sommes va résoudre maintenant, aujourd'hui. 507 00:20:34,570 --> 00:20:37,870 >> Mais nous allons y arriver par le biais de cette. 508 00:20:37,870 --> 00:20:39,230 String est un mensonge. 509 00:20:39,230 --> 00:20:41,860 C'est, aussi, pas un type de données qui existe en C. Il est 510 00:20:41,860 --> 00:20:44,750 été un synonyme pour certains temps pour autre chose, 511 00:20:44,750 --> 00:20:47,300 et nous pouvons révéler que comme suit. 512 00:20:47,300 --> 00:20:53,282 >> Permettez-moi aller de l'avant et d'ouvrir un programme appelé comparer-0. 513 00:20:53,282 --> 00:20:56,240 Et plutôt que de taper celui-ci dehors, nous allons commencer à marcher à travers le code 514 00:20:56,240 --> 00:20:58,040 J'ai déjà écrit, mais c'est seulement quelques lignes. 515 00:20:58,040 --> 00:20:59,570 Donc, ce n'est comparer-0. 516 00:20:59,570 --> 00:21:02,380 Et la première chose que je fais est d'obtenir une ligne de texte. 517 00:21:02,380 --> 00:21:05,610 >> Mais remarque que je suis faire pour la première fois. 518 00:21:05,610 --> 00:21:07,910 Ce qui est différent clairement sur la ligne 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 En fait, attendez une minute. 521 00:21:11,402 --> 00:21:12,110 Cette copie est deux. 522 00:21:12,110 --> 00:21:13,568 Ce n'est même pas le bon programme. 523 00:21:13,568 --> 00:21:14,780 Très bien, alerte spoiler. 524 00:21:14,780 --> 00:21:16,890 Très bien, alors cela ne tienne. 525 00:21:16,890 --> 00:21:18,520 C'est la réponse à la question d'un avenir. 526 00:21:18,520 --> 00:21:21,450 >> Voici comparer-0, et je suis sur le point d'obtenir une ligne de texte. 527 00:21:21,450 --> 00:21:22,435 Programme de beaucoup plus simple. 528 00:21:22,435 --> 00:21:23,560 Donc, c'est simple. 529 00:21:23,560 --> 00:21:28,070 C'est comme première semaine, la deuxième semaine des trucs en ce moment. = GetString de chaîne. 530 00:21:28,070 --> 00:21:29,700 Maintenant, je le répète ici. 531 00:21:29,700 --> 00:21:31,830 chaîne t = GetString. 532 00:21:31,830 --> 00:21:35,300 Et puis, la dernière chose dans ce programme, comme son nom l'indique, 533 00:21:35,300 --> 00:21:37,090 c'est que je vais essayer de les comparer. 534 00:21:37,090 --> 00:21:40,709 >> Donc, si s, la première chaîne, égaux = t, alors je suis 535 00:21:40,709 --> 00:21:42,250 allez dire que vous tapez la même chose. 536 00:21:42,250 --> 00:21:44,291 Sinon, je vais dire vous tapez des choses différentes. 537 00:21:44,291 --> 00:21:45,880 Donc, nous allons compiler et exécuter ce programme. 538 00:21:45,880 --> 00:21:48,481 Donc, assurez comparer zéro. 539 00:21:48,481 --> 00:21:48,980 On dirait bien. 540 00:21:48,980 --> 00:21:50,490 Aucune erreur de compilation. 541 00:21:50,490 --> 00:21:52,386 >> Permettez-moi maintenant aller de l'avant et tapez ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Permettez-moi d'aller de l'avant et de dire quelque chose : Daven et quelque chose: Rob. 544 00:21:59,220 --> 00:22:00,450 Et je tape des choses différentes. 545 00:22:00,450 --> 00:22:01,250 Jusqu'ici, tout va bien. 546 00:22:01,250 --> 00:22:02,680 Programme semble être correct. 547 00:22:02,680 --> 00:22:03,880 >> Mais on devrait courir à nouveau. 548 00:22:03,880 --> 00:22:05,800 Dire quelque chose: Gabe. 549 00:22:05,800 --> 00:22:07,140 Dire quelque chose: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Bien. 552 00:22:09,020 --> 00:22:10,851 Peut-être que j'ai frappé la barre d'espace ou quelque chose de funky. 553 00:22:10,851 --> 00:22:11,600 Faisons-le à nouveau. 554 00:22:11,600 --> 00:22:13,020 Donc 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 Différentes choses. 559 00:22:17,330 --> 00:22:19,430 Donc ce qui se passe? 560 00:22:19,430 --> 00:22:23,200 >> Nous avons donc ces deux lignes de code, GetString appelé deux fois. 561 00:22:23,200 --> 00:22:25,760 Et puis, je suis tout simplement essayer de comparer s et t. 562 00:22:25,760 --> 00:22:28,370 Mais ce qui se passe alors? 563 00:22:28,370 --> 00:22:31,180 Eh bien, sur mon écriture à boucher cet exemple un peu. 564 00:22:31,180 --> 00:22:34,630 Et nous allons jeter effectivement cette place ici, aussi. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Donc, nous avons une ligne comme = GetString de chaîne. 567 00:22:45,712 --> 00:22:48,295 Donc, c'est tout simplement la première ligne intéressante de ce programme. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Mais ce que tout ce temps a été passe sous le capot? 570 00:22:52,974 --> 00:22:55,890 Eh bien, sur le côté gauche est une chaîne, qui est un type de variable, 571 00:22:55,890 --> 00:22:56,785 et on appelle ça de l'art. 572 00:22:56,785 --> 00:23:00,019 Donc, je sais que cela est d'utiliser la mémoire, ou RAM, dans mon ordinateur en quelque sorte. 573 00:23:00,019 --> 00:23:02,060 Donc, je vais abstraite dessiner que comme un carré. 574 00:23:02,060 --> 00:23:04,820 32 bits, il s'avère, mais plus à ce sujet dans l'avenir. 575 00:23:04,820 --> 00:23:06,410 Et puis, qu'est-ce qui se passe ici? 576 00:23:06,410 --> 00:23:08,700 >> Eh bien, de toute évidence GetString Obtient une chaîne de l'utilisateur. 577 00:23:08,700 --> 00:23:11,360 Et GetString a Zamyla ou Gabe ou Daven. 578 00:23:11,360 --> 00:23:14,640 Donc, nous allons choisir la première de ceux, qui était Daven. 579 00:23:14,640 --> 00:23:19,174 Donc, en réalité, ce qui a GetString moi dans ce premier cas était D-un-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Et puis, quoi d'autre l'a fait il me donne secrètement? 582 00:23:25,045 --> 00:23:25,920 PUBLIC: [inaudible] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Ouais, le caractère / 0 ou nulle. 584 00:23:28,720 --> 00:23:30,550 Alors il m'a effectivement donné une chaîne. 585 00:23:30,550 --> 00:23:34,550 Mais nous savons déjà de précédent semble que la chaîne est juste un tableau 586 00:23:34,550 --> 00:23:37,895 de caractères, et il est mis fin par ce caractère spécial de sentinelle, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Mais si cela est vrai et il s'agit d'un carré, 589 00:23:42,310 --> 00:23:44,160 il s'agit clairement d'un beaucoup plus grand rectangle. 590 00:23:44,160 --> 00:23:46,830 Et en effet, c'est, Je prétends, seuls 32 bits. 591 00:23:46,830 --> 00:23:49,500 Et ce n'est clairement plus de 32 bits, parce que cela est probablement 592 00:23:49,500 --> 00:23:51,583 huit plus huit plus huit plus huit plus huit, 593 00:23:51,583 --> 00:23:53,320 juste parce que d'octets en ASCII. 594 00:23:53,320 --> 00:23:57,030 Comment diable allons-nous tenir Daven dans cette petite boîte ici? 595 00:23:57,030 --> 00:23:59,880 >> Eh bien, ce qui est en train de faire GetString? 596 00:23:59,880 --> 00:24:03,680 Eh bien, cette grille représente ici la mémoire ou la mémoire vive de mon ordinateur. 597 00:24:03,680 --> 00:24:07,564 Donc, disons que si arbitrairement chacun d'entre eux représente un octet, 598 00:24:07,564 --> 00:24:09,730 alors nous pouvons penser de chaque octet comme ayant une adresse, 599 00:24:09,730 --> 00:24:13,830 comme 33 Oxford Street, ou 34 Oxford Street, ou 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Ainsi, tout comme les maisons ont des adresses et les bâtiments ont des adresses, 601 00:24:16,700 --> 00:24:19,810 donc faire octets individuels de mémoire ont des adresses ou des numéros 602 00:24:19,810 --> 00:24:21,042 que de les identifier de manière unique. 603 00:24:21,042 --> 00:24:22,000 Maintenant, c'est arbitraire. 604 00:24:22,000 --> 00:24:25,370 Mais pour faire simple, je vais utiliser hexadécimal juste par convention, 605 00:24:25,370 --> 00:24:28,200 mais la 0x signifie rien d'autre que «ce n'est hexadécimal." 606 00:24:28,200 --> 00:24:31,030 et je vais demander que le «D» se termine à un octet en mémoire. 607 00:24:31,030 --> 00:24:34,210 >> Je n'ai rien d'autre à faire dans mémoire, donc Daven a obtenu la première place 608 00:24:34,210 --> 00:24:35,509 à un octet. 609 00:24:35,509 --> 00:24:36,800 Ce, alors, va être 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Cela va 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Cela va être 0x4. 614 00:24:41,800 --> 00:24:43,025 Cela va 0x5. 615 00:24:43,025 --> 00:24:44,025 Cela va être 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Mais une fois que vous commencer à penser sur ce Doing l'ordinateur 618 00:24:48,290 --> 00:24:50,710 sous le capot, vous pouvez commencer à déduire 619 00:24:50,710 --> 00:24:54,960 comment vous, il ya quelques années, serait ont mis en œuvre C lui-même. 620 00:24:54,960 --> 00:24:58,360 Quel est GetString probablement returning-- car il 621 00:24:58,360 --> 00:25:00,946 sent comme il n'est pas Daven retour, en soi, 622 00:25:00,946 --> 00:25:03,320 parce qu'il a sûrement pas aller pour tenir dans ce petit box-- 623 00:25:03,320 --> 00:25:05,090 si ce n'est GetString probablement de retour? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBLIC: [inaudible] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: L'emplacement de Daven. 627 00:25:10,540 --> 00:25:12,770 Et il a été fait ce depuis la première semaine. 628 00:25:12,770 --> 00:25:16,150 Qu'est-ce GetString est vraiment retour n'est pas une chaîne, en soi. 629 00:25:16,150 --> 00:25:17,780 C'est l'un des petits mensonges blancs. 630 00:25:17,780 --> 00:25:22,520 Il est de retour l'adresse de l' chaîne dans la mémoire, l'adresse unique. 631 00:25:22,520 --> 00:25:24,820 Daven vit à 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Mais de façon plus succincte, Gavin vit au 0x1, adresse, numéro un. 633 00:25:29,310 --> 00:25:32,280 >> Alors, que se mettre dans cette petite boîte alors, pour être clair, 634 00:25:32,280 --> 00:25:35,930 est juste l'adresse de cette chaîne. 635 00:25:35,930 --> 00:25:38,110 Donc, tout ce temps, ce est en cours. 636 00:25:38,110 --> 00:25:41,650 Mais ce que cette allusion à maintenant, c'est que si tout s a 637 00:25:41,650 --> 00:25:44,710 est un nombre à l'intérieur de celui-ci, qui est de vous arrêter, le programmeur, 638 00:25:44,710 --> 00:25:47,970 un nombre quelconque de mise en n'importe quelle variable et de sauter 639 00:25:47,970 --> 00:25:49,080 à ce morceau de mémoire? 640 00:25:49,080 --> 00:25:51,320 Et en effet, nous verrons c'est une menace prochaine fois. 641 00:25:51,320 --> 00:25:53,500 >> Mais pour l'instant, cela se sent insuffisant. 642 00:25:53,500 --> 00:25:55,630 Si je dis, me chercher un chaîne, vous me donnez Daven. 643 00:25:55,630 --> 00:25:57,230 Mais vous n'avez pas vraiment me donnez pas Daven. 644 00:25:57,230 --> 00:25:59,310 Tout ce que vous me donnez est l'adresse de Daven. 645 00:25:59,310 --> 00:26:04,310 Comment puis-je savoir alors c'est sûr Daven où commence et ends-- 646 00:26:04,310 --> 00:26:07,140 l'histoire de l'obtention weird-- Daven où commence et se termine, 647 00:26:07,140 --> 00:26:10,435 et ensuite, la prochaine chaîne dans la mémoire commence? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Eh bien, si vous êtes remise moi le début de Daven, 650 00:26:13,620 --> 00:26:17,230 essentiellement, comment puis-je savoir où la fin de son nom? 651 00:26:17,230 --> 00:26:20,550 Ce caractère spécial null, qui est d'autant plus important maintenant 652 00:26:20,550 --> 00:26:23,040 si des chaînes en dessous de la capot sont simplement identifiés 653 00:26:23,040 --> 00:26:25,820 de façon unique par leur emplacement dans la mémoire. 654 00:26:25,820 --> 00:26:28,130 Donc, tout ce temps, c'est ce qui a été en cours. 655 00:26:28,130 --> 00:26:32,470 >> Ainsi, lorsque l'on regarde maintenant le code ici, expliquer 656 00:26:32,470 --> 00:26:35,790 si vous voulez le bogue dans la ligne 26. 657 00:26:35,790 --> 00:26:39,560 Pourquoi est-Zamyla et Zamyla différent? 658 00:26:39,560 --> 00:26:41,330 Pourquoi est-Gabe et Gabe différent? 659 00:26:41,330 --> 00:26:42,154 Oui, à l'arrière. 660 00:26:42,154 --> 00:26:43,390 >> PUBLIC: Ils ont des adresses différentes. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Tout simplement parce que ils ont des adresses différentes. 662 00:26:45,931 --> 00:26:48,820 Parce que quand vous appelez GetString encore une fois, que je vais le faire rapidement ici, 663 00:26:48,820 --> 00:26:52,870 si c'est la deuxième ligne, chaîne t, comme je l'ai fait dans ce programme, 664 00:26:52,870 --> 00:26:55,030 est égal à un autre appel à GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 La prochaine fois que j'appelle GetString, je vais 667 00:26:58,670 --> 00:27:00,190 pour obtenir un autre bloc de mémoire. 668 00:27:00,190 --> 00:27:02,220 >> GetString est autorisé de demander à l'exploitation 669 00:27:02,220 --> 00:27:03,800 système de mémoire de plus en plus. 670 00:27:03,800 --> 00:27:07,894 Il ne va pas réutiliser le même six octets à chaque fois unique. 671 00:27:07,894 --> 00:27:09,810 Il va y avoir une nouvelle bloc de mémoire, qui 672 00:27:09,810 --> 00:27:12,780 signifie t va se faire une autre valeur ici. 673 00:27:12,780 --> 00:27:15,380 >> Donc, quand je fais du égal = t, vous n'êtes pas la comparaison 674 00:27:15,380 --> 00:27:17,880 D contre cela et contre un ce et V contre cela. 675 00:27:17,880 --> 00:27:19,588 Vous comparez ce dans ce qui 676 00:27:19,588 --> 00:27:24,020 est franchement useless-- jolie useful-- est assez inutile, car qui en ont vraiment 677 00:27:24,020 --> 00:27:25,830 se soucie où les cordes sont dans la mémoire? 678 00:27:25,830 --> 00:27:26,850 >> Et en effet, nous n'avons pas. 679 00:27:26,850 --> 00:27:28,980 Et nous n'allons pas commencer particulièrement attentionné. 680 00:27:28,980 --> 00:27:34,180 Que dans la mesure que les bugs peuvent survenir et les menaces de sécurité peuvent survenir volonté 681 00:27:34,180 --> 00:27:36,100 nous commençons réellement à se soucier de cela. 682 00:27:36,100 --> 00:27:37,230 Donc, nous allons résoudre ce problème. 683 00:27:37,230 --> 00:27:39,650 Il s'avère que, vous le réparer superbe tout simplement. 684 00:27:39,650 --> 00:27:42,600 >> Et de laisser effectivement, avant que je révèlent que nouveau, ce qui serait 685 00:27:42,600 --> 00:27:47,170 vous si dans une classe CS50, et vous avez eu à mettre en œuvre 686 00:27:47,170 --> 00:27:48,600 une comparaison par rapport à deux chaînes. 687 00:27:48,600 --> 00:27:51,440 Vous avez clairement ne pouvez pas utiliser l égal = t. 688 00:27:51,440 --> 00:27:54,090 Mais tout logiquement, comment voulez-vous comparer cette chaîne 689 00:27:54,090 --> 00:27:56,370 contre cette chaîne en utilisant le code C? 690 00:27:56,370 --> 00:27:56,880 Ouais. 691 00:27:56,880 --> 00:27:58,780 >> PUBLIC: Il suffit de faire la pour la boucle [inaudible] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: Parfait. 694 00:28:01,670 --> 00:28:02,900 PUBLIC: [inaudible] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Ouais. 696 00:28:03,310 --> 00:28:05,390 Il suffit d'utiliser une boucle ou un while ou autre. 697 00:28:05,390 --> 00:28:08,710 Mais il suffit d'appliquer l'idée de base que si il s'agit d'un morceau de la mémoire ou un tableau 698 00:28:08,710 --> 00:28:11,590 et c'est, itérer sur les deux en même temps. 699 00:28:11,590 --> 00:28:12,960 Et il suffit de comparer les lettres. 700 00:28:12,960 --> 00:28:14,260 >> Et vous avez à être un peu prudent, parce que vous 701 00:28:14,260 --> 00:28:16,247 ne veulent pas d'un doigt de dépasser l'autre 702 00:28:16,247 --> 00:28:18,080 car une corde est plus longue que l'autre. 703 00:28:18,080 --> 00:28:21,380 Donc, vous allez vouloir vérifier pour cette valeur spéciale à la fin, null. 704 00:28:21,380 --> 00:28:24,017 Mais il est vraiment, dans la fin, aussi simple que cela. 705 00:28:24,017 --> 00:28:26,100 Et franchement, nous n'avons pas besoin de réinventer cette roue. 706 00:28:26,100 --> 00:28:27,960 Voici la version deux. 707 00:28:27,960 --> 00:28:32,910 Et ce que je vais dire ici, c'est que au lieu de comparer s est égal à = t, 708 00:28:32,910 --> 00:28:38,964 Je vais dire à la place, si la chaîne comparaison de s est égale à virgule t = 0. 709 00:28:38,964 --> 00:28:40,130 Maintenant, ce qui est une chaîne de comparer? 710 00:28:40,130 --> 00:28:43,046 >> Il s'avère, c'est une fonction qui livré avec C, dont le but dans la vie 711 00:28:43,046 --> 00:28:44,650 est de comparer deux chaînes. 712 00:28:44,650 --> 00:28:48,300 Et remuer comparer, si nous lisons son page de manuel ou de la documentation ou CS50 713 00:28:48,300 --> 00:28:50,630 référence, il sera tout simplement vous dire que remuer 714 00:28:50,630 --> 00:28:55,730 comparer les rendements soit un négatif nombre ou un nombre positif ou nul, 715 00:28:55,730 --> 00:28:57,660 où zéro signifie qu'ils sont égaux. 716 00:28:57,660 --> 00:28:58,570 >> Il suffit donc de conjecture. 717 00:28:58,570 --> 00:29:00,390 Qu'est-ce que cela pourrait signifier si remuer rendements comparer 718 00:29:00,390 --> 00:29:02,110 valeur négative ou valeur positive? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBLIC: Supérieur ou inférieur. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Ouais, supérieure ou inférieure. 722 00:29:05,570 --> 00:29:08,640 Donc, si vous voulez trier un ensemble bouquet de chaînes dans un dictionary-- 723 00:29:08,640 --> 00:29:12,975 que nous finirons par en bas de la road-- fonction parfait à utiliser éventuellement, 724 00:29:12,975 --> 00:29:15,850 parce que ça va le faire comparaison de chaînes de caractères pour vous, et dire 725 00:29:15,850 --> 00:29:20,060 vous fait un vient avant b, ou ne b comparaître devant un ordre alphabétique. 726 00:29:20,060 --> 00:29:21,490 Nous pouvons faire exactement cela. 727 00:29:21,490 --> 00:29:23,620 >> Et remarquez que j'ai fait un autre chose dans cet exemple. 728 00:29:23,620 --> 00:29:26,870 Qu'est-ce qui a changé plus dans cette fonction 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 Et c'est cet autre mensonge. 732 00:29:31,150 --> 00:29:33,750 Pendant tout ce temps, lorsque vous avez été écrit chaîne, 733 00:29:33,750 --> 00:29:38,350 nous avons été secrètement en train de réécrire chaîne comme char * afin que clang fait 734 00:29:38,350 --> 00:29:39,270 vous comprend. 735 00:29:39,270 --> 00:29:42,450 >> En d'autres termes, dans CS50.h et que nous finirons par voir, 736 00:29:42,450 --> 00:29:45,950 nous avons fait une chaîne de synonyme appelé c'est la même chose que char *. 737 00:29:45,950 --> 00:29:49,910 Et pour l'instant, de savoir que ce que l' *, Dans ce contexte, au moins, 738 00:29:49,910 --> 00:29:51,286 signifie l'adresse. 739 00:29:51,286 --> 00:29:52,210 >> L'adresse de quoi? 740 00:29:52,210 --> 00:29:56,390 Eh bien, le fait que je l'ai dit char *, et non int * ou * flotter, 741 00:29:56,390 --> 00:30:00,820 un moyen qui est char * l'adresse d'un caractère. 742 00:30:00,820 --> 00:30:06,770 Donc, cette petite boîte ici, aka chaîne, est vraiment de type char *, 743 00:30:06,770 --> 00:30:10,490 qui est tout simplement une façon élégante de dire, dans cette boîte ira une adresse. 744 00:30:10,490 --> 00:30:12,430 Et qu'est-ce que cette adresse référence? 745 00:30:12,430 --> 00:30:13,780 Apparemment, un omble chevalier. 746 00:30:13,780 --> 00:30:16,410 >> Mais nous ne pouvions absolument avoir int * et d'autres choses. 747 00:30:16,410 --> 00:30:20,790 Mais pour l'instant, char * est vraiment le plus simple et l'un des intérêts. 748 00:30:20,790 --> 00:30:23,310 Donc, ce problème va d'augmenter, même si, encore une fois. 749 00:30:23,310 --> 00:30:24,830 >> Supposons que j'ouvre ce programme. 750 00:30:24,830 --> 00:30:27,670 Voyons voir si nous pouvons maintenant prédire Quel est le problème avec ce code. 751 00:30:27,670 --> 00:30:31,140 Donc, dans ce programme, copier-0, je suis aller de l'avant et de nouveau communiquer 752 00:30:31,140 --> 00:30:34,190 GetString et stocker la valeur de l'art. 753 00:30:34,190 --> 00:30:38,800 >> Et puis, pourquoi je fais cela, juste comme un rappel de quelques semaines passé? 754 00:30:38,800 --> 00:30:40,960 Nous avons dit que GetString renvoie parfois nulle. 755 00:30:40,960 --> 00:30:42,793 Qu'est-ce que cela signifie si GetString renvoie null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Quelque chose s'est mal passé. 758 00:30:46,034 --> 00:30:48,950 Cela signifie probablement la chaîne est trop grand, sur la mémoire de l'ordinateur. 759 00:30:48,950 --> 00:30:51,724 Il arrive super, super, super rarement, mais cela pourrait arriver. 760 00:30:51,724 --> 00:30:53,890 Nous voulons vérifier pour elle, et c'est tout ce que nous faisons. 761 00:30:53,890 --> 00:30:57,910 >> Parce que nous allons voir maintenant, si vous n'avez pas commencer à vérifier habituellement pour des choses 762 00:30:57,910 --> 00:31:00,870 comme nulle, vous pourriez réellement commencer à aller 763 00:31:00,870 --> 00:31:03,106 à des adresses en mémoire qui ne sont pas valides. 764 00:31:03,106 --> 00:31:05,980 Et vous allez commencer à induire de plus en plus des erreurs de segmentation. 765 00:31:05,980 --> 00:31:08,360 Ou un Mac ou un PC, tout amener un ordinateur à accrocher 766 00:31:08,360 --> 00:31:10,340 ou un programme de geler, potentiellement. 767 00:31:10,340 --> 00:31:14,930 >> Alors maintenant, je prétends en copie-0.c, que je vais copier ces chaînes par 768 00:31:14,930 --> 00:31:15,685 de la ligne 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Et puis, je vais la revendication en bas 771 00:31:18,750 --> 00:31:21,430 ici que je vais de changer l'un d'eux. 772 00:31:21,430 --> 00:31:22,330 >> Donc apercevoir. 773 00:31:22,330 --> 00:31:24,370 J'appelle notre vieil ami strlen. 774 00:31:24,370 --> 00:31:28,960 Et tout expliquer en anglais Qu'est-ce que la ligne 34 est en train de faire? 775 00:31:28,960 --> 00:31:32,480 Qu'est-ce que t support 0 représenter sur la gauche. 776 00:31:32,480 --> 00:31:32,980 Ouais. 777 00:31:32,980 --> 00:31:34,339 >> AUDIENCE: Le premier caractère de t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: Le premier caractère de t. 779 00:31:35,880 --> 00:31:36,379 C'est tout. 780 00:31:36,379 --> 00:31:40,024 Le premier caractère de t, je veux d'attribuer la version majuscule 781 00:31:40,024 --> 00:31:41,190 du premier caractère à t. 782 00:31:41,190 --> 00:31:43,200 Donc ce capitalise la première lettre. 783 00:31:43,200 --> 00:31:46,340 Et puis, la dernière chose que je fais dans ce programme, c'est que je prétends ici est 784 00:31:46,340 --> 00:31:50,340 l'original, s, et voici la copie, t. 785 00:31:50,340 --> 00:31:54,610 >> Mais sur la base de l'histoire que nous venons de dit à propos de ce que les chaînes sont vraiment, 786 00:31:54,610 --> 00:31:57,520 ce qui est vraiment la ligne 28 faire, et ce qui est 787 00:31:57,520 --> 00:31:59,405 le bug entraînant aller d'être à l'écran? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Alors d'abord, la première question, 28. 790 00:32:03,500 --> 00:32:09,040 Qu'est-ce que la chaîne t = s vraiment en train de faire? 791 00:32:09,040 --> 00:32:16,430 Si nous avons sur la gauche côté ici chaîne t = s; 792 00:32:16,430 --> 00:32:19,400 ça me donne une boîte ici et une boîte ici. 793 00:32:19,400 --> 00:32:25,530 Et supposons que cette adresse est 0x, disons, 50 cette fois-ci, de façon arbitraire. 794 00:32:25,530 --> 00:32:28,847 Qu'est-ce que la chaîne t = s faire sous le capot? 795 00:32:28,847 --> 00:32:30,340 >> PUBLIC: [inaudible] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: Il stocke la mémoire il adresse, de sorte 0x50 y va. 797 00:32:34,100 --> 00:32:37,980 Donc, si maintenant, je vais à la première caractère en majuscule et t il, 798 00:32:37,980 --> 00:32:39,535 ce que je fais efficacement à s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Je fais vraiment la même chose, non? 801 00:32:43,450 --> 00:32:47,680 Parce que si Adresse 0x50-- et juste, je n'ont pas beaucoup de place sur la carte ici, 802 00:32:47,680 --> 00:32:51,750 mais supposons que ce soit 0x50 ici-bas, quelque part dans la mémoire de mon ordinateur. 803 00:32:51,750 --> 00:32:55,825 >> Et j'ai, par exemple, Gabe en minuscules là, comme ça. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Et je l'ai dit t support 0 se capitalise. 806 00:33:01,980 --> 00:33:04,860 Eh bien, t support est 0 la première lettre t. 807 00:33:04,860 --> 00:33:07,840 Si peu g va devenu grand G. Mais le problème 808 00:33:07,840 --> 00:33:09,410 est, ce qui ne s ont aussi pointer vers? 809 00:33:09,410 --> 00:33:10,300 >> AUDIENCE: Le même. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: exactement la même chose. 811 00:33:11,841 --> 00:33:16,342 Ainsi, une explication simple peut-être, même si la syntaxe est un peu bizarre. 812 00:33:16,342 --> 00:33:17,050 Donc, nous allons le faire. 813 00:33:17,050 --> 00:33:20,210 Assurez-copie-0 puis ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Dire quelque chose: Gabe. 816 00:33:24,110 --> 00:33:26,760 Et malheureusement, les deux les ont été capitalisés, 817 00:33:26,760 --> 00:33:29,500 mais pour ce sous-jacent raison pour laquelle nous sommes tout simplement 818 00:33:29,500 --> 00:33:32,350 maintenant faire face à des adresses. 819 00:33:32,350 --> 00:33:36,470 >> Alors, comment pouvons-nous commencer à address-- sans jeu de mots intended-- 820 00:33:36,470 --> 00:33:39,270 comment pouvons-nous commencer à traiter ce problème particulier? 821 00:33:39,270 --> 00:33:44,400 Eh bien, dans copy1.c, les choses vont pour obtenir un peu plus compliqué. 822 00:33:44,400 --> 00:33:49,310 Mais je voudrais demander une solution conceptuellement simple. 823 00:33:49,310 --> 00:33:50,852 >> Si difficile à obtenir à première vue. 824 00:33:50,852 --> 00:33:53,560 Ne va pas être facile pour la première fois que vous tapez-le, peut-être, 825 00:33:53,560 --> 00:33:57,440 mais si le problème est que faisant tout simplement t = s seulement 826 00:33:57,440 --> 00:33:59,694 copies l'adresse, ce qui, encore si je peux prendre à vous, 827 00:33:59,694 --> 00:34:02,110 va être la solution pour la copie fait une chaîne? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIC: Nous allons probablement utiliser de nouveau une boucle. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Ouais. 831 00:34:06,890 --> 00:34:08,390 Donc, nous allons avoir besoin de nouveau une boucle. 832 00:34:08,390 --> 00:34:11,800 Et parce que si nous voulons copier une chaîne s dans une autre chaîne, 833 00:34:11,800 --> 00:34:14,120 nous voulons probablement de le faire caractère par caractère. 834 00:34:14,120 --> 00:34:17,199 Mais le problème est, si ceci est à l'origine de, 835 00:34:17,199 --> 00:34:22,159 maintenant nous devons commencer explicitement allouer de la mémoire pour t. 836 00:34:22,159 --> 00:34:24,320 >> En d'autres termes, nous allons redessiner une dernière fois. 837 00:34:24,320 --> 00:34:28,659 Si ce n'est = GetString de chaîne. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Et nous allons mettre ce ici, aussi. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 C'est GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Et puis, l'image de quelque chose comme ça va être comme avant, 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 Cela ressemble un peu quelque chose comme ça. 847 00:34:48,960 --> 00:34:53,650 Et donc l'art, on appelle ce 0x50, et que ça va être 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> C'est donc 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Et puis, je fais chaîne t. 851 00:34:59,690 --> 00:35:02,450 Dans la mémoire, qui va tout simplement donnez-moi une petite place comme ça. 852 00:35:02,450 --> 00:35:04,080 Alors, quelle est l'étape clé maintenant? 853 00:35:04,080 --> 00:35:09,870 Si je veux copier s en t, ce qui blanc devons-nous remplir ici? 854 00:35:09,870 --> 00:35:12,050 Ou qu'est-ce que nous devons faire à un niveau élevé? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Ouais? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Quelqu'un? 859 00:35:17,020 --> 00:35:17,690 Ouais. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIC: Nous avons besoin de [inaudible]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Oui, nous besoin de remplir ce vide. 862 00:35:21,380 --> 00:35:24,340 Je ne peux pas copier, puis capitaliser le nom de Gabe 863 00:35:24,340 --> 00:35:28,120 jusqu'à ce que je demande au système d'exploitation pour un autre bloc de mémoire 864 00:35:28,120 --> 00:35:30,640 c'est au moins aussi grand que l'original. 865 00:35:30,640 --> 00:35:32,130 Alors que nous laisse avec une question. 866 00:35:32,130 --> 00:35:36,080 >> Comment puis-je demander au système d'exploitation ne juste pour un simple petit pointer-- 867 00:35:36,080 --> 00:35:38,530 comme ce qu'on appelle, une adresse, une pointer-- pas 868 00:35:38,530 --> 00:35:40,980 un peu simple boîte comme ce appelé une chaîne? 869 00:35:40,980 --> 00:35:44,200 Comment puis-je demander l'exploitation système pour une grande partie de la mémoire? 870 00:35:44,200 --> 00:35:48,430 Jusqu'à présent, je n'ai eu que de retour indirectement en appelant GetString. 871 00:35:48,430 --> 00:35:50,740 Alors, comment est GetString même obtenir sa mémoire? 872 00:35:50,740 --> 00:35:53,430 >> Eh bien, il s'avère qu'il n'y a cette autre fonction ici 873 00:35:53,430 --> 00:35:55,160 que nous allons maintenant commencer à utiliser. 874 00:35:55,160 --> 00:35:59,780 Maintenant, cela ressemble than-- façon plus cryptique et je suis le seul qui peut voir it-- 875 00:35:59,780 --> 00:36:03,150 cette ligne a l'air bien plus cryptique alors il devrait à première vue. 876 00:36:03,150 --> 00:36:04,650 Mais nous allons taquiner à part. 877 00:36:04,650 --> 00:36:07,950 >> Sur le côté gauche, j'ai char * t. 878 00:36:07,950 --> 00:36:13,280 Donc, en anglais, nous allons commencer à formuler des phrases correctes dans le jargon technique. 879 00:36:13,280 --> 00:36:19,757 Donc ce alloue une variable de type char * appelé t. 880 00:36:19,757 --> 00:36:21,090 Maintenant, qu'est-ce que cela signifie réellement? 881 00:36:21,090 --> 00:36:23,881 >> Eh bien, cela signifie, que vais-je à mettre dans cette variable appelée t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Une adresse d'un caractère. 884 00:36:26,402 --> 00:36:28,360 Donc, ce n'est que le plus simple, plus de façon raisonnable 885 00:36:28,360 --> 00:36:29,930 de décrire le côté gauche. 886 00:36:29,930 --> 00:36:32,890 Cela crée cette boîte ici seulement. 887 00:36:32,890 --> 00:36:34,760 Donc le côté droit, sans doute, va 888 00:36:34,760 --> 00:36:37,170 d'allouer plus que bloc de mémoire comment? 889 00:36:37,170 --> 00:36:38,340 Donc, nous allons taquiner cet appart. 890 00:36:38,340 --> 00:36:41,131 >> Il est écrasante au premier abord, mais ce qui se passe à l'intérieur ici? 891 00:36:41,131 --> 00:36:43,740 Tout d'abord, il ya malloc, qui est apparemment notre nouvel ami, 892 00:36:43,740 --> 00:36:45,450 «Mémoire allouer." 893 00:36:45,450 --> 00:36:49,560 Donc, c'est l'argument étant passé en elle, c'est donc un assez grand argument. 894 00:36:49,560 --> 00:36:50,970 Donc, nous allons taquiner cet appart. 895 00:36:50,970 --> 00:36:53,410 >> strlen de s, bien sûr, représente the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 AUDIENCE: Le nombre de caractères. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Juste le nombre de caractères dans s. 899 00:36:56,710 --> 00:36:59,040 Ainsi, la longueur de s, la chaîne d'origine. 900 00:36:59,040 --> 00:37:00,350 So G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 C'est donc probablement quatre dans ce cas. 902 00:37:02,320 --> 00:37:05,485 Pourquoi suis-je en train de faire une après appels à strlen de s? 903 00:37:05,485 --> 00:37:06,360 PUBLIC: [inaudible] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Pour que caractère spécial nulle. 905 00:37:07,590 --> 00:37:11,260 Si vous me demandez quelle est la longueur de Le nom de Gabe, je vais dire quatre. 906 00:37:11,260 --> 00:37:14,480 Sous le capot, cependant, je dois que le cinquième octet pour le caractère nul. 907 00:37:14,480 --> 00:37:16,100 C'est pour cela que je fais la une. 908 00:37:16,100 --> 00:37:21,730 >> Maintenant, juste au cas où vous utilisez ce programme sur un ordinateur autre que, par exemple, 909 00:37:21,730 --> 00:37:24,610 l'appareil de CS50, où la taille d'un caractère 910 00:37:24,610 --> 00:37:26,350 peut être différent de ma propre computer-- 911 00:37:26,350 --> 00:37:30,590 s'avère que je peux appeler ce opérateur sizeof, il suffit de demander l'ordinateur, 912 00:37:30,590 --> 00:37:32,870 quelle est la taille d'un carboniser sur cet ordinateur? 913 00:37:32,870 --> 00:37:37,400 >> Et en multipliant par cinq dans ce par exemple la taille d'un caractère, qui 914 00:37:37,400 --> 00:37:40,440 sur la plupart des ordinateurs juste un, malloc 915 00:37:40,440 --> 00:37:44,830 va allouer pour moi ce grand bloc de mémoire ici sur la droite. 916 00:37:44,830 --> 00:37:47,140 Et ça va return-- c'est un function-- il est donc 917 00:37:47,140 --> 00:37:48,265 va revenir à moi quoi? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 PUBLIC: L'adresse? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: L'adresse de quoi? 921 00:37:53,709 --> 00:37:55,250 PUBLIC: De la mémoire, il alloué? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: De la mémoire, il alloué. 923 00:37:56,450 --> 00:37:59,189 Donc, je n'ai aucune idée, franchement, où cela va finir. 924 00:37:59,189 --> 00:38:01,480 Je vais proposer que ça va finir à 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Tout à fait arbitraire, mais ailleurs que 0x50, 927 00:38:06,009 --> 00:38:08,800 parce que le système d'exploitation, ce qui Windows et Mac OS font pour moi, est 928 00:38:08,800 --> 00:38:11,230 assurez-vous que c'est donner moi différents morceaux de RAM. 929 00:38:11,230 --> 00:38:14,210 >> Donc, c'est la valeur où ce bloc de mémoire pourrait finir. 930 00:38:14,210 --> 00:38:16,060 Donc, c'est ce qui finit ici, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Alors maintenant, clairement, je peux comprendre ce qui n'est pas le même que celui, 933 00:38:21,570 --> 00:38:23,960 parce qu'ils en montrant différents blocs de mémoire. 934 00:38:23,960 --> 00:38:29,980 Donc, si je veux maintenant fait de copier ce en, faisons la solution proposée. 935 00:38:29,980 --> 00:38:36,870 >> Disons simplement aller, créer une boucle, et faire t support i obtient de support i. 936 00:38:36,870 --> 00:38:39,760 Parce que maintenant je peux utiliser cette notation semblable à un tableau, 937 00:38:39,760 --> 00:38:43,390 parce que même si malloc très me alloue génériquement mémoire, 938 00:38:43,390 --> 00:38:45,290 mémoire est juste octets contigus. 939 00:38:45,290 --> 00:38:47,240 Octet, octet, octet, dos à dos à dos. 940 00:38:47,240 --> 00:38:50,030 >> Je ne peux certainement en tant que programmeur traiter comme un tableau, qui 941 00:38:50,030 --> 00:38:55,090 signifie que je peux utiliser ce enfin familier notation de seulement quelques crochets. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Alors permettez-moi de m'arrêter là, parce que c'est beaucoup à la fois, même 944 00:39:00,020 --> 00:39:03,530 si l'idée de base pour récapituler est cette chaîne, tout ce temps, 945 00:39:03,530 --> 00:39:05,550 n'est pas un nouveau type de données en soi. 946 00:39:05,550 --> 00:39:10,150 C'est juste un pointeur soi-disant, une adresse d'un caractère, 947 00:39:10,150 --> 00:39:12,650 ce qui signifie que c'est un nombre que par convention humain 948 00:39:12,650 --> 00:39:15,350 nous avons tendance à écrire comme 0x quelque chose. 949 00:39:15,350 --> 00:39:18,590 >> Mais c'est juste un nombre, comme 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 qui se trouve être l' Adresse de bâtiment CS. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Vous avez des questions sur ces détails? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Ouais? 955 00:39:25,289 --> 00:39:28,530 >> PUBLIC: Pourquoi nous vérifions pour t égal à null? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: Pourquoi avons-nous vérifier t égal à null? 957 00:39:30,740 --> 00:39:33,250 Si nous lisons la documentation-- grand question-- pour malloc, 958 00:39:33,250 --> 00:39:37,020 il va dire en petits caractères, parfois malloc pourrait retourner null, 959 00:39:37,020 --> 00:39:38,080 comme GetString. 960 00:39:38,080 --> 00:39:41,820 Et en effet, GetString renvoie null si, à son tour, malloc renvoie null, 961 00:39:41,820 --> 00:39:43,130 parce GetString utilise malloc. 962 00:39:43,130 --> 00:39:46,400 >> Et qui pourrait se produire si le système d'exploitation, Mac OS, Windows, que ce soit, est tout simplement 963 00:39:46,400 --> 00:39:48,130 de mémoire pour vous. 964 00:39:48,130 --> 00:39:49,820 Voilà donc ce qui s'est passé. 965 00:39:49,820 --> 00:39:52,910 >> Et permettez-moi de révéler une autre chose qui pourrait bien souffler votre esprit 966 00:39:52,910 --> 00:39:55,100 ou complètement être trop loin sur la ligne. 967 00:39:55,100 --> 00:39:59,770 Mais laissez-moi ôter la même pour la boucle pour la copie, 968 00:39:59,770 --> 00:40:05,480 Il ya un moment où, le rappel était ce. t i obtient support de tranche i. 969 00:40:05,480 --> 00:40:06,740 >> Nice et conviviale. 970 00:40:06,740 --> 00:40:09,330 On se sent comme la deuxième semaine de nouveau. 971 00:40:09,330 --> 00:40:14,920 Mais cette version peut effectivement être réécrite comme cela, qui semble énigmatique. 972 00:40:14,920 --> 00:40:18,280 Il s'agit d'un pointeur de la technique appelée arithmétique, adresse arithmétique. 973 00:40:18,280 --> 00:40:19,600 Mais pourquoi ça marche? 974 00:40:19,600 --> 00:40:22,220 >> Maintenant, fâcheusement, le auteurs de C ont décidé d'utiliser 975 00:40:22,220 --> 00:40:25,070 le symbole * dans des buts différents. 976 00:40:25,070 --> 00:40:29,020 Nous avons vu qu'il était déjà une fois, char *, qui signifie «donne-moi une variable 977 00:40:29,020 --> 00:40:31,210 qui va contenir l'adresse d'un caractère. " 978 00:40:31,210 --> 00:40:33,990 * Donc, l'omble dans ce contexte signifie «donne-moi une variable." 979 00:40:33,990 --> 00:40:40,050 >> Malheureusement, si vous utilisez l'* sans un mot en face d'elle, comme l'omble, 980 00:40:40,050 --> 00:40:41,905 il est maintenant appelé le opérateur de déréférencement. 981 00:40:41,905 --> 00:40:43,530 Et nous allons voir plus de cette avant longtemps. 982 00:40:43,530 --> 00:40:44,930 Mais cela signifie juste "y aller." 983 00:40:44,930 --> 00:40:49,070 C'est comme dire que, si quelqu'un me tendit sur un morceau de papier "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 si je fais "* 33 Oxford Street," ce qui signifie "Descendre la route à la construction CS." 985 00:40:53,830 --> 00:40:57,220 >> Donc * signifie juste là si aller il n'y a aucun mot en face d'elle. 986 00:40:57,220 --> 00:40:59,100 Alors, quelle est t, pour être clair? 987 00:40:59,100 --> 00:41:03,250 t est l'adresse de la partie de mémoire qui a été donnée de nouveau à moi. 988 00:41:03,250 --> 00:41:06,650 s est l'adresse de ce qui, pour être clair, dans l'exemple que nous avons discuté, 989 00:41:06,650 --> 00:41:07,500 de gabe minuscules? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s est l'adresse de-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 PUBLIC: La chaîne. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: De nom original de Gabe. 995 00:41:14,126 --> 00:41:16,660 C'est donc l'adresse de ce morceau de mémoire. 996 00:41:16,660 --> 00:41:22,220 Donc, si je dis t + i i--, avis, est juste notre vieil ami. 997 00:41:22,220 --> 00:41:24,770 C'est juste une variable d'index que cela itération à partir de zéro sur place 998 00:41:24,770 --> 00:41:26,960 à la longueur de la chaîne s. 999 00:41:26,960 --> 00:41:30,367 Donc ça va être zéro, un, puis deux, puis trois, puis quatre. 1000 00:41:30,367 --> 00:41:33,200 Donc, nous allons assembler ces nouveaux Des pièces de puzzle rayures comme, si vous voulez, 1001 00:41:33,200 --> 00:41:36,140 même si, encore une fois, la syntaxe est beaucoup plus obscur que Scratch. 1002 00:41:36,140 --> 00:41:39,522 Donc t est une adresse + i va me donner 1003 00:41:39,522 --> 00:41:42,480 un certain nombre, parce que ce sont tous chiffres que nous avons dessin comme hex. 1004 00:41:42,480 --> 00:41:43,560 Mais ils ne sont que des chiffres. 1005 00:41:43,560 --> 00:41:49,960 >> Donc, si l'adresse de t nous dit était 0x88, 0x88 ce n'est plus zéro. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Même si vous n'êtes pas à l'aise avec six pans encore, faire une supposition. 1008 00:41:53,980 --> 00:41:54,410 >> PUBLIC: L'original. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Toujours 0x88. 1010 00:41:55,850 --> 00:41:58,910 Alors qu'est-ce * 0x88 signifie? 1011 00:41:58,910 --> 00:42:02,670 Cela signifie, "y aller", qui signifie effectivement, «Avance ton doigt ici." 1012 00:42:02,670 --> 00:42:06,930 Et maintenant, sur le côté droit de cette expression, * puis dans parens, 1013 00:42:06,930 --> 00:42:11,586 s + i signifie s, ce qui est le traiter ici de la petite g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 est, bien sûr, s, quel que soit l est. 1015 00:42:16,220 --> 00:42:21,230 >> Alors maintenant, c'est * s, tout comme 33 * Oxford Street signifie aller à l'adresse 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Alors, voici ce doigt, la main droite. 1018 00:42:24,170 --> 00:42:26,050 Alors qu'est-ce que je vais copier dans quoi? 1019 00:42:26,050 --> 00:42:30,260 La chose sur la droite, qui est gabe, peu g ici, en voici. 1020 00:42:30,260 --> 00:42:32,750 >> Et si l'effet de cette première itération de la boucle, 1021 00:42:32,750 --> 00:42:36,200 comme vous l'avez proposé, même s'il semble fou plus compliqué que tout 1022 00:42:36,200 --> 00:42:42,110 nous avons vu auparavant, dit simplement aller ici et copier ce personnage ici. 1023 00:42:42,110 --> 00:42:44,700 Il te donne une carte à deux endroits. 1024 00:42:44,700 --> 00:42:46,130 >> Et nous allons voir beaucoup plus de cette. 1025 00:42:46,130 --> 00:42:50,600 Mais pour l'instant, l'espoir est tout à introduire certaines de ces idées de base. 1026 00:42:50,600 --> 00:42:53,550 Et en effet, regardons un programme final ici, 1027 00:42:53,550 --> 00:42:57,480 puis la pâte à modeler promis, qui fera que tout va bien. 1028 00:42:57,480 --> 00:42:57,980 Bien. 1029 00:42:57,980 --> 00:43:01,680 Alors permettez-moi d'ouvrir up-- là nous allons. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Alors laissez moi-- nous reviendrons à cette image avant longtemps. 1032 00:43:05,440 --> 00:43:08,360 Permettez-moi d'ouvrir cette dernier exemple ici. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Voici donc un super, super programme qui accomplit 1035 00:43:12,710 --> 00:43:15,050 rien dans la vie qui fait la suivante. 1036 00:43:15,050 --> 00:43:18,740 Il déclare d'abord deux variables, x et y, qui ne sont pas des nombres ce temps, 1037 00:43:18,740 --> 00:43:19,240 en soi. 1038 00:43:19,240 --> 00:43:20,448 Ils ne sont pas entiers, en soi. 1039 00:43:20,448 --> 00:43:22,899 Ils sont apparemment int *. 1040 00:43:22,899 --> 00:43:25,690 Donc n'importe qui, ça veut dire quoi si votre type de données, votre variable, 1041 00:43:25,690 --> 00:43:26,860 est de type int * étoiles? 1042 00:43:26,860 --> 00:43:30,240 C'est l'adresse d'un int. 1043 00:43:30,240 --> 00:43:31,990 >> Donc, je n'ai aucune idée d'où il est encore. 1044 00:43:31,990 --> 00:43:35,150 Cela signifie tout simplement "mis, par la suite, l'adresse d'un int ici. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, où il est en mémoire, une adresse y va. 1046 00:43:38,340 --> 00:43:40,200 Et c'est ce qui y est va être ainsi. 1047 00:43:40,200 --> 00:43:44,920 >> Si je vous dis maintenant x = malloc (sizeof (int)), c'est une façon élégante de dire, 1048 00:43:44,920 --> 00:43:49,000 hey système d'exploitation, via malloc, me donner assez de mémoire pour la taille 1049 00:43:49,000 --> 00:43:52,370 d'un int, ce qui est probablement va être 32 bits ou quatre octets. 1050 00:43:52,370 --> 00:43:53,680 >> Alors qu'est-ce que malloc revenir? 1051 00:43:53,680 --> 00:43:55,250 Malloc renvoie une adresse. 1052 00:43:55,250 --> 00:43:57,020 Alors, que va se faire stockée dans x? 1053 00:43:57,020 --> 00:44:00,600 L'adresse de la partie de la mémoire, les quatre octets, que malloc 1054 00:44:00,600 --> 00:44:03,360 vient de trouver pour moi en demandant le système d'exploitation. 1055 00:44:03,360 --> 00:44:08,240 >> Maintenant, quant à lui, ligne quatre ici, le * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Juste pour être clair, ce qui se passe là-bas? 1057 00:44:09,990 --> 00:44:11,530 Sur le côté gauche, * x. 1058 00:44:11,530 --> 00:44:13,610 c'est comme * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Donc * x signifie quoi? 1060 00:44:15,523 --> 00:44:16,450 >> PUBLIC: Aller à. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Aller à cette adresse. 1062 00:44:17,908 --> 00:44:20,466 Partout où ce morceau de la mémoire est, allez-y. 1063 00:44:20,466 --> 00:44:21,979 Et mettre ce que là, évidemment? 1064 00:44:21,979 --> 00:44:22,520 PUBLIC: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 Tous les droits, y *, même idée. 1067 00:44:25,650 --> 00:44:26,860 Allez à l'adresse en y. 1068 00:44:26,860 --> 00:44:31,740 Mettez le numéro 13 là-bas, mais ce qui est y en ce moment? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 PUBLIC: Il n'y a pas de mémoire pour y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Il est pas de mémoire pour y. 1072 00:44:35,710 --> 00:44:38,215 Alors qu'est-ce y probablement contenir, comme nous l'avons dit? 1073 00:44:38,215 --> 00:44:38,520 >> PUBLIC: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Certains valeur des ordures. 1075 00:44:39,480 --> 00:44:41,320 Maintenant, la valeur des déchets est encore un certain nombre. 1076 00:44:41,320 --> 00:44:43,160 Il peut encore être confondu avec une adresse. 1077 00:44:43,160 --> 00:44:45,160 C'est comme si quelqu'un griffonné quelque chose en bas, 1078 00:44:45,160 --> 00:44:48,002 et j'ai mal interprété comme signifiant quelques bâtiments dans la rue. 1079 00:44:48,002 --> 00:44:50,460 Et si vous essayez juste d'entrer dans quelques bâtiments vous ne possédez pas, 1080 00:44:50,460 --> 00:44:53,710 ou un morceau de mémoire que vous ne l'avez pas été donné, de mauvaises choses peuvent se produire. 1081 00:44:53,710 --> 00:44:57,740 Ordinateur peut se bloquer, ou de quelque autre comportement indéterminé pourrait se produire. 1082 00:44:57,740 --> 00:45:01,310 >> Donc l'intro, puis, à Binky est la suivante. 1083 00:45:01,310 --> 00:45:04,290 Je me souviens encore, 20 et quelques années plus tard, 1084 00:45:04,290 --> 00:45:07,200 où j'étais quand j'ai finalement compris pointeurs. 1085 00:45:07,200 --> 00:45:09,520 >> C'est-à-dire, si vous laisser ici en trois minutes 1086 00:45:09,520 --> 00:45:12,170 et je pense que je ne suis pas comprendre les pointeurs, réaliser 1087 00:45:12,170 --> 00:45:14,410 Je me suis souvenu de 20 ans pour une raison folle 1088 00:45:14,410 --> 00:45:17,140 quand et pourquoi il a finalement coulé en, assis avec mon enseignement 1089 00:45:17,140 --> 00:45:19,501 camarade, Nishat Mehta dans le retour d'Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Maintenant, je suis rappelé ce parce que c'était 1091 00:45:21,250 --> 00:45:23,920 l'un des thèmes I, dans notamment, aux prises avec. 1092 00:45:23,920 --> 00:45:26,470 Et puis, il a finalement cliqué, comme j'ose dire beaucoup de sujets 1093 00:45:26,470 --> 00:45:27,460 finira par y arriver. 1094 00:45:27,460 --> 00:45:32,590 Et maintenant, de faire sentir que tout le heureux et d'autant plus convaincante, 1095 00:45:32,590 --> 00:45:35,360 nous allons jeter un dernier coup d'œil dans notre trois dernières minutes ici à Binky, 1096 00:45:35,360 --> 00:45:37,675 de notre ami, Nick Parlante de Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO LECTURE] 1099 00:45:41,580 --> 00:45:42,750 >> Hé, Binky. 1100 00:45:42,750 --> 00:45:43,500 Réveillez-vous! 1101 00:45:43,500 --> 00:45:45,960 Il est temps pour pointeur plaisir. 1102 00:45:45,960 --> 00:45:47,012 >> -Quel Ce que c'est? 1103 00:45:47,012 --> 00:45:48,723 En savoir plus sur les pointeurs? 1104 00:45:48,723 --> 00:45:50,580 Oh, Goody! 1105 00:45:50,580 --> 00:45:53,563 >> Eh bien, pour commencer, je suppose que nous sommes va avoir besoin de quelques pointeurs. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Ce code attribue deux pointeurs, qui peut pointer vers entiers. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Eh bien, je vois les deux pointeurs, mais ils ne semblent pas être pointant à quelque chose. 1110 00:46:02,140 --> 00:46:02,980 >> -C'est Droite. 1111 00:46:02,980 --> 00:46:05,100 Initialement, les pointeurs ne pointent pas à quoi que ce soit. 1112 00:46:05,100 --> 00:46:08,030 Les choses qu'ils pointent vers sont appelés pointees, et leur mise en place de 1113 00:46:08,030 --> 00:46:09,370 une étape séparée. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, droite, droite. 1115 00:46:10,220 --> 00:46:10,950 Je le savais. 1116 00:46:10,950 --> 00:46:12,385 Les pointees sont séparés. 1117 00:46:12,385 --> 00:46:14,315 Er, alors comment voulez-vous allouez un pointée? 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 Eh bien, ce code alloue un nouveau pointée entier, 1121 00:46:18,970 --> 00:46:20,950 et cette partie sont présentées x pour pointer vers elle. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Hé, qui semble mieux. 1124 00:46:23,230 --> 00:46:25,060 Donc, pour lui faire faire quelque chose. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Je vais déréférencer le pointeur x à enregistrer le numéro 42 dans son pointée. 1127 00:46:30,455 --> 00:46:32,830 Pour cette astuce, je vais avoir besoin de mon Baguette magique de déréférencement. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Votre baguette magique de déréférencement? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 That-- c'est très bien. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -C'est Ce que le code ressemble. 1134 00:46:41,080 --> 00:46:44,110 Je viens de mettre en place le nombre, et [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Hé, regardez. 1136 00:46:44,700 --> 00:46:46,140 Là, il va. 1137 00:46:46,140 --> 00:46:50,980 >> -So Faire un déréférencement x suit la flèche pour accéder à son pointée. 1138 00:46:50,980 --> 00:46:53,160 Dans ce cas, un magasin 42 là-dedans. 1139 00:46:53,160 --> 00:46:57,710 Hey essayez de l'utiliser pour stocker le nombre 13 à l'autre pointeur, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Je vais aller sur ici pour y, et obtenir le numéro 13 mise en place. 1142 00:47:03,270 --> 00:47:07,930 Et puis, prendre la baguette de Déréférencement et juste [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 Cela n'a pas fonctionné. 1146 00:47:11,090 --> 00:47:15,630 Dis, Binky, je ne pense pas que le déréférencement y est une bonne idée, parce que vous savez, 1147 00:47:15,630 --> 00:47:17,850 mise en place du pointée est une étape séparée. 1148 00:47:17,850 --> 00:47:20,450 Et je ne pense pas que nous ayons jamais fait. 1149 00:47:20,450 --> 00:47:21,480 >> Point -Bonne. 1150 00:47:21,480 --> 00:47:21,980 Ouais. 1151 00:47:21,980 --> 00:47:25,680 Nous avons réparti le pointeur y, mais nous jamais mis pour pointer vers un pointée. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Très Attentif. 1154 00:47:28,616 --> 00:47:30,240 Hé, vous êtes à la recherche bien là, Binky. 1155 00:47:30,240 --> 00:47:33,400 Pouvez-vous résoudre ce problème afin que les points y à la même pointée comme x? 1156 00:47:33,400 --> 00:47:34,000 >> -sure. 1157 00:47:34,000 --> 00:47:36,780 Je vais utiliser ma baguette magique Affectation de pointeur. 1158 00:47:36,780 --> 00:47:38,740 >> -Est Qui va être un problème comme avant? 1159 00:47:38,740 --> 00:47:39,240 -No. 1160 00:47:39,240 --> 00:47:40,660 Cela ne touche pas les pointees. 1161 00:47:40,660 --> 00:47:44,450 Il change juste un pointeur vers pointer vers la même chose que l'autre. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, je vois. 1163 00:47:45,450 --> 00:47:48,200 Maintenant y pointe vers le même endroit que x. 1164 00:47:48,200 --> 00:47:48,910 Donc attendre. 1165 00:47:48,910 --> 00:47:49,950 Maintenant, y est fixé. 1166 00:47:49,950 --> 00:47:51,120 Il dispose d'un pointée. 1167 00:47:51,120 --> 00:47:54,510 Ainsi, vous pouvez essayer la baguette de Déréférencement de nouveau d'envoyer le 13 plus. 1168 00:47:54,510 --> 00:47:56,510 >> -Euh, OK. 1169 00:47:56,510 --> 00:47:58,160 Ici, il va. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Hé, regardez ça. 1171 00:47:59,340 --> 00:48:00,750 Maintenant déréférencement travaux sur y. 1172 00:48:00,750 --> 00:48:04,991 Et parce que les pointeurs partagent que l'on pointée, ils voient tous deux le 13. 1173 00:48:04,991 --> 00:48:05,490 Ouais. 1174 00:48:05,490 --> 00:48:06,870 Partage, peu importe. 1175 00:48:06,870 --> 00:48:08,820 Donc, allons-nous changer de place maintenant? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, regarde. 1177 00:48:09,440 --> 00:48:10,830 Nous n'avons plus de temps. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Just Rappeler les trois règles de pointeur. 1180 00:48:13,530 --> 00:48:16,560 Number One, la structure de base c'est que vous avez un pointeur, 1181 00:48:16,560 --> 00:48:18,680 et il fait plus à un pointée. 1182 00:48:18,680 --> 00:48:20,640 Mais le pointeur et pointée sont séparés, 1183 00:48:20,640 --> 00:48:22,610 et l'erreur commune est de mettre en place un pointeur, 1184 00:48:22,610 --> 00:48:25,000 mais oublier de lui donner un pointée. 1185 00:48:25,000 --> 00:48:28,170 >> Numéro deux, déréférencement commence au niveau du pointeur 1186 00:48:28,170 --> 00:48:31,050 et suit sa flèche sur pour accéder à son pointée. 1187 00:48:31,050 --> 00:48:33,400 Comme nous le savons tous, ce ne fonctionne que s'il existe 1188 00:48:33,400 --> 00:48:36,270 un pointée, le type de revient à la règle numéro un. 1189 00:48:36,270 --> 00:48:39,000 >> Numéro trois, pointeur affectation prend un pointeur 1190 00:48:39,000 --> 00:48:42,320 et modifie pour pointer vers l' même pointée comme un autre pointeur. 1191 00:48:42,320 --> 00:48:44,160 Donc, après la cession, les deux pointeurs 1192 00:48:44,160 --> 00:48:45,910 va pointer vers le même pointée. 1193 00:48:45,910 --> 00:48:47,990 Parfois, c'est ce qu'on appelle le partage. 1194 00:48:47,990 --> 00:48:49,740 Et c'est tout ce qu'il ya à faire, vraiment. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye maintenant. 1196 00:48:50,277 --> 00:48:51,110 [FIN LECTURE VIDÉO] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: C'est tout pour CS50. 1198 00:48:52,568 --> 00:48:55,110 Nous nous reverrons la semaine prochaine. 1199 00:48:55,110 --> 00:48:56,064