1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Semaine 4, suite] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Université de Harvard] 3 00:00:04,240 --> 00:00:07,290 [C'est CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> C'est CS50, et c'est la fin de la semaine 4. 5 00:00:11,290 --> 00:00:14,030 Donc, quelques bonnes nouvelles et de mauvaises nouvelles. 6 00:00:14,030 --> 00:00:26,240 Aucune conférence le lundi, pas de problème réglé la semaine prochaine. [Applaudissements des étudiants] 7 00:00:26,240 --> 00:00:28,680 Vous n'allez pas aimer où cela se passe. 8 00:00:28,680 --> 00:00:31,590 Mais nous avons ce lieu mercredi prochain, 9 00:00:31,590 --> 00:00:37,740 et il ya aussi par le programme 1 conférence vendredi prochain vendredi pour que nous puissions rester sur la bonne voie. 10 00:00:37,740 --> 00:00:40,580 Mais tout sera filmé comme d'habitude, donc ne vous inquiétez pas. 11 00:00:40,580 --> 00:00:44,100 >> Et en ce qui concerne quiz 0 que nous allons faire vers fin de la semaine 12 00:00:44,100 --> 00:00:47,140 est poster sur cs50.net page d'accueil du cours d'explication 13 00:00:47,140 --> 00:00:50,160 de ce genre d'attentes, vous devriez avoir quand il s'agit de le premier quiz. 14 00:00:50,160 --> 00:00:55,100 En général, il sera à choix multiple, vrai ou faux, réponse courte, courtes problèmes de codage. 15 00:00:55,100 --> 00:00:57,360 Vous n'allez pas attendre pour mettre en œuvre l'équivalent 16 00:00:57,360 --> 00:01:00,030 d'un problème que vous pouvez voir sur un ensemble de processeurs, pour lequel vous avez un ordinateur 17 00:01:00,030 --> 00:01:03,240 et un débogueur et autres, mais il y aura de petits problèmes de codage. 18 00:01:03,240 --> 00:01:06,900 >> Et en effet, le meilleur guide pour avoir une idée de ce quiz sont comme CS50 19 00:01:06,900 --> 00:01:09,180 est d'aller à cs50.net, cliquez sur le lien Quiz, 20 00:01:09,180 --> 00:01:11,920 et vous pouvez voir les dernières années la valeur de quiz. 21 00:01:11,920 --> 00:01:16,600 Il faut juste réaliser que le programme n'a pas toujours été le même au fil des ans. 22 00:01:16,600 --> 00:01:18,510 Parfois, nous ajoutons parfois des soustractions, 23 00:01:18,510 --> 00:01:20,670 donc si vous voyez quelque sujet sur un de ces vieux jeux-questionnaires 24 00:01:20,670 --> 00:01:25,380 que vous n'avez aucune idée de ce qu'il parle, c'est soit que nous ne couvrez 25 00:01:25,380 --> 00:01:27,210 ou que nous n'avons pas le couvrir. 26 00:01:27,210 --> 00:01:31,110 Mais sous la forme d'avis, ce dimanche, le lundi et le mardi 27 00:01:31,110 --> 00:01:34,770 ainsi que d'un cours à l'échelle session d'examen dans la nuit de dimanche - 28 00:01:34,770 --> 00:01:37,500 heure et le lieu seront annoncés sur le site Internet du cours - 29 00:01:37,500 --> 00:01:40,120 vous avez tous l'occasion d'examiner avec les boursiers d'enseignement du cours de 30 00:01:40,120 --> 00:01:44,830 le matériel pour cette année, à la fois en coupe et en classe entière, 31 00:01:44,830 --> 00:01:48,400 et ceux qui seront filmés comme d'habitude aussi. 32 00:01:48,400 --> 00:01:53,380 >> Très bien. Alors sans plus tarder, un commentaire sur pass / fail et ajouter / supprimer. 33 00:01:53,380 --> 00:01:57,980 Vous pouvez avoir vu mes notes hier soir, et c'est vraiment juste une assurance supplémentaire 34 00:01:57,980 --> 00:02:01,250 que si vous êtes parmi ceux qui sont particulièrement moins à l'aise ou quelque part entre 35 00:02:01,250 --> 00:02:04,870 et vous vous sentez un peu en dessus de votre tête, 36 00:02:04,870 --> 00:02:08,430 rends compte que c'est en effet tout à fait normal, et il ya une structure large soutien en place, 37 00:02:08,430 --> 00:02:13,530 dont les heures de bureau sont désireux d'améliorer d'autant plus pour ma dernière nuit courriel, 38 00:02:13,530 --> 00:02:16,520 et de réaliser aussi que comme une option réussite / échec pour une classe comme ceci 39 00:02:16,520 --> 00:02:21,540 est vraiment conçu comme un mécanisme pour prendre le bord d'un cours comme celui-ci, 40 00:02:21,540 --> 00:02:24,200 de sorte que de nouveau si vous passez les 10, 15, 20 heures 41 00:02:24,200 --> 00:02:28,160 juste essayer d'obtenir quelque pset à travailler et vous savez que vous êtes à 90-95% de la façon dont il 42 00:02:28,160 --> 00:02:32,100 mais vous ne pouvez pas trouver un bug damn, dans une réussite / échec c'est une sorte de bien. 43 00:02:32,100 --> 00:02:36,230 >> L'idée est que, avec ce mécanisme, vous pouvez alors aller vous concentrer sur vos psets autres 44 00:02:36,230 --> 00:02:39,530 dormir ou quoi que ce soit que vous voulez mettre l'accent. 45 00:02:39,530 --> 00:02:43,390 Alors rendez compte que vous avez jusqu'à mardi prochain - techniquement le 5 lundi, 46 00:02:43,390 --> 00:02:50,840 mais c'est un jour férié, donc mardi prochain - pour passer de réussite / échec-versa ou vice graduées. 47 00:02:50,840 --> 00:02:54,450 Et si vous êtes vraiment au bord du précipice et que vous envisagez d'abandonner tout à fait, 48 00:02:54,450 --> 00:02:56,440 s'il vous plaît me rattraper après la conférence ou envoyez-moi une note. 49 00:02:56,440 --> 00:02:59,990 Nous aimerions au moins le chat avant de vous dire adieu. 50 00:02:59,990 --> 00:03:03,470 Très bien. Nous avons donc commencé à prendre les roues de formation la dernière fois. 51 00:03:03,470 --> 00:03:06,030 En particulier, nous nous sommes concentrés sur la chaîne. 52 00:03:06,030 --> 00:03:09,740 String est quelque chose qui est déclarée dans la bibliothèque CS50, 53 00:03:09,740 --> 00:03:14,340 spécifiquement dans ce fichier appelé cs50.h que nous allons commencer à regarder cette semaine et la suivante. 54 00:03:14,340 --> 00:03:17,250 Mais la chaîne est vraiment juste une simplification de quelque chose 55 00:03:17,250 --> 00:03:20,980 c'est un peu plus arcanely décrit comme char *. 56 00:03:20,980 --> 00:03:24,090 Char nous connaissons. C'est juste un seul caractère. 57 00:03:24,090 --> 00:03:28,010 Mais * à compter du lundi notée quoi? >> [L'élève] Un pointeur. 58 00:03:28,010 --> 00:03:31,290 Un pointeur. Et qu'est-ce qu'un pointeur? >> [L'élève] Une adresse. 59 00:03:31,290 --> 00:03:33,420 >> C'est comme une adresse, un lieu de mémoire. 60 00:03:33,420 --> 00:03:35,910 Qu'est-ce qu'une adresse ou le lieu ou la mémoire? 61 00:03:35,910 --> 00:03:40,290 Encore une fois, nous avons tous des ordinateurs portables avec un concert ou 2 gigaoctets de RAM probablement ces jours-ci, 62 00:03:40,290 --> 00:03:44,160 et cela signifie que vous avez un milliard ou 2 milliards d'octets d'une valeur de mémoire. 63 00:03:44,160 --> 00:03:46,240 Et il ne compte pas vraiment ce que cela donne comme physiquement, 64 00:03:46,240 --> 00:03:51,220 mais prendre sur la foi que vous pouvez numéroter tous les octets individuels que votre propre ordinateur portable a - 65 00:03:51,220 --> 00:03:54,580 c'est l'octet 0, c'est l'octet 1, c'est l'octet 2 milliards de dollars - 66 00:03:54,580 --> 00:03:56,100 et c'est exactement ce que fait un ordinateur. 67 00:03:56,100 --> 00:04:00,030 Lorsque vous allouer de l'espace pour un seul caractère, par exemple, 68 00:04:00,030 --> 00:04:02,480 il a évidemment de vivre quelque part dans la mémoire de votre ordinateur, 69 00:04:02,480 --> 00:04:05,860 et c'est peut-être à l'octet numéro 12345, 70 00:04:05,860 --> 00:04:08,470 et c'est quelque part ici dans la mémoire de votre ordinateur. 71 00:04:08,470 --> 00:04:12,630 Et puis l'adresse de ce caractère est 12345. 72 00:04:12,630 --> 00:04:16,140 >> Maintenant, à la semaine 0 et jusqu'à maintenant, nous n'avons pas vraiment pris en charge 73 00:04:16,140 --> 00:04:19,170 où les choses en mémoire sont stockées parce que nous avons l'habitude d'utiliser des symboles, 74 00:04:19,170 --> 00:04:22,540 les variables et les tableaux pour obtenir réellement à nos données. 75 00:04:22,540 --> 00:04:24,950 Mais à partir de lundi et d'autant plus aujourd'hui, vous allez maintenant avoir 76 00:04:24,950 --> 00:04:27,710 toutes les capacités expressives avec plus d'écrire des programmes 77 00:04:27,710 --> 00:04:31,330 pour vraiment gérer la mémoire de l'ordinateur comme bon vous semble, 78 00:04:31,330 --> 00:04:33,720 à des fins bonnes et mauvaises, 79 00:04:33,720 --> 00:04:39,620 insectes étant un résultat très fréquent à ce stade de l'apprentissage de ce genre de choses. 80 00:04:39,620 --> 00:04:42,460 Mais qu'est-ce que cela signifie vraiment d'être un char *? 81 00:04:42,460 --> 00:04:46,140 Allons de l'avant vers - et nous y reviendrons Binky comme promis aujourd'hui. 82 00:04:46,140 --> 00:04:48,670 Allons-y d'un exemple simple ici. 83 00:04:48,670 --> 00:04:53,060 Permettez-moi de sauver ce fichier comme compare.c, et laissez-moi juste un peu de code modèle ici 84 00:04:53,060 --> 00:05:00,490 donc inclure stdio.h, permettez-moi de me donner incluent cs50.h. Je vais faire un zoom avant là-haut. 85 00:05:00,490 --> 00:05:05,850 Permettez-moi de commencer à écrire int main, main (void), et maintenant je veux faire quelque chose comme ceci: 86 00:05:05,850 --> 00:05:13,520 printf ("Donnez-moi une chaîne:") et puis je vais utiliser la chaîne s se GetString 87 00:05:13,520 --> 00:05:16,750 pour obtenir une chaîne de l'utilisateur, alors je vais demander à l'utilisateur pour un autre. 88 00:05:16,750 --> 00:05:21,870 («Donne-moi une autre chaîne:") et je vais les poser à GetString pour l'obtenir. 89 00:05:21,870 --> 00:05:27,020 Je vais l'appeler parce que t t vient après s et s est un joli nom pour une chaîne si elle est assez générique. 90 00:05:27,020 --> 00:05:30,030 Donc GetString, et maintenant je veux juste faire un test de cohérence et je vais dire 91 00:05:30,030 --> 00:05:39,770 if (s == t) alors je vais juste dire à l'utilisateur printf ("Vous avez tapé la même chose \ n"); 92 00:05:39,770 --> 00:05:45,520 sinon je vais imprimer quelque chose comme ("Vous avez saisi quelque chose de différent! \ n") 93 00:05:45,520 --> 00:05:48,460 ou quelle que soit la peine sera. Donc, quelque chose comme ça. 94 00:05:48,460 --> 00:05:52,200 Puis, comme d'habitude, je vais retourner 0, ce qui signifie tout simplement que rien n'est arrivé, 95 00:05:52,200 --> 00:05:54,400 et je vais aller de l'avant et de compiler et exécuter ce programme. 96 00:05:54,400 --> 00:05:56,540 >> Mais lundi, nous avons couru ce programme, 97 00:05:56,540 --> 00:06:00,420 et effectivement a dit que BONJOUR BONJOUR n'est pas et n'est pas ADIEU AU REVOIR. 98 00:06:00,420 --> 00:06:03,140 Le comportement que nous avons vu était un peu plus comme ça. 99 00:06:03,140 --> 00:06:11,450 Laissez-moi aller dans mon répertoire source, effectuez un zoom avant ici, et faisons-faire comparer. 100 00:06:11,450 --> 00:06:14,570 Compilé bien. Permettez-moi de courir comparer. Donnez-moi une corde: BONJOUR. 101 00:06:14,570 --> 00:06:16,300 Donnez-moi une autre chaîne: BONJOUR. 102 00:06:16,300 --> 00:06:18,000 Vous avez tapé quelque chose de différent! 103 00:06:18,000 --> 00:06:22,650 Eh bien, laissez-moi essayer quelque chose de simple comme 50, 50. Vous avez tapé quelque chose de différent! 104 00:06:22,650 --> 00:06:25,740 Salut, salut. Il apparaît donc clairement, quelque chose qui se passe ici. 105 00:06:25,740 --> 00:06:28,440 Mais ce qui était l'explication de pourquoi? 106 00:06:28,440 --> 00:06:33,850 Apparemment, la ligne 12 est complètement dysfonctionnel. 107 00:06:34,300 --> 00:06:39,430 Quel est le problème fondamental? Ouais. >> [L'élève] C'est en comparant les adresses. 108 00:06:39,430 --> 00:06:41,850 Oui, exactement. Il s'agit en fait de comparer les adresses 109 00:06:41,850 --> 00:06:44,580 dans lequel BONJOUR BONJOUR et sont stockés. 110 00:06:44,580 --> 00:06:48,290 Ce n'est pas de comparer les lettres BONJOUR, encore et encore, 111 00:06:48,290 --> 00:06:52,370 parce que ce qui s'est réellement passé, tout ce temps, nous avons utilisé GetString - 112 00:06:52,370 --> 00:06:56,130 Ce tableau est à nouveau la mémoire de notre ordinateur, 113 00:06:56,130 --> 00:07:00,100 et disons que j'appelle GetString après avoir déclaré une variable s. 114 00:07:00,100 --> 00:07:01,930 Qu'est-ce que ma mémoire ressembler? 115 00:07:01,930 --> 00:07:07,070 Nous allons arbitrairement que l ressemble à ceci. Il s'agit d'un carré. 116 00:07:07,070 --> 00:07:09,040 Et à peu près n'importe quel moment j'ai dessiné un morceau de la mémoire sur l'écran 117 00:07:09,040 --> 00:07:12,860 si c'est 32 bits Je dessine des carrés comme celui-ci car en effet dans l'appareil, 118 00:07:12,860 --> 00:07:17,380 un pointeur, d'une adresse, est de 32 bits. C'est la même chose comme un int. 119 00:07:17,380 --> 00:07:19,420 Cela peut varier en fonction sur le système informatique. 120 00:07:19,420 --> 00:07:24,630 Ceux d'entre vous qui sont vaguement familier avec le fait que votre Mac ou votre PC est de 64 bits, 121 00:07:24,630 --> 00:07:28,120 qui désigne en fait que votre ordinateur utilise des pointeurs 64 bits, 122 00:07:28,120 --> 00:07:33,730 Adresses 64 bits, et parmi les bons côtés de ce que sont vos ordinateurs 123 00:07:33,730 --> 00:07:35,560 RAM peut avoir beaucoup plus que jadis. 124 00:07:35,560 --> 00:07:39,240 Longue histoire courte, retour dans la journée quand les ordinateurs utilisés uniquement 32 bits 125 00:07:39,240 --> 00:07:42,740 pour représenter les adresses, le plus grand nombre d'octets que vous pourrait représenter 126 00:07:42,740 --> 00:07:46,280 Dans cette affaire, si vous avez 32 bits? 127 00:07:46,280 --> 00:07:49,590 Donc, 4 milliards, à droite, parce que 2 à la 32 est de 4 milliards d'euros. 128 00:07:49,590 --> 00:07:51,370 Ce nombre a été récurrents dans le cours. 129 00:07:51,370 --> 00:07:55,240 >> Donc, si vous avez seulement 32 bits, le nombre le plus élevé vous pouvez compter pour à peu près 4 milliards. 130 00:07:55,240 --> 00:07:58,750 Mais c'était une limitation fondamentale des ordinateurs jusqu'à il ya quelques années 131 00:07:58,750 --> 00:08:01,180 parce que si vous ne pouvez compter jusqu'à 4 milliards de dollars 132 00:08:01,180 --> 00:08:05,270 ce n'est pas grave si vous achetez 8 Go de RAM ou même 5 giga-octets de RAM; 133 00:08:05,270 --> 00:08:07,780 vous ne pouvez pas compter que haute, il était donc inutile. 134 00:08:07,780 --> 00:08:11,430 Vous pouvez uniquement accéder les 3 ou 4 premiers gigaoctets de mémoire de votre ordinateur. 135 00:08:11,430 --> 00:08:14,410 C'est moins un problème maintenant, et vous pouvez acheter MacBook Pro et Dells 136 00:08:14,410 --> 00:08:17,680 avec 8 Go de RAM ou même plus ces jours-ci. 137 00:08:17,680 --> 00:08:24,100 Mais si je allouer tout simplement à ce programme un pointeur, un pointeur appelé s, 138 00:08:24,100 --> 00:08:28,370 il pourrait ressembler à ceci sur l'écran car en effet nous avons besoin de peler cette couche. 139 00:08:28,370 --> 00:08:33,520 Je garde chaîne de soi, mais à partir de lundi, la chaîne est vraiment char *, 140 00:08:33,520 --> 00:08:35,590 l'adresse d'un personnage. 141 00:08:35,590 --> 00:08:39,280 Prenons donc cette roue d'entraînement hors même si nous allons continuer à utiliser GetString pour l'instant. 142 00:08:39,280 --> 00:08:42,600 J'ai donc déclaré l'art, et c'est un morceau de mémoire, 32 bits. 143 00:08:42,600 --> 00:08:47,370 Ce qui est ici en mémoire par défaut? >> [Réponse de l'élève inaudible] 144 00:08:47,370 --> 00:08:50,040 Qu'est-ce que c'est? >> [L'élève] Garbage. Garbage >>. Exactement. 145 00:08:50,040 --> 00:08:54,610 Si vous le programmeur ne pas mettre une valeur dans une variable, qui sait ce que c'est? 146 00:08:54,610 --> 00:08:57,990 Parfois, vous avez de la chance et il est 0, ce qui est une sorte de gentil, propre valeur par défaut, 147 00:08:57,990 --> 00:09:00,310 mais comme nous l'avons vu lundi, il est parfois complètement absurde, 148 00:09:00,310 --> 00:09:04,130 certains très gros chiffre positif ou négatif qui est venu d'où? 149 00:09:05,350 --> 00:09:07,010 Ouais. >> [L'élève] La fonction auparavant. Ouais >>. 150 00:09:07,010 --> 00:09:10,170 >> Souvent, la fonction qui m'a appelé avant car rappelez-vous, 151 00:09:10,170 --> 00:09:13,920 que vous appelez des fonctions de la mémoire, qu'ils occupent un espace de plus en plus de bas en haut, 152 00:09:13,920 --> 00:09:17,040 et dès que la fonction retourne, que la mémoire se réutilisées 153 00:09:17,040 --> 00:09:20,890 par le gars à côté qui est appelée, qui utilise votre même tranche de mémoire. 154 00:09:20,890 --> 00:09:23,450 Et si vous avez des ordures gauche là-bas, les valeurs précédentes, 155 00:09:23,450 --> 00:09:28,190 on pourrait confondre s comme ayant une certaine valeur, alors qu'en réalité nous n'avons pas mis quelque chose là-bas. 156 00:09:28,190 --> 00:09:30,960 Donc, notre mémoire à ce stade ressemble à ceci. 157 00:09:30,960 --> 00:09:36,030 Maintenant, sur le côté droit de la ligne 7 que nous appelons GetString, 158 00:09:36,030 --> 00:09:40,150 que nous avons fait depuis des semaines, mais ce qui est GetString vraiment? 159 00:09:40,150 --> 00:09:43,350 GetString rédigé par le personnel CS50 est un peu intelligente 160 00:09:43,350 --> 00:09:46,500 en ce que, dès que l'utilisateur commence à taper les touches et frappe sur Entrée, 161 00:09:46,500 --> 00:09:50,010 GetString chiffres sur le nombre de frappes ont fait le succès utilisateur, 162 00:09:50,010 --> 00:09:53,360 combien de caractères dois-je allouer de RAM pour. 163 00:09:53,360 --> 00:09:55,660 Et où que la RAM vient, qui sait? 164 00:09:55,660 --> 00:09:58,930 C'est quelque part dans 2 gigaoctets de votre ordinateur ou autres joyeusetés de la mémoire. 165 00:09:58,930 --> 00:10:05,200 Mais supposons que l'ordinateur trouve un espace pour le mot BONJOUR ici. 166 00:10:05,200 --> 00:10:08,710 Le mot que j'ai tapé est H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Et si nous tirons cela comme une séquence de caractères, on pourrait en tirer comme ça. 168 00:10:13,510 --> 00:10:17,860 Mais je dois faire 1 chose supplémentaire. Ce qui appartient à la fin de n'importe quelle chaîne en C? 169 00:10:17,860 --> 00:10:20,710 Le caractère nul, que nous écrivons \ 0. 170 00:10:20,710 --> 00:10:23,980 C'est techniquement le chiffre 0, mais la barre oblique inverse rend d'autant plus claire 171 00:10:23,980 --> 00:10:28,150 ce qui est littéralement le nombre 0, le nombre entier 0; 172 00:10:28,150 --> 00:10:32,440 il ne s'agit pas, par exemple, entre guillemets, 0 que vous pouvez taper au clavier. 173 00:10:32,440 --> 00:10:33,940 Il s'agit donc d'BONJOUR. 174 00:10:33,940 --> 00:10:36,350 >> Et qu'est-ce que nous disons, lundi, que comme une fonction GetString 175 00:10:36,350 --> 00:10:39,580 est en fait le retour de toutes ces semaines? 176 00:10:39,580 --> 00:10:43,960 Ce n'est pas de retourner une chaîne en soi, car qui n'a pas vraiment avoir un sens 177 00:10:43,960 --> 00:10:47,710 parce que les chaînes n'existent pas. Ils sont en quelque sorte d'une fabrication dans la bibliothèque CS50. 178 00:10:47,710 --> 00:10:51,300 Ce qui est vraiment une chaîne, plus techniquement? >> [L'élève] C'est le premier caractère. 179 00:10:51,300 --> 00:10:55,950 Exactement. C'est tout simplement l'adresse du premier caractère que l'utilisateur a tapé po 180 00:10:55,950 --> 00:11:02,810 Donc, si mon mot BONJOUR il finit à 123 numéro de l'octet, puis à l'octet numéro 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, et ainsi de suite, si je viens nombre de 0 octets mes sur place, 182 00:11:08,320 --> 00:11:12,650 ce qui compte vraiment est de retour GetString est littéralement le numéro 123. 183 00:11:12,650 --> 00:11:19,270 Alors, que se mettre dans s est le numéro 123, pas la lettre H, et non pas le mot BONJOUR, 184 00:11:19,270 --> 00:11:23,130 tout simplement l'adresse à laquelle je peux trouver la première lettre du BONJOUR. 185 00:11:23,130 --> 00:11:26,500 Mais cela ne semble pas suffisant. Je vous ai demandé pour une chaîne, pas un personnage. 186 00:11:26,500 --> 00:11:32,970 Alors, comment pouvons-nous ou que l'ordinateur sait que ELLO sorte de venir avec le H? 187 00:11:35,760 --> 00:11:37,460 Quel est le type d'accord que nous avons? Ouais. 188 00:11:37,460 --> 00:11:40,100 [L'élève] Il se tient disant de trouver quelques autres personnages. >> Exactement. 189 00:11:40,100 --> 00:11:44,570 >> Il ya cette convention humain-ordinateur de sorte que lorsque vous traitez avec des cordes, 190 00:11:44,570 --> 00:11:49,410 autrement connu maintenant comme des étoiles de type char, il vous suffit de comprendre 191 00:11:49,410 --> 00:11:54,350 où la fin de chaque chaîne dans la vie est vraiment juste par itération sur elle avec une boucle for, 192 00:11:54,350 --> 00:11:57,820 une boucle while, que ce soit, de sorte que lorsque vous trouvez la fin de la chaîne 193 00:11:57,820 --> 00:12:02,160 maintenant vous pouvez en déduire que, oh, le mot entier était BONJOUR. 194 00:12:02,160 --> 00:12:04,820 Ceux d'entre vous ayant une expérience préalable de la programmation en Java savez peut-être 195 00:12:04,820 --> 00:12:09,880 vous pouvez simplement appeler. longueur et dans d'autres langues, vous pouvez appeler la longueur ou similaire. 196 00:12:09,880 --> 00:12:14,060 C'est parce que dans beaucoup de langues, spécialement choses appelées langages orientés objet, 197 00:12:14,060 --> 00:12:18,580 la longueur de ce genre est d'encapsuler à l'intérieur de la pièce de données elles-mêmes, 198 00:12:18,580 --> 00:12:24,000 Tout comme nous encapsulées ID et les noms et les maisons à l'intérieur d'un étudiant lundi. 199 00:12:24,000 --> 00:12:28,700 Mais C est beaucoup plus faible. Il n'y a pas d'objets ou de classes, si vous avez entendu ces termes auparavant. 200 00:12:28,700 --> 00:12:31,490 Tout ce que vous avez vraiment adresses mémoire. 201 00:12:31,490 --> 00:12:35,540 Il s'agit donc en quelque sorte la manière démodée de représenter des structures de données intéressantes. 202 00:12:35,540 --> 00:12:38,760 Vous avez une valeur de départ, comme l'adresse du premier caractère 203 00:12:38,760 --> 00:12:42,340 et puis juste une convention arbitraire que tout le monde s'accorde à suivre. 204 00:12:42,340 --> 00:12:46,420 Alors, comment est la longueur de chaîne en œuvre, at-on proposer? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, que certains d'entre vous ont utilisé à quelques reprises. C'est assez simple, non? 206 00:12:51,360 --> 00:12:53,060 C'est comme si 2 lignes de code. 207 00:12:53,060 --> 00:12:56,140 C'est à peu près une boucle pour en quelque sorte, peut-être avec une variable locale supplémentaire. 208 00:12:56,140 --> 00:13:00,540 Mais strlen vient de prendre un pointeur et puis commencer à chercher \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Et dès qu'il le trouve, il peut renvoyer le nombre total d'étapes qu'il a prises dans cette chaîne. 210 00:13:05,190 --> 00:13:07,150 Nous pouvons donc en déduire ce qui se passe à côté. 211 00:13:07,150 --> 00:13:11,850 Supposons alors je déclare t comme je l'ai fait dans la ligne 10. 212 00:13:11,850 --> 00:13:14,280 Il s'agit d'une valeur ordures. Qui sait d'abord? 213 00:13:14,280 --> 00:13:18,490 Mais sur le côté droit de la ligne de 10 Je vous appelle à nouveau GetString. 214 00:13:18,490 --> 00:13:20,050 Qui sait où cela finit? 215 00:13:20,050 --> 00:13:23,830 Nous allons arbitrairement que le système d'exploitation trouvé de place pour elle en venant ici. 216 00:13:23,830 --> 00:13:28,610 Il se trouve que par hasard taper H-E-L-L-O à nouveau, 217 00:13:28,610 --> 00:13:31,260 et ainsi nous pouvons tirer le même genre de photo. 218 00:13:31,260 --> 00:13:34,290 Mais le fait que j'ai redessiné cette image est délibéré 219 00:13:34,290 --> 00:13:37,720 parce que c'est une. différente BONJOUR que celui-ci 220 00:13:37,720 --> 00:13:43,920 Alors, voici ce qui pourrait être l'emplacement 456, c'est 457, et ainsi de suite. 221 00:13:43,920 --> 00:13:47,170 Alors, que se mettre là où le point d'interrogation était une fois? 222 00:13:47,170 --> 00:13:50,190 Dans ce cas 456. 223 00:13:50,190 --> 00:13:53,540 Nous détectons ces nombres arbitrairement parce que vraiment compter d'aujourd'hui 224 00:13:53,540 --> 00:13:57,110 nous n'allons pas nous préoccuper du bien de ce que l'adresse de quelque chose est. 225 00:13:57,110 --> 00:14:02,690 Tout ce que nous importe est que l'on peut trouver l'adresse d'un élément de données comme BONJOUR. 226 00:14:02,690 --> 00:14:07,100 >> Alors, vraiment ce que la plupart des gens en informatique quand on parle des adresses mémoire 227 00:14:07,100 --> 00:14:10,210 et de parler de pointeurs spécifiquement, 228 00:14:10,210 --> 00:14:14,220 plutôt que de déterminer la peine sur 123 - qui se soucie où ce genre de choses est en fait, 229 00:14:14,220 --> 00:14:17,440 nous savons juste qu'il est à une adresse numérique - 230 00:14:17,440 --> 00:14:22,180 nous simplifions le monde et vous dire que s est pointée à ce personnage 231 00:14:22,180 --> 00:14:25,080 et t est orientée vers ce caractère. 232 00:14:25,080 --> 00:14:27,430 Et le fait que c'est une flèche est tout à fait intentionnelle 233 00:14:27,430 --> 00:14:31,610 parce que littéralement maintenant l'art est dirigée vers H et t est dirigée vers l'autre H 234 00:14:31,610 --> 00:14:34,720 car à la fin de la journée, il n'a pas d'importance ce que l'adresse est, 235 00:14:34,720 --> 00:14:40,240 mais il est important que nous ayons la capacité d'exprimer cette adresse avec un morceau de code. 236 00:14:40,240 --> 00:14:42,730 Nous n'avons pas vraiment manipulé ces adresses pour l'instant 237 00:14:42,730 --> 00:14:47,770 alors nous verrons où nous pouvons intervenir et de régler des choses avec des pointeurs, 238 00:14:47,770 --> 00:14:52,030 mais pour l'instant la ligne 12 littéralement quelles sont les valeurs que nous comparant 239 00:14:52,030 --> 00:14:55,500 selon cette histoire à la ligne 12? 240 00:14:56,570 --> 00:15:01,290 Nous disons est de 123 à 456 égale égale? Et ce n'est certainement pas le cas. 241 00:15:01,290 --> 00:15:05,320 Et même conceptuellement, ce pointeur n'est certainement pas la même chose que ce 242 00:15:05,320 --> 00:15:09,500 parce que vous avez appelé GetString deux fois, et GetString ne cherche pas à être super intelligent, 243 00:15:09,500 --> 00:15:12,470 il ne cherche pas à réaliser, oh, vous avez tapé BONJOUR il ya 5 minutes; 244 00:15:12,470 --> 00:15:15,090 permettez-moi de vous donner le pointeur de même que je vous ai donné plus tôt, 245 00:15:15,090 --> 00:15:18,450 il alloue simplement un nouveau morceau de la mémoire à chaque fois que vous l'appelez. 246 00:15:18,450 --> 00:15:20,350 >> Alors, comment pouvons-nous résoudre ce problème? 247 00:15:20,350 --> 00:15:24,270 Si je veux plus haut niveau pour comparer les chaînes BONJOUR BONJOUR et - 248 00:15:24,270 --> 00:15:28,680 Je ne se soucient pas des pointeurs - comment puis-je faire pour répondre à la question, 249 00:15:28,680 --> 00:15:31,980 l'utilisateur ne tapez la même chose? Ce qui est nécessaire ici? Ouais. 250 00:15:31,980 --> 00:15:35,200 [L'élève] Utiliser une fonction. >> Je peux utiliser une fonction hors de la boîte. 251 00:15:35,200 --> 00:15:38,170 Je peux utiliser une fonction appelée strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 juste la version abrégée de dire comparaison de chaîne. 253 00:15:41,190 --> 00:15:45,070 Et si nous entrons dans, par exemple, comparer les 2, qui est l'un des documents d'aujourd'hui, 254 00:15:45,070 --> 00:15:46,690 Je fais exactement cela. 255 00:15:46,690 --> 00:15:51,750 J'ai gardé tout le reste la même chose de la ligne 1 à 26 ou plus, 256 00:15:51,750 --> 00:15:54,360 et maintenant constater cette partie a changé un peu. 257 00:15:54,360 --> 00:15:57,690 Ignorons ligne 28 pour un moment et se concentrer uniquement sur celui-ci. 258 00:15:57,690 --> 00:16:00,410 Qu'avons-nous dit lundi que str comparaison fait? 259 00:16:00,410 --> 00:16:05,200 Il gère le processus de prise de 2 pointeurs, s et t dans ce cas, 260 00:16:05,200 --> 00:16:08,480 sorte de quasi-mettre le doigt sur ces 2 lettres, 261 00:16:08,480 --> 00:16:11,530 et ce qu'il doit faire quelque chose comme une boucle while ou une boucle for, 262 00:16:11,530 --> 00:16:16,050 et il dit sont-ils les mêmes? Si c'est le cas, il déplace les doigts ou les pointeurs vers l'avant. 263 00:16:16,050 --> 00:16:17,970 S'agit-il de la même chose, ces mêmes l', ceux-ci, de même 264 00:16:17,970 --> 00:16:22,710 ces mêmes l', ces mêmes l'? Et ooh, je suis à la fin de la chaîne à la fois s et t. 265 00:16:22,710 --> 00:16:26,780 Je n'ai pas trouvé de contradictions. Oui, ces chaînes sont identiques. 266 00:16:26,780 --> 00:16:31,940 Et qu'est-ce que str comparer le rendement si 2 chaînes sont identiques, apparemment? Zéro. 267 00:16:31,940 --> 00:16:35,900 Donc 0 est bon dans ce cas parce que si elle renvoie -1 ou +1, 268 00:16:35,900 --> 00:16:40,560 cela signifie que s arrive juste à venir avant ou après alphabétique t t. 269 00:16:40,560 --> 00:16:43,760 Et pourquoi cela serait-il utile d'avoir une fonction qui vous indique quelle corde vient avant 270 00:16:43,760 --> 00:16:46,720 ou après dans un dictionnaire? 271 00:16:46,720 --> 00:16:48,740 [L'élève] Recherche. >> Recherche et tri. 272 00:16:48,740 --> 00:16:51,730 >> Ainsi, vous pouvez faire des choses comme binaire de recherche ou de tri bulle ou le tri par fusion 273 00:16:51,730 --> 00:16:53,230 où il faut comparer des choses. 274 00:16:53,230 --> 00:16:56,420 Jusqu'à présent, nous avons sorte de couper quelques virages et ne parlait que le tri 275 00:16:56,420 --> 00:16:59,430 dans le cadre de chiffres parce que c'est agréable et facile de parler, 276 00:16:59,430 --> 00:17:02,430 mais vous pouvez certainement comparer des chaînes, la pomme et la banane, 277 00:17:02,430 --> 00:17:05,349 parce que si la pomme est connu pour se présenter devant la banane, de même, 278 00:17:05,349 --> 00:17:09,319 pouvez vous déplacer autour de chaînes dans la mémoire comme Rob a fait avec tri par fusion dans la vidéo 279 00:17:09,319 --> 00:17:15,880 et nous avons fait ici sur scène avec tri par sélection, le tri par insertion et tri à bulles. 280 00:17:15,880 --> 00:17:18,710 Alors, où pouvons-nous aller? Essayons ceci. 281 00:17:18,710 --> 00:17:23,980 Disons sorte de leçon oublier que pendant un moment et essayez-le maintenant et copier 1.c faire ce qui suit. 282 00:17:23,980 --> 00:17:26,800 Dans la ligne 21 que je dis quelque chose d'impression, 283 00:17:26,800 --> 00:17:28,520 alors je me fais une chaîne de l'utilisateur, 284 00:17:28,520 --> 00:17:30,690 alors je vérifie cela. 285 00:17:30,690 --> 00:17:33,620 Nous n'avons pas vraiment eu cette habitude encore, mais nous allons maintenant le faire. 286 00:17:33,620 --> 00:17:40,990 Nous allons réellement décoller cette couche. C'est vraiment char *. Ce mec est vraiment char *. 287 00:17:40,990 --> 00:17:45,690 Alors qu'est-ce que cela signifie d'être de vérifier si s == NULL? 288 00:17:45,690 --> 00:17:48,380 Il s'avère que lorsque vous appelez une fonction comme GetString 289 00:17:48,380 --> 00:17:51,540 ou plus généralement il suffit de demander un ordinateur pour vous donner un peu de mémoire, 290 00:17:51,540 --> 00:17:53,030 quelque chose pourrait mal tourner. 291 00:17:53,030 --> 00:17:56,630 Vous pourriez être fou et demander à l'ordinateur d'un téraoctet de mémoire 292 00:17:56,630 --> 00:18:01,780 en demandant des milliards d'octets de mémoire qui vient n'existent pas dans l'ordinateur, 293 00:18:01,780 --> 00:18:05,130 mais les fonctions GetString et d'autres besoin d'un moyen de crier après vous 294 00:18:05,130 --> 00:18:06,820 si vous avez demandé trop. 295 00:18:06,820 --> 00:18:10,450 Et la façon dont cela est GetString si vous avez demandé plus de mémoire 296 00:18:10,450 --> 00:18:14,250 que ce qui est disponible dans l'ordinateur, même si c'est super, super faible probabilité 297 00:18:14,250 --> 00:18:17,730 car aucun d'entre nous vont taper un billion de caractères, puis appuyez sur Entrée, 298 00:18:17,730 --> 00:18:21,980 mais faible probabilité que cela puisse être, je veux toujours vérifier juste au cas, 299 00:18:21,980 --> 00:18:26,120 et la valeur particulière que les rendements GetString, réponse, et d'autres fonctions 300 00:18:26,120 --> 00:18:30,630 si quelque chose s'est mal passé est NULL dans tous les bouchons. 301 00:18:30,630 --> 00:18:36,520 >> Et qu'est-ce que NULL? NULL se trouve juste à représenter un pointeur. C'est l'adresse 0 de la mémoire. 302 00:18:36,520 --> 00:18:40,800 Le monde a décidé de façon arbitraire, si ce n'est la mémoire de mon ordinateur - vous savez quoi? - 303 00:18:40,800 --> 00:18:46,260 nous allons voler à seulement 1 octet de mémoire à chaque ordinateur, et c'est l'emplacement 0. 304 00:18:46,260 --> 00:18:49,560 Nous allons lui donner un surnom NULL, et nous allons promettre 305 00:18:49,560 --> 00:18:52,660 que nous ne pourrons jamais réellement mis données réelles il 306 00:18:52,660 --> 00:18:56,770 parce que nous devons arbitrairement une valeur spéciale, 0, NULL aka, 307 00:18:56,770 --> 00:19:00,230 afin que nous puissions crier après les utilisateurs, si quelque chose va mal. 308 00:19:00,230 --> 00:19:03,590 Sinon, vous pourriez ne sais pas 0 signifie mettre quelque chose ici 309 00:19:03,590 --> 00:19:05,490 ou faut-il dire quelque chose s'est mal passé? 310 00:19:05,490 --> 00:19:09,190 Nous devons tous convenir que cela ne signifie rien NULL est renvoyé, 311 00:19:09,190 --> 00:19:11,700 aucune adresse réelle a été retourné. 312 00:19:11,700 --> 00:19:15,210 Maintenant, ici, je ne fais que mon adoptant la convention de l'homme que je retourne 1 de principal 313 00:19:15,210 --> 00:19:17,040 si quelque chose se passe mal. 314 00:19:17,040 --> 00:19:20,650 C'est parce que la convention retour principal est de retourner 0 si bonne, 315 00:19:20,650 --> 00:19:22,990 1 ou une autre valeur si mauvais. 316 00:19:22,990 --> 00:19:28,200 Mais GetString et toute fonction qui traite des rendements mémoire NULL si quelque chose va mal. 317 00:19:28,200 --> 00:19:33,480 >> D'accord. Donc, malheureusement, ligne 27, super simple soit-il, ne tient absolument pas copier la chaîne. 318 00:19:33,480 --> 00:19:35,740 Pourquoi? Nous pouvons voir cela comme suit. 319 00:19:35,740 --> 00:19:40,120 Je réclame en ligne 27 pour faire une copie de l'article et de l'appeler t. 320 00:19:40,120 --> 00:19:45,790 Donc, je ne demande pas à l'utilisateur pour 2 cordes cette fois-ci, je dis juste que la valeur de l'art 321 00:19:45,790 --> 00:19:47,870 devrait être mis en t ainsi. 322 00:19:47,870 --> 00:19:52,890 Alors maintenant, juste pour montrer comment cela est cassé, dans la ligne 29 en avant ce que je fais? 323 00:19:52,890 --> 00:19:56,980 D'abord je vérifie si la longueur de t est supérieure à 0. 324 00:19:56,980 --> 00:19:59,330 Il ya une chaîne de là. L'utilisateur a tapé quelque chose po 325 00:19:59,330 --> 00:20:03,410 Quelle est la ligne 32 fait, apparemment? 326 00:20:03,410 --> 00:20:08,910 [Réponse de l'élève inaudible] droit >>. Vous pouvez sorte de le déduire de ce que j'ai dit qu'il fait. 327 00:20:08,910 --> 00:20:13,200 Mais techniquement, ce qui est ce que ça fait? t [0] représente quoi? 328 00:20:13,200 --> 00:20:15,140 [L'élève] Le caractère 0e. >> [Malan] Le caractère 0e. 329 00:20:15,140 --> 00:20:19,620 Ou, plus humain, le premier caractère de t, quelle qu'elle soit, peut-être H dans ce cas. 330 00:20:19,620 --> 00:20:24,990 Et toupper fait ce qu'il dit. Il capitalise le caractère zéro de t et il le change. 331 00:20:24,990 --> 00:20:28,430 Donc, cela signifie prendre le caractère zéro de t, faire en majuscules, 332 00:20:28,430 --> 00:20:30,320 et remettez-le à cet endroit même. 333 00:20:30,320 --> 00:20:35,540 Donc, si je tape bonjour en minuscules, ce qui devrait changer le h minuscule pour un grand H. 334 00:20:35,540 --> 00:20:41,400 Mais le problème est que dans les lignes 35 et 36 ce que je m'apprête à faire est d'imprimer pour nous s et t. 335 00:20:41,400 --> 00:20:43,120 Et quel est votre intuition? 336 00:20:43,120 --> 00:20:47,250 Que vais-je réellement aller voir si j'ai tapé dans bonjour en minuscules? 337 00:20:47,250 --> 00:20:52,280 Qu'est-ce qui va se faire imprimer? >> [Réponse de l'élève inaudible] >> Qu'est-ce que c'est? 338 00:20:52,280 --> 00:20:58,360 [L'élève] Big H et le reste de petite taille. Le grand H >> et le reste petite pour laquelle, s ou t? 339 00:20:58,360 --> 00:21:03,170 [L'élève] Les deux. Les deux >>. Exactement. Alors voyons voir ce qui se passe ici. 340 00:21:03,170 --> 00:21:08,380 >> Permettez-moi aller de l'avant et de compiler ce. C'est copy1, alors assurez-copy1. Très bien. 341 00:21:08,380 --> 00:21:14,840 Effectuer un zoom avant Laisse-moi aller de l'avant et de fonctionner copy1, Entrée, Dis quelque chose: bonjour en minuscules. 342 00:21:14,840 --> 00:21:19,570 Il capitalisé la copie, mais il a apparemment capitalisé l'original ainsi, 343 00:21:19,570 --> 00:21:22,070 parce que ce qui se passe aujourd'hui dans cette histoire? 344 00:21:22,070 --> 00:21:27,030 Dans la ligne 27 je n'ai pas vraiment semble être la copie la chaîne, 345 00:21:27,030 --> 00:21:30,450 mais même si vous avez pu intuitivement espérer que ce soit le cas, 346 00:21:30,450 --> 00:21:33,680 si vous pensez à cette image, ce qui est vraiment ce que j'ai fait? 347 00:21:33,680 --> 00:21:35,410 La moitié de l'image est la même. 348 00:21:35,410 --> 00:21:39,390 Donc, nous allons revenir à temps pour que t n'existe pas encore dans l'histoire. 349 00:21:39,390 --> 00:21:43,160 S peut exister dans l'histoire, mais nous allons en minuscules bonjour pour le moment. 350 00:21:43,160 --> 00:21:46,710 Permettez-moi de corriger ce que j'ai réellement tapé po 351 00:21:46,710 --> 00:21:51,280 Dans ce cas là, nous avons h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Nous allons dessiner comme une séquence de caractères, mettre mes lignes de séparation ici et mon \ 0. 353 00:21:58,050 --> 00:22:05,980 C'est donc là que nous sommes dès que la ligne 1 à 24-ish, plus ou moins, ont exécuté. 354 00:22:05,980 --> 00:22:07,800 Telle est l'image de ma mémoire. 355 00:22:07,800 --> 00:22:10,800 Quand j'arrive à la ligne 27, ce qui se passe? 356 00:22:10,800 --> 00:22:14,730 Tout comme avant, je reçois un pointeur, ce que je vais dessiner comme cette place. 357 00:22:14,730 --> 00:22:19,740 C'est ce qu'on appelle t. Et ce qui est sa valeur par défaut? Qui sait? Certains valeur des ordures. 358 00:22:19,740 --> 00:22:22,060 >> Donc, je vais abstraite qui loin comme un point d'interrogation. 359 00:22:22,060 --> 00:22:27,670 Et dès que le côté droit de la ligne 27 exécute, que dois-je mettre à l'intérieur de la t? 360 00:22:27,670 --> 00:22:30,770 La même chose qui se trouve dans l'art. 361 00:22:30,770 --> 00:22:34,120 Donc, si nous pendant un moment retirer cette abstraction de la flèche et nous disons: 362 00:22:34,120 --> 00:22:40,330 oh, c'est l'adresse de chargement de mémoire 123, quand vous dites t devient s, point-virgule, 363 00:22:40,330 --> 00:22:42,700 vous êtes littéralement mettre 123 ici. 364 00:22:42,700 --> 00:22:45,200 Maintenant, si nous sorte de simplifier notre monde nouveau avec des photos, 365 00:22:45,200 --> 00:22:48,750 ce que vous avez vraiment fait est simplement ajouté une autre flèche à votre monde 366 00:22:48,750 --> 00:22:52,910 qui est orienté de t à la même chaîne exacte. 367 00:22:52,910 --> 00:22:59,730 Ainsi, lorsque dans la ligne 31 et 32, je fait aller sur le changement t [0], 368 00:22:59,730 --> 00:23:05,580 ce qui est t [0] apparemment synonyme de maintenant? s [0] 369 00:23:05,580 --> 00:23:07,030 Donc, c'est tout ce qui se passe. 370 00:23:07,030 --> 00:23:09,900 Et même si ce genre de sent un niveau un peu faible et mystérieux 371 00:23:09,900 --> 00:23:12,760 et ce genre d'envie peut-être intuitivement cela aurait juste travaillé - 372 00:23:12,760 --> 00:23:15,410 J'ai fait des copies de choses avant et juste que cela fonctionne - 373 00:23:15,410 --> 00:23:18,590 si vous avez réellement penser à ce qui est vraiment une chaîne, c'est un char *. 374 00:23:18,590 --> 00:23:21,700 Eh bien, qu'est-ce que c'est? C'est l'adresse d'un personnage. 375 00:23:21,700 --> 00:23:24,930 Alors peut-être qu'il est plus logique que lorsque vous essayez de faire quelque chose 376 00:23:24,930 --> 00:23:29,220 Super apparemment simple comme ça, tout ce que vous faites, c'est de copier une adresse mémoire. 377 00:23:29,220 --> 00:23:32,530 Vous n'êtes pas en train de faire quelque chose avec la chaîne elle-même. 378 00:23:32,530 --> 00:23:37,500 Donc, même si vous n'avez aucune idée comment vous pourriez résoudre ce problème dans le code, 379 00:23:37,500 --> 00:23:45,080 haut niveau, conceptuellement, que devons-nous faire pour rendre ta copie conforme de s, apparemment? 380 00:23:46,670 --> 00:23:48,820 Ouais. >> [L'élève] Donnez-lui un nouvel emplacement? >> Exactement. 381 00:23:48,820 --> 00:23:50,800 >> Nous devons donner à t de nouveaux locaux. 382 00:23:50,800 --> 00:23:55,230 Nous devons en quelque sorte créer un monde dans lequel nous obtenons un nouveau morceau de la mémoire, 383 00:23:55,230 --> 00:24:00,090 qui vient par souci de clarté, je vais dessiner juste en dessous de celui-ci, mais il n'a pas besoin d'être là. 384 00:24:00,090 --> 00:24:04,880 Mais il doit être de la même taille, donc je vais dessiner ces lignes verticales dans le même endroit. 385 00:24:04,880 --> 00:24:09,720 C'est très bien si ce n'est tous les déchets initialement. Qui sait ce qu'il y avait? 386 00:24:09,720 --> 00:24:13,850 Mais l'étape 1 va être me donner autant de mémoire que j'ai besoin 387 00:24:13,850 --> 00:24:18,630 pour s'adapter à une copie de bonjour, puis déterminer comment copier le h ici, l'e ici, 388 00:24:18,630 --> 00:24:20,390 L ici et ainsi de suite. 389 00:24:20,390 --> 00:24:24,880 Mais cela devrait déjà se sentir un peu évident, même si certains détails sont encore abstraite. 390 00:24:24,880 --> 00:24:28,690 Pour copier cette chaîne là-dedans, c'est juste une boucle for ou une boucle while 391 00:24:28,690 --> 00:24:31,580 ou quelque chose avec laquelle vous êtes devenu d'autant plus familier. 392 00:24:31,580 --> 00:24:35,970 Donc, nous allons essayer. Laissez-moi aller dans copy2.c. 393 00:24:35,970 --> 00:24:43,270 En copy2.c nous avons presque le même programme, sauf pour la ligne 27. 394 00:24:43,270 --> 00:24:47,260 Il semble un peu complexe, mais si nous le décomposer pièce par pièce, 395 00:24:47,260 --> 00:24:48,950 la partie gauche est la même. 396 00:24:48,950 --> 00:24:52,790 Char * t crée cette chose en mémoire, mais avec un point d'interrogation 397 00:24:52,790 --> 00:24:54,680 car nous n'avons aucune idée de ce qui est là par défaut. 398 00:24:54,680 --> 00:24:57,920 Sur le côté droit, nous sommes en train d'introduire une nouvelle fonction, malloc, 399 00:24:57,920 --> 00:25:00,640 allouer de la mémoire, donne-moi la mémoire, 400 00:25:00,640 --> 00:25:06,900 et il faut apparemment le nombre d'arguments, combien de choses à l'intérieur des parenthèses? 401 00:25:09,660 --> 00:25:12,130 J'ai entendu des murmures de 1 et 2, mais il est à seulement 1. 402 00:25:12,130 --> 00:25:15,320 Il n'ya pas de virgule, ce qui signifie qu'il est juste 1 chose à l'intérieur des parenthèses. 403 00:25:15,320 --> 00:25:17,720 Même s'il ya d'autres parenthèses, permettez-moi de souligner 404 00:25:17,720 --> 00:25:21,460 ce qui est à l'intérieur des parenthèses ultrapériphériques, et c'est cette expression: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Donc, si nous avons effectivement réfléchir à cela, cela veut dire me donner la longueur de l'art. 407 00:25:29,190 --> 00:25:34,440 Pourquoi suis-je, si, en ajoutant 1 sur la longueur? >> [Réponse de l'élève inaudible] 408 00:25:34,440 --> 00:25:40,200 Exactement. Nous avons besoin d'espace pour ce type à la queue, le sixième caractère qui n'a aucune signification en anglais 409 00:25:40,200 --> 00:25:42,250 mais il possède signification spéciale programmatique. 410 00:25:42,250 --> 00:25:46,800 >> Nous avons donc besoin d'un + 1 pour cette raison strlen renvoie l'attente humaine de longueur, 411 00:25:46,800 --> 00:25:50,890 bonjour ou 5, il ne vous donne pas le caractère nul supplémentaire. 412 00:25:50,890 --> 00:25:52,980 J'ai donc ajouter manuellement avec + 1. 413 00:25:52,980 --> 00:25:56,060 Et puis ceci, * taille (char), nous n'avons pas vu cela auparavant. 414 00:25:56,060 --> 00:25:57,480 Ce n'est pas techniquement une fonction. 415 00:25:57,480 --> 00:26:04,150 Il s'agit d'un mot clé spécial qui vous indique juste ce qui est de la taille d'un certain type de données sur un ordinateur 416 00:26:04,150 --> 00:26:06,980 car, en réalité, certains d'entre nous ont des ordinateurs 32 bits. 417 00:26:06,980 --> 00:26:10,900 J'ai un ordinateur assez vieux à la maison, et il utilise seulement 32 bits pour représenter les pointeurs. 418 00:26:10,900 --> 00:26:13,900 Et si j'ai fait la taille d'un type de données, il peut être de 32 bits. 419 00:26:13,900 --> 00:26:18,300 Mais si j'utilise mon nouvel ordinateur de fantaisie, je pourrais obtenir en retour une valeur de 64 bits 420 00:26:18,300 --> 00:26:20,510 quelque chose comme une adresse. 421 00:26:20,510 --> 00:26:25,400 Donc dans ce cas, juste pour être sûr super, nous n'allons pas à quelque chose de dur comme le code - 422 00:26:25,400 --> 00:26:28,740 eh bien, quelle est la taille d'un char d'après ce que nous avons dit jusqu'ici? 423 00:26:28,740 --> 00:26:34,450 Nous avons à peu près dit verbalement que c'est 1 octet, et c'est à peu près vrai dans l'ensemble. 424 00:26:34,450 --> 00:26:37,000 Mais encore une fois, les hypothèses ont tendance à être mauvais. 425 00:26:37,000 --> 00:26:40,850 Ils conduisent à des logiciels défectueux si les gens utilisent votre logiciel de façons que vous n'aviez pas l'intention. 426 00:26:40,850 --> 00:26:44,750 , Donc nous abstraire cet écart et un peu plus générique dire 427 00:26:44,750 --> 00:26:46,830 J'ai besoin de ces morceaux beaucoup de mémoire 428 00:26:46,830 --> 00:26:50,210 et chaque bloc de mémoire doit être équivalente à la taille d'un caractère, 429 00:26:50,210 --> 00:26:54,870 qui est en fait égal à 1 dans ce cas, mais c'est une façon plus générique de l'écrire. 430 00:26:54,870 --> 00:27:00,460 Donc, si le mot est bonjour, combien d'octets ne semble affecter à malloc bonjour? 431 00:27:00,460 --> 00:27:04,980 [L'élève] Six. Six >>. Exactement autant que nous avons des points d'interrogation sur l'écran. 432 00:27:04,980 --> 00:27:07,800 Et puis prendre un guess maintenant basé sur votre compréhension de GetString 433 00:27:07,800 --> 00:27:12,790 qu'est-ce que malloc probablement revenir? >> [L'élève] Une adresse. 434 00:27:12,790 --> 00:27:17,020 Une adresse de quoi? Du premier segment de mémoire. 435 00:27:17,020 --> 00:27:20,670 >> Nous n'avons aucune idée de ce qui est là parce que d'autres fonctions 436 00:27:20,670 --> 00:27:23,010 aurait pu utiliser cette mémoire précédemment. 437 00:27:23,010 --> 00:27:28,380 Mais malloc, comme GetString, renvoie l'adresse du premier octet de la mémoire 438 00:27:28,380 --> 00:27:30,540 qu'il a mis de côté pour vous. 439 00:27:30,540 --> 00:27:38,380 Cependant, ce qu'il ne fait pas faire est de remplir ce vide avec un caractère nul barre oblique inverse 440 00:27:38,380 --> 00:27:43,030 car il s'avère que vous pouvez utiliser malloc pour allouer quoi que ce soit: ints, des chaînes, des tableaux, 441 00:27:43,030 --> 00:27:45,700 flotteurs, des structures étudiants. 442 00:27:45,700 --> 00:27:47,750 Vous pouvez utiliser malloc complètement générique. 443 00:27:47,750 --> 00:27:51,470 Il ne se soucie pas ou faut savoir ce que vous allouez de la mémoire pour. 444 00:27:51,470 --> 00:27:55,810 Il serait donc présomptueux de malloc pour mettre un 0 \ 445 00:27:55,810 --> 00:27:58,340 à la fin de chaque bloc de mémoire c'est vous donner 446 00:27:58,340 --> 00:28:02,620 parce que ce \ 0 chose est juste une convention pour les chaînes. 447 00:28:02,620 --> 00:28:06,310 Il n'est pas utilisé pour les entiers, il n'est pas utilisé pour les flotteurs, il n'est pas utilisé pour les étudiants. 448 00:28:06,310 --> 00:28:11,730 Et si la chasse aux sorcières avec malloc est que la charge est entièrement de vous le programmeur 449 00:28:11,730 --> 00:28:16,790 de se rappeler combien d'octets que vous avez alloué et ne jamais utiliser une boucle for 450 00:28:16,790 --> 00:28:21,570 ou une boucle while et aller au-delà des limites de la portion de mémoire que vous avez reçu. 451 00:28:21,570 --> 00:28:23,540 En d'autres termes, dès que vous allouer de la mémoire, 452 00:28:23,540 --> 00:28:28,510 vous ne pouvez pas demander au système d'exploitation, oh, au fait, la taille d'un morceau de mémoire était-ce? 453 00:28:28,510 --> 00:28:32,080 C'est entièrement à vous de vous rappeler si vous avez besoin de cette valeur. 454 00:28:32,080 --> 00:28:34,330 >> Voyons donc comment je procède à utiliser cette mémoire. 455 00:28:34,330 --> 00:28:38,430 Dans la ligne 28 et 29 pourquoi je fais ça? 456 00:28:39,850 --> 00:28:42,260 Tout test de cohérence totale. 457 00:28:42,260 --> 00:28:45,110 Juste au cas où quelque chose s'est mal passé, je demande une certaine quantité folle de mémoire 458 00:28:45,110 --> 00:28:48,690 ou j'ai tant de choses en cours d'exécution sur l'ordinateur qu'il n'y a tout simplement pas assez de mémoire, 459 00:28:48,690 --> 00:28:51,780 quelque chose comme ça, je veux au moins pour vérifier nulle. 460 00:28:51,780 --> 00:28:55,260 En réalité, la plupart des ordinateurs vous donnera l'illusion que chaque programme 461 00:28:55,260 --> 00:28:57,080 pouvez utiliser l'intégralité de la RAM, 462 00:28:57,080 --> 00:29:00,740 mais tout de même, si l'utilisateur tape une chaîne de fou longtemps peut-être parce que c'est un mauvais garçon 463 00:29:00,740 --> 00:29:03,440 et ils sont en train d'essayer de planter votre programme ou pirater l', 464 00:29:03,440 --> 00:29:07,300 vous voulez vérifier au moins la valeur de retour de malloc et si elle est égale à zéro. 465 00:29:07,300 --> 00:29:11,630 Et si c'est le cas, nous allons tout simplement arrêter maintenant parce que je ne sais pas ce qu'il faut faire dans ce cas. 466 00:29:11,630 --> 00:29:13,950 Comment puis-je copier la chaîne? Il ya quelques façons de le faire. 467 00:29:13,950 --> 00:29:18,850 Il ya str copier des fonctions en C, mais c'est super simple pour nous de faire la vieille manière. 468 00:29:18,850 --> 00:29:23,110 >> Je voudrais d'abord comprendre ce que la longueur de s est. 469 00:29:23,110 --> 00:29:26,930 J'aurais pu mettre cela dans la boucle mais je l'ai mis ici pour plus de clarté. 470 00:29:26,930 --> 00:29:30,610 Donc n stocke désormais la longueur de la chaîne d'origine, qui est apparemment 5. 471 00:29:30,610 --> 00:29:35,290 Ensuite, dans ma boucle pour itérer Je suis de 0 sur un maximum de n, 472 00:29:35,290 --> 00:29:40,940 et à chaque itération, je suis en train de s [i] à l'intérieur du t [i]. 473 00:29:40,940 --> 00:29:45,060 C'est donc ce que j'ai laissé entendre avec mes 2 doigts pointant vers les cordes avant. 474 00:29:45,060 --> 00:29:49,260 Comme cette boucle for comme ça, je vais être en copiant h ici, 475 00:29:49,260 --> 00:29:52,890 e dans ici, dans l ici parce que c'est d, c'est t. 476 00:29:52,890 --> 00:29:58,770 Et puis enfin, dans la ligne 35 pour laquelle je fais cela? 477 00:29:58,770 --> 00:30:03,770 J'ai besoin de m'assurer que je suis la fin de la chaîne de caractères t. 478 00:30:03,770 --> 00:30:06,170 Et je l'ai fait de cette façon d'être super explicite. 479 00:30:06,170 --> 00:30:09,510 Mais proposer quelqu'un, si vous le pouviez, une façon différente de le faire. 480 00:30:09,510 --> 00:30:13,930 Je n'ai pas vraiment besoin de la ligne 35. Il ya une autre façon de le faire. 481 00:30:13,930 --> 00:30:18,880 Ouais. >> [Réponse de l'élève inaudible] >> Dites-le plus fort. 482 00:30:18,880 --> 00:30:20,960 [L'élève] Inférieur ou égal à. >> Exactement. 483 00:30:20,960 --> 00:30:24,450 Nous pourrions simplement dire inférieur ou égal à n, qui en général a été mauvaise 484 00:30:24,450 --> 00:30:28,190 parce que presque toujours quand on va à une indemnité égale à la chose que nous comptons 485 00:30:28,190 --> 00:30:30,000 nous aller 1 peu trop loin. 486 00:30:30,000 --> 00:30:32,170 Mais rappelez-vous, combien d'octets ne nous attribuons? 487 00:30:32,170 --> 00:30:37,210 Nous avons alloué strlen de s, donc 5 + 1 pour un total de 6. 488 00:30:37,210 --> 00:30:39,980 Donc dans ce cas nous pourrions faire quelque chose comme ceci 489 00:30:39,980 --> 00:30:46,450 afin que nous vous copiez pas seulement le bonjour, mais aussi le 0 \ à la fin. 490 00:30:46,450 --> 00:30:49,860 Sinon, nous pourrions utiliser une fonction appelée str copie, strcpy, 491 00:30:49,860 --> 00:30:51,700 mais ce ne serait pas amusant à peu près autant. 492 00:30:51,700 --> 00:30:54,000 Mais c'est tout ce qu'il fait sous le capot. 493 00:30:54,000 --> 00:30:56,050 Puis enfin, nous faisons la même chose qu'avant. 494 00:30:56,050 --> 00:31:01,620 Je capitaliser t puis-je prétendre que l'original ressemble à ceci et la copie ressemble à ça. 495 00:31:01,620 --> 00:31:08,570 Essayons donc maintenant. Laissez-moi aller ici. Assurez-copy2. Nous allons effectuer un zoom avant et exécutez copy2. 496 00:31:08,570 --> 00:31:13,840 Je vais taper en minuscules bonjour, et en fait je reçois minuscules bonjour comme l'original 497 00:31:13,840 --> 00:31:16,930 mais le capital Bonjour pour la copie. 498 00:31:16,930 --> 00:31:20,300 Mais je ne suis pas fait pour l'instant. J'ai besoin de faire 1 dernière chose ici. 499 00:31:20,300 --> 00:31:28,000 46 et 47 est clairement libérer de la mémoire, mais qu'est-ce que cela signifie réellement? 500 00:31:28,000 --> 00:31:33,250 Que fais-je, pensez-vous, en appelant la ligne 46 et la ligne 47? 501 00:31:33,250 --> 00:31:38,900 Quel effet cela at-il? Ouais. 502 00:31:38,900 --> 00:31:43,140 [Réponse de l'élève inaudible] >> Exactement. 503 00:31:43,140 --> 00:31:46,380 >> Vous êtes tout simplement dire le système d'exploitation, hey, merci pour cette mémoire. 504 00:31:46,380 --> 00:31:48,320 Vous pouvez maintenant l'utiliser pour quelqu'un d'autre. 505 00:31:48,320 --> 00:31:50,790 Et voici un exemple parfait de valeurs parasites. 506 00:31:50,790 --> 00:31:55,430 Je viens d'utiliser cette mémoire pour écrire le mot bonjour en 2 places, 507 00:31:55,430 --> 00:31:57,490 ici, ici, ici et ici. 508 00:31:57,490 --> 00:32:00,910 C'est donc h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Mais alors j'appelle la ligne 46 et la ligne 47, et vous savez ce qui se passe là-bas en termes de la photo? 510 00:32:06,960 --> 00:32:10,010 En fait, attendez, ce tableau est l'ancien. 511 00:32:10,010 --> 00:32:12,550 Une fois que nous rendre la copie, ce gars-là est effectivement pointant ici, 512 00:32:12,550 --> 00:32:16,110 nous allons donc supprimer les numéros et juste abstraction que nos flèches à nouveau. 513 00:32:16,110 --> 00:32:19,370 Qu'est-ce qui se passe dans cette image quand je l'appelle gratuitement? 514 00:32:19,370 --> 00:32:22,750 [Réponse de l'élève inaudible] >> Pas même. 515 00:32:22,750 --> 00:32:29,510 Si j'appelle gratuitement sur s et t - genre de question piège - cette image ne change pas du tout 516 00:32:29,510 --> 00:32:33,880 parce que l'appel et l'appel s t indique simplement le système d'exploitation, 517 00:32:33,880 --> 00:32:39,010 hey, vous pouvez utiliser cette mémoire encore, mais il ne change pas ce à null 518 00:32:39,010 --> 00:32:41,840 ou des caractères spéciaux, il ne change pas cela, 519 00:32:41,840 --> 00:32:47,350 il ne modifie pas l'atome d'hydrogène ou le courrier ou la L ou L, ou le o soit en place pour autre chose. 520 00:32:47,350 --> 00:32:51,610 Pour ce qui est de l'image, dès que vous appelez gratuitement, rien ne change. 521 00:32:51,610 --> 00:32:56,570 Et c'est là que réside l'origine des valeurs ordures parce que si je puis, plus tard dans ce programme 522 00:32:56,570 --> 00:33:01,010 demander au système d'exploitation pour plus de mémoire avec malloc ou GetString ou quelque chose comme ça 523 00:33:01,010 --> 00:33:04,900 et le système d'exploitation dit, bien sûr, j'ai 12 octets de mémoire juste libérés, 524 00:33:04,900 --> 00:33:08,080 les utiliser, qu'allez-vous être remis? 525 00:33:08,080 --> 00:33:10,830 Vous allez être remis un morceau de mémoire que nous aurions normalement attirer l' 526 00:33:10,830 --> 00:33:13,700 avec des points d'interrogation, mais quels sont ces points d'interrogation? 527 00:33:13,700 --> 00:33:17,000 Ils se trouvent h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Ce sont nos valeurs ordures nouvelles dès que vous libérer de la mémoire. 529 00:33:20,940 --> 00:33:22,750 >> Il ya une implication réelle ici aussi. 530 00:33:22,750 --> 00:33:24,720 Cela arrive à faire avec de la RAM, mais vos ordinateurs 531 00:33:24,720 --> 00:33:26,720 effectivement faire la même chose avec le disque. 532 00:33:26,720 --> 00:33:30,620 Nous en reparlerons en particulier avec un ensemble de problèmes futurs qui se concentre sur la médecine légale. 533 00:33:30,620 --> 00:33:36,170 Mais qu'est-ce qui se passe réellement, si vous avez un fichier sensible financière sur votre bureau 534 00:33:36,170 --> 00:33:39,600 ou un sommaire JPEG et que vous glissez-le dans votre poubelle, 535 00:33:39,600 --> 00:33:44,390 ce qui arrive lorsque vous le faites glisser dans la poubelle ou le bac de recyclage? 536 00:33:44,390 --> 00:33:47,240 Tu savais ce que je parlais. [Rires] 537 00:33:47,240 --> 00:33:52,370 Qu'est-ce qui se passe quand vous avez tiré cette preuve dans votre corbeille ou corbeille? 538 00:33:52,370 --> 00:33:55,920 [Réponse de l'élève inaudible] 539 00:33:55,920 --> 00:33:58,000 Eh bien, si prudent. Qu'est-ce qui se passe quand tu fais ça? 540 00:33:58,000 --> 00:34:01,030 La réponse courte est rien, non? 541 00:34:01,030 --> 00:34:04,790 Sketchy fichier ou sensibles est toujours assis là, quelque part sur votre disque dur. 542 00:34:04,790 --> 00:34:07,940 La plupart d'entre nous ont au moins appris à la dure que vous avez besoin de vider votre corbeille 543 00:34:07,940 --> 00:34:10,429 ou votre corbeille pour supprimer réellement les fichiers. 544 00:34:10,429 --> 00:34:13,440 Et en effet, lorsque vous faites un clic droit ou Ctrl clic sur votre poubelle 545 00:34:13,440 --> 00:34:15,580 ou choisissez Fichier, Vider la Corbeille ou tout autre 546 00:34:15,580 --> 00:34:21,420 et vous vider la poubelle ou corbeille, ce qui se passe ensuite à cette image? 547 00:34:22,810 --> 00:34:25,969 Plus rien. Donc, rien ne se passe réellement sur le disque. 548 00:34:25,969 --> 00:34:30,880 >> Et si nous temporairement digression et à écrire - je vais juste utiliser le verso de cette. 549 00:34:30,880 --> 00:34:34,639 Alors maintenant, l'histoire change de RAM, ce qui est l'endroit où les programmes existent 550 00:34:34,639 --> 00:34:39,250 pendant que vous les faire fonctionner, sur le disque, ce qui est l'endroit où elles sont stockées à long terme 551 00:34:39,250 --> 00:34:42,920 même lorsque l'alimentation est coupée, pour l'instant - et nous reviendrons sur ce point dans l'avenir - 552 00:34:42,920 --> 00:34:46,380 nous allons juste faire semblant que cela représente l'intérieur du disque dur de votre ordinateur 553 00:34:46,380 --> 00:34:50,110 parce que dans la journée, ils l'habitude d'être des disques circulaires, un peu comme les disquettes. 554 00:34:50,110 --> 00:34:55,130 Donc, si vous avez un fichier Excel sensible, il pourrait prendre jusqu'à ce morceau de mémoire 555 00:34:55,130 --> 00:34:59,770 sur le disque de votre ordinateur, et je ne fais que tirer la même 1s et 0s arbitraire. 556 00:34:59,770 --> 00:35:03,970 Lorsque vous faites glisser le fichier comme ça à votre poubelle ou corbeille, 557 00:35:03,970 --> 00:35:07,750 littéralement rien ne se passe parce que Apple et Microsoft ont tout simplement décidé 558 00:35:07,750 --> 00:35:10,450 la poubelle et corbeille est vraiment juste un espace réservé temporaire. 559 00:35:10,450 --> 00:35:14,710 Peut-être que finalement le système d'exploitation le vider pour vous, mais en général, il ne fait rien, 560 00:35:14,710 --> 00:35:17,090 au moins jusqu'à ce que vous êtes vraiment en manque d'espace. 561 00:35:17,090 --> 00:35:20,870 >> Cependant, quand vous allez vider la corbeille ou corbeille vide, 562 00:35:20,870 --> 00:35:23,460 De même, rien ne se passe à ce tableau. 563 00:35:23,460 --> 00:35:28,590 Tout ce qui arrive est ailleurs sur votre ordinateur, il ya une sorte de table. 564 00:35:28,590 --> 00:35:35,400 C'est un peu comme une petite feuille de triche qui dit que, disons, resume.doc, 565 00:35:35,400 --> 00:35:40,920 de sorte que votre CV dans un fichier Microsoft Word habitude de vivre à l'emplacement 123 sur votre disque dur, 566 00:35:40,920 --> 00:35:43,710 pas en mémoire et non dans la mémoire RAM, mais sur votre disque dur, 567 00:35:43,710 --> 00:35:49,050 et vos sommaires vie JPEG à 456, et de votre fichier Excel vit à 789 ou ailleurs. 568 00:35:49,050 --> 00:35:53,640 Lorsque vous supprimez des fichiers en fait vider la corbeille ou corbeille, 569 00:35:53,640 --> 00:35:59,530 cette image ne change pas. Le 0 et de 1 sur votre disque dur ne vont nulle part. 570 00:35:59,530 --> 00:36:03,930 Mais ce tableau, cette petite base de données de toutes sortes, change. 571 00:36:03,930 --> 00:36:08,750 Lorsque vous supprimez votre CV, c'est comme si le fichier est supprimé dans un certain sens, 572 00:36:08,750 --> 00:36:12,790 mais tout ce que l'ordinateur ne soit oublié où vit cette chose sur votre disque dur. 573 00:36:12,790 --> 00:36:17,870 Le 0 et de 1 qui composent votre curriculum vitae ou l'autre de ces autres fichiers sont encore intacts. 574 00:36:17,870 --> 00:36:21,960 >> Donc, si vous l'avez fait par hasard, il ya toujours une probabilité non nulle 575 00:36:21,960 --> 00:36:25,800 que vous pouvez récupérer vos données à l'aide de Norton Utilities ou d'un logiciel commercial 576 00:36:25,800 --> 00:36:29,810 dont le but dans la vie est de trouver des 0 et des 1 qui ont été en quelque sorte orphelins, 577 00:36:29,810 --> 00:36:33,300 oubliés ici, mais laissé ici, afin que vous puissiez récupérer vos données. 578 00:36:33,300 --> 00:36:38,410 Ou enquêteurs judiciaires avec la police ou le FBI aurait fait prendre un disque dur 579 00:36:38,410 --> 00:36:42,550 et effectivement rechercher des modèles de 0 et de 1 qui ressemblent à des fichiers JPEG, la forme de fichiers Excel, 580 00:36:42,550 --> 00:36:46,400 et récupérer de cette façon, même si l'ordinateur les a oubliés là. 581 00:36:46,400 --> 00:36:49,820 Donc la seule façon vraiment supprimer les données, comme nous le verrons à l'avenir, 582 00:36:49,820 --> 00:36:54,190 est de frotter ou essuyer le fichier ou le disque dur par - 583 00:36:54,190 --> 00:36:56,540 Vous ne pouvez pas vraiment vous débarrasser des 0 et des 1 584 00:36:56,540 --> 00:36:59,440 parce que sinon, vous commencez avec un disque dur de gigaoctet 585 00:36:59,440 --> 00:37:02,380 et vous vous retrouver avec un disque dur si vous mégaoctet constamment été la suppression, 586 00:37:02,380 --> 00:37:04,380 littéralement, 0 et de 1. 587 00:37:04,380 --> 00:37:06,310 Alors, que feriez-vous si vous avez vraiment voulu effacer vos traces 588 00:37:06,310 --> 00:37:10,510 et le problème fondamental est qu'il ya toujours 0 et de 1 sur le disque? 589 00:37:10,510 --> 00:37:14,930 Je vois quelqu'un gesticulant que vous briser physiquement le périphérique. Ça va marcher. 590 00:37:14,930 --> 00:37:19,600 [Rires] Mais si c'est le genre d'une solution coûteuse, ce qui serait plus raisonnable? 591 00:37:19,600 --> 00:37:23,270 Ouais. >> [L'élève] les écraser. >> Les écraser avec quoi? >> [Étudiant] D'autres données. 592 00:37:23,270 --> 00:37:29,070 D'autres données. Vous pouvez simplement remplacer votre disque avec des 0 ou 1 s ou des 0, des 1. 593 00:37:29,070 --> 00:37:31,230 >> Et c'est effectivement ce que certains des logiciels de fait. 594 00:37:31,230 --> 00:37:33,570 Vous pouvez acheter un logiciel ou même obtenir le logiciel libre, 595 00:37:33,570 --> 00:37:36,610 et même intégré à Mac OS de nos jours, un peu moins dans Windows, 596 00:37:36,610 --> 00:37:38,660 est la capacité à effacer en toute sécurité. 597 00:37:38,660 --> 00:37:41,960 En fait, si vous voulez tout home run aujourd'hui, si vous avez un Mac et ce faire, 598 00:37:41,960 --> 00:37:45,740 si vous avez des trucs dans votre poubelle, vous pouvez faire sécurisé Vider la corbeille, 599 00:37:45,740 --> 00:37:47,610 qui fait exactement cela. 600 00:37:47,610 --> 00:37:53,350 Plutôt que d'effacer des fichiers ici seulement, il n'efface pas le ici 0 et de 1, 601 00:37:53,350 --> 00:38:01,240 au contraire, cela ne modifie que tous, par exemple, de 0 et de dot, dot, dot. 602 00:38:01,240 --> 00:38:05,330 Ainsi, l'un de vos psets futures seront réellement au dessein de récupérer des données - 603 00:38:05,330 --> 00:38:08,430 photos que nous avons prises des gens, les lieux et les choses sur le campus 604 00:38:08,430 --> 00:38:12,810 pour laquelle nous allons faire une image médico-légal de la carte mémoire d'un appareil photo numérique, 605 00:38:12,810 --> 00:38:17,120 qui est la même idée - et vous aurez à relever le défi de trouver réellement 606 00:38:17,120 --> 00:38:20,160 les modèles qui représentent des fichiers JPEG sur votre disque dur, 607 00:38:20,160 --> 00:38:23,610 ressemble beaucoup à celle ancien élève dont le courriel que j'ai lu il ya quelques semaines a fait 608 00:38:23,610 --> 00:38:25,860 pour récupérer des photos de sa sœur. 609 00:38:25,860 --> 00:38:30,300 Pourquoi ne pas prendre une pause de 5 minutes, et nous allons regrouper avec plus de mémoire. 610 00:38:33,030 --> 00:38:38,610 Donc, c'est là que les choses deviennent un peu hallucinant, mais c'est une étape très puissant 611 00:38:38,610 --> 00:38:40,480 pour comprendre ce d'autant plus. 612 00:38:40,480 --> 00:38:42,900 Voici un programme appelé pointers.c. 613 00:38:42,900 --> 00:38:45,430 Il est l'un des exemples de code actuel. 614 00:38:45,430 --> 00:38:51,280 Notez que dans les premières lignes, 19 à 22, tout ce que nous faisons, c'est quelque chose comme GetString 615 00:38:51,280 --> 00:38:54,460 et en retournant une adresse, le stocker à l'art. 616 00:38:54,460 --> 00:38:58,380 Désormais, pour pset voire 3 si vous voulez, mais pset 4 et sur 617 00:38:58,380 --> 00:39:01,030 où vous pouvez commencer à prendre ces roues d'entraînement au large de vous-même, 618 00:39:01,030 --> 00:39:04,030 il n'ya aucune raison de prétendre que les chaînes n'existent plus. 619 00:39:04,030 --> 00:39:07,030 Il est certainement correct de simplement commencer à dire char *. 620 00:39:07,030 --> 00:39:12,610 >> Soit dit en passant, dans les références en ligne et dans les livres que vous pouvez souvent voir l'étoile à côté de la variable. 621 00:39:12,610 --> 00:39:15,600 Vous pourriez même voir des espaces autour des deux côtés de celui-ci. 622 00:39:15,600 --> 00:39:17,680 Tous ceux qui sont fonctionnellement correcte. 623 00:39:17,680 --> 00:39:21,180 Pour le moment, cependant, nous allons standardiser sur cette approche pour faire super clair 624 00:39:21,180 --> 00:39:24,000 que char *, c'est comme dire pointeur de caractère. 625 00:39:24,000 --> 00:39:25,680 C'est le type de données. 626 00:39:25,680 --> 00:39:28,730 Et puis le nom de la variable est dans cette affaire. 627 00:39:28,730 --> 00:39:31,180 Donc, nous avons obtenu une chaîne et nous avons appelé cela s. 628 00:39:31,180 --> 00:39:35,180 Et puis ici remarquerez que je fais en fait un peu de ruse. 629 00:39:35,180 --> 00:39:39,080 C'est ce qu'on appelle l'arithmétique des pointeurs, qui est une sorte de super simple. 630 00:39:39,080 --> 00:39:41,790 Cela signifie simplement ajouter et soustraire des nombres à des pointeurs. 631 00:39:41,790 --> 00:39:43,660 Mais cela fonctionne réellement. 632 00:39:43,660 --> 00:39:49,170 Ce programme imprime apparemment 1 la chaîne de caractère de chaque ligne de sorte que le résultat final - 633 00:39:49,170 --> 00:39:54,920 Juste pour que nous puissions gâcher où cela se passe, assurez-pointeurs, pointeurs de fonctionner, laissez-moi un zoom avant 634 00:39:54,920 --> 00:39:58,940 Maintenant, permettez-moi de saisir quelque chose comme BONJOUR et tapez Entrée 635 00:39:58,940 --> 00:40:01,080 et elle imprime 1 caractère par ligne. 636 00:40:01,080 --> 00:40:04,730 Jusqu'à il ya une seconde, nous l'avons fait avec la notation crochet. 637 00:40:04,730 --> 00:40:09,760 Nous aurions une boucle for et que nous ferions printf s [i] et nous aimerions le faire encore et encore et encore 638 00:40:09,760 --> 00:40:11,950 avec un n antislash à la fin de chaque ligne. 639 00:40:11,950 --> 00:40:16,800 Mais ce programme est différent. Ce programme utilise, littéralement, de l'arithmétique. 640 00:40:16,800 --> 00:40:18,860 Alors qu'est-ce qui se passe ici? 641 00:40:18,860 --> 00:40:24,720 Tout d'abord, avant cette boucle s'exécute même, quoi, juste pour être clair, c'est en fait d? 642 00:40:24,720 --> 00:40:27,270 S est? >> [L'élève] Une adresse. >> Une adresse. 643 00:40:27,270 --> 00:40:32,980 >> Et c'est l'adresse de, dans le cas de bonjour, le premier caractère de ce mot, qui est h. 644 00:40:32,980 --> 00:40:37,370 Donc s est, dans cet exemple particulier, l'adresse de h. 645 00:40:37,370 --> 00:40:41,850 Alors qu'est-ce que cela signifie pour le faire s + i? 646 00:40:41,850 --> 00:40:46,280 Eh bien, je commence à 0 dans cette boucle for. Nous avons fait de nombreuses fois que. 647 00:40:46,280 --> 00:40:49,760 Je va aller jusqu'à la longueur de la chaîne, apparemment. 648 00:40:49,760 --> 00:40:53,950 Ainsi, à la première itération de cette boucle, i est évidemment 0. 649 00:40:53,950 --> 00:41:01,740 Donc, cette expression veut dire s + i - plutôt, s +0--ce que c'est évidemment tout s. 650 00:41:01,740 --> 00:41:04,320 Alors, quelle est * s ici? 651 00:41:04,320 --> 00:41:08,530 Maintenant, nous utilisons la star d'une manière légèrement différente. 652 00:41:08,530 --> 00:41:13,080 Permettez-moi aller de l'avant et de se débarrasser de t parce que nous en avons fini parle t et les copies de l'art. 653 00:41:13,080 --> 00:41:15,540 Maintenant, nous voulons juste raconter une histoire mettant en scène l'art. 654 00:41:15,540 --> 00:41:20,090 Et si en ce moment, après avoir type string, notre monde semble tout à fait comme avant 655 00:41:20,090 --> 00:41:26,630 avec seulement s mémoriser l'adresse de h et de façon plus générale montrant la chaîne bonjour. 656 00:41:26,630 --> 00:41:33,170 Si je fais maintenant une ligne comme * (s + i), nous allons essayer cela. 657 00:41:33,170 --> 00:41:40,140 So * (s + i). Permettez-moi de simplifier ce parce que c'est 0, c'est donc * (s +0). 658 00:41:40,140 --> 00:41:43,790 Eh bien, attendez une minute. Simplifier davantage. Il s'agit d'* (s). 659 00:41:43,790 --> 00:41:47,020 Eh bien, maintenant, les parenthèses sont un peu stupide, alors maintenant nous allons juste faire * s. 660 00:41:47,020 --> 00:41:50,540 Ainsi, dans la première itération de cette boucle, cette ligne qui est mis en évidence, 26, 661 00:41:50,540 --> 00:41:53,650 est à peu près équivalent à l'impression de ce. 662 00:41:53,650 --> 00:41:56,040 Quel est le type de données * s? 663 00:41:56,040 --> 00:42:00,770 Dans ce contexte, parce que l'étoile se trouve être à côté de la s lui-même, 664 00:42:00,770 --> 00:42:04,930 mais plus précisément, parce que nous ne sommes plus déclarant que l'art, 665 00:42:04,930 --> 00:42:09,730 nous ne créons pas une variable plus, il n'y a aucune mention de char * en ligne 26, 666 00:42:09,730 --> 00:42:14,280 il n'y a aucune mention de la chaîne de mot-clé, nous utilisons juste une variable appelée s, 667 00:42:14,280 --> 00:42:19,650 il s'avère maintenant l'étoile a légèrement différente et, certes, confondant sens. 668 00:42:19,650 --> 00:42:26,590 * S ici signifie aller à l'adresse de l'art et d'imprimer tout ce qui est là-bas. 669 00:42:26,590 --> 00:42:33,750 Donc s est ici, s * est - un peu comme Chutes and Ladders, suivez la flèche - ici. 670 00:42:33,750 --> 00:42:35,850 Il s'agit donc d'* s. 671 00:42:35,850 --> 00:42:39,060 >> Alors, quelle est imprimé sur la première itération de cette boucle dans la ligne 26? 672 00:42:39,060 --> 00:42:42,170 J'imprime% c, qui est l'espace réservé pour un caractère, 673 00:42:42,170 --> 00:42:48,520 puis un \ n pour une nouvelle ligne. * (S + i) où i est 0 est exactement cela. 674 00:42:48,520 --> 00:42:53,670 Alors, que dois-je placer caractères dans des c%? H. 675 00:42:53,670 --> 00:42:56,900 Dans la prochaine itération de la boucle - vous pouvez probablement voir où cela va - 676 00:42:56,900 --> 00:43:01,350 la prochaine itération i est évidemment 1, alors cela signifie s +1, 677 00:43:01,350 --> 00:43:05,580 et puis maintenant je n'ai pas besoin des parenthèses parce que maintenant l'étoile doit dire 678 00:43:05,580 --> 00:43:08,620 aller à l'adresse mémoire s +1. 679 00:43:08,620 --> 00:43:14,170 Quel est l? Faisons reculer dans le temps et dire cette flèche est maintenant en train de faire pas-nous pas de faveurs. 680 00:43:14,170 --> 00:43:18,450 Soit c'est plus précisément dire que ce n'est stockage du numéro 123 681 00:43:18,450 --> 00:43:25,110 parce que le début de cette chaîne bonjour, ceci est l'adresse 123, c'est 124, et ainsi de suite. 682 00:43:25,110 --> 00:43:30,550 Ainsi, sur la seconde itération quand je dis que s +1, c'est comme dire 123 +1, 683 00:43:30,550 --> 00:43:35,340 autrement connu comme 124, donc ce caractère est imprimé sur la deuxième itération? 684 00:43:35,340 --> 00:43:37,850 E à 124 adresses mémoire. 685 00:43:37,850 --> 00:43:44,440 Puis à nouveau +, 125, 126, 127, et cette boucle s'arrête heureusement, avant d'arriver ici 686 00:43:44,440 --> 00:43:49,040 parce que je suis en utilisant strlen pour s'assurer que je ne compte pas trop élevé. 687 00:43:49,040 --> 00:43:50,810 Donc, c'est elle aussi. 688 00:43:50,810 --> 00:43:55,000 Encore une fois, c'est comme si nous l'avions fait il ya une semaine. 689 00:43:55,000 --> 00:43:59,200 Permettez-moi de l'écrire sur la ligne ci-dessous, même si nous ne voulons pas faire les deux. 690 00:43:59,200 --> 00:44:02,500 Ceci est identique aujourd'hui à ce sujet. 691 00:44:02,500 --> 00:44:08,310 >> Ainsi, même si s est une chaîne, comme nous l'avons été de l'appeler pendant des semaines, s est vraiment un char *. 692 00:44:08,310 --> 00:44:13,270 Donc, si nous voulons être anale super, c'est vraiment bon d'écrire le caractère spécifique 693 00:44:13,270 --> 00:44:17,490 à l'emplacement vec l'aide de ces adresses numériques et cet opérateur étoile, 694 00:44:17,490 --> 00:44:20,470 mais franchement, c'est juste tellement plus propre. Donc, ce n'est pas mauvais. 695 00:44:20,470 --> 00:44:26,720 Pas de raison de cesser de faire ici la ligne 27, mais 26 est fonctionnellement le même, 696 00:44:26,720 --> 00:44:31,570 et il est fonctionnellement le même exactement pour les raisons que nous avons discuté jusqu'à présent. 697 00:44:31,570 --> 00:44:33,650 Et enfin, 29 est pratique juste bon. 698 00:44:33,650 --> 00:44:38,420 Appel sans s signifie que vous êtes maintenant redonner la mémoire que vous avez donné GetString 699 00:44:38,420 --> 00:44:41,630 car encore une fois, comme je l'ai mentionné lundi GetString pendant des semaines 700 00:44:41,630 --> 00:44:44,180 a été l'introduction d'un bug dans votre code. 701 00:44:44,180 --> 00:44:46,490 Votre code pendant des semaines a eu des fuites de mémoire 702 00:44:46,490 --> 00:44:49,970 par lequel vous avez été demander GetString pour la mémoire, mais vous n'avez jamais été le rendre. 703 00:44:49,970 --> 00:44:53,410 Et qui a été délibérément choisie par nous pédagogique 704 00:44:53,410 --> 00:44:55,880 parce que c'est tout simplement trop de choses à penser dès le début. 705 00:44:55,880 --> 00:44:57,710 Mais maintenant, nous avons besoin de plus de symétrie. 706 00:44:57,710 --> 00:45:00,830 Si vous demandez à l'ordinateur pour la mémoire, comme c'est le cas pour GetString, 707 00:45:00,830 --> 00:45:02,820 comme c'est le cas apparemment pour malloc, 708 00:45:02,820 --> 00:45:07,970 vous devez maintenant pset 4 et suivants aussi libérer la mémoire tels. 709 00:45:07,970 --> 00:45:11,650 Remarquez que ce n'est pas à dire n int. 710 00:45:11,650 --> 00:45:15,040 Vous n'avez pas besoin de libérer ce parce que vous n'avez pas appelé GetString 711 00:45:15,040 --> 00:45:16,890 et vous n'avez pas appeler malloc. 712 00:45:16,890 --> 00:45:20,610 >> Et même si vous avez appelé getInt que nous finirons par voir, 713 00:45:20,610 --> 00:45:25,520 GetInt ne pas allouer de la mémoire pour vous parce que vous pouvez réellement faire circuler entiers 714 00:45:25,520 --> 00:45:29,430 et les flotteurs et les caractères juste la façon dont nous avons fait pendant des semaines. 715 00:45:29,430 --> 00:45:33,960 Cordes, cependant, sont spéciaux parce que vraiment ils sont la concaténation des caractères multiples. 716 00:45:33,960 --> 00:45:37,450 Donc, ils sont juste différents de caractères et des flotteurs et ints, etc. 717 00:45:37,450 --> 00:45:39,980 Mais nous y reviendrons qu'avant longtemps. 718 00:45:39,980 --> 00:45:44,920 Toutes les questions, alors sur ce début de pointeurs? Ouais. 719 00:45:44,920 --> 00:45:49,690 [Question étudiant inaudible] 720 00:45:49,690 --> 00:45:51,440 Ah, très bonne question. 721 00:45:51,440 --> 00:45:55,790 Une des rares choses que C ne fait pour vous, ce qui est pratique, 722 00:45:55,790 --> 00:46:00,110 est elle figure pour vous ce qui est de la taille du type de données 723 00:46:00,110 --> 00:46:03,060 puis fait ce genre de multiplication pour vous. 724 00:46:03,060 --> 00:46:06,610 Ce n'est pas pertinent dans le cas des chars, car presque toujours un char est de 1 octet, 725 00:46:06,610 --> 00:46:08,150 si cela marche. 726 00:46:08,150 --> 00:46:11,220 Mais pour les besoins de la discussion, si vous étiez réellement l'impression entiers 727 00:46:11,220 --> 00:46:15,500 et que vous essayez d'imprimer sur une valeur qui s était pointé à un nombre entier, 728 00:46:15,500 --> 00:46:20,720 vous serait même pas besoin de faire + 4 * i juste parce que un int est de 4 octets. 729 00:46:20,720 --> 00:46:25,780 L'arithmétique des pointeurs signifie que le compilateur C et faire tout ce qui calculs pour vous. 730 00:46:25,780 --> 00:46:29,190 Tout ce que vous devez prendre en compte est le comptage dans une sorte de sens humain. Ouais. 731 00:46:29,190 --> 00:46:35,200 [L'élève] Si vous déclarez une chaîne à l'intérieur d'une boucle for, avez-vous pour le libérer plus tard? 732 00:46:35,200 --> 00:46:36,760 Bonne question. 733 00:46:36,760 --> 00:46:41,390 >> Si vous avez déclaré une chaîne à l'intérieur de la boucle for, avez-vous besoin pour le libérer plus tard? 734 00:46:41,390 --> 00:46:47,520 Vous avez seulement besoin de libérer la mémoire que vous allouez à GetString ou avec malloc. 735 00:46:47,520 --> 00:46:53,110 Donc, si vous venez de dire quelque chose comme - permettez-moi de mettre des accolades maintenant si tout le code est lié. 736 00:46:53,110 --> 00:46:58,580 Si vous avez fait quelque chose, mais buggily, comme ça, char * t = s, 737 00:46:58,580 --> 00:47:03,450 vous n'avez pas besoin de t libres parce que t ne comportait aucune mention de malloc ou GetString. 738 00:47:03,450 --> 00:47:08,960 Si par contre vous avez fait ceci, GetString, alors oui, vous aurez besoin de t libres. 739 00:47:08,960 --> 00:47:14,350 Et en fait, votre seule chance de le faire est maintenant à l'intérieur de cette boucle, pour la même question du champ d'application 740 00:47:14,350 --> 00:47:16,060 que nous avons discuté dans le passé. 741 00:47:16,060 --> 00:47:18,830 Sinon, vous seriez l'allocation de mémoire, l'allocation de mémoire, l'allocation de mémoire, 742 00:47:18,830 --> 00:47:21,230 et à la fin du programme parce que vous êtes à l'extérieur de la boucle, 743 00:47:21,230 --> 00:47:24,240 t n'existe pas, mais vous n'avez jamais dit que le système d'exploitation 744 00:47:24,240 --> 00:47:26,750 que vous n'avez pas besoin de cette mémoire plus. 745 00:47:26,750 --> 00:47:30,430 Et avant longtemps, car pset 4 ou 5 nous vous doter d'un programme appelé Valgrind, 746 00:47:30,430 --> 00:47:34,160 qui est dans le même esprit de GDB en ce qu'elle a de peu d'une interface obscure, 747 00:47:34,160 --> 00:47:35,750 mais son but dans la vie est de vous aider. 748 00:47:35,750 --> 00:47:39,380 Et Valgrind est un programme qui sera à l'avenir une recherche dans vos programmes 749 00:47:39,380 --> 00:47:42,550 à la recherche de fuites de mémoire, qu'il s'agisse de GetString ou malloc, 750 00:47:42,550 --> 00:47:47,800 que nous allons commencer à utiliser d'autant plus que nous cessons d'utiliser la bibliothèque CS50 autant. 751 00:47:47,800 --> 00:47:53,030 Nous avons maintenant enfin en quelque sorte le vocabulaire et le type de modèle mental en théorie 752 00:47:53,030 --> 00:47:55,170 permettant de résoudre ce programme cassé. 753 00:47:55,170 --> 00:47:59,410 >> Donc, dans ce programme cassé, swap fonctionne à l'intérieur de swap, 754 00:47:59,410 --> 00:48:05,280 mais il n'a jamais vraiment travaillé en principal parce principale adoptée en x et y, rappel, 755 00:48:05,280 --> 00:48:07,260 et ceux qui ont passé par les valeurs, pour ainsi dire. 756 00:48:07,260 --> 00:48:09,330 Des copies de leur furent données à échanger. 757 00:48:09,330 --> 00:48:12,520 À la fin de swap, a et b ont effectivement été échangés, 758 00:48:12,520 --> 00:48:16,120 mais bien sûr, x et y, comme nous en avons discuté, lundi, n'avait pas été. 759 00:48:16,120 --> 00:48:19,940 Je propose donc ici en vert que ce soit réellement la solution ici. 760 00:48:19,940 --> 00:48:22,640 Et en fait, je vais passer mes étoiles que ce soit cohérent 761 00:48:22,640 --> 00:48:24,440 même si, encore une fois, fonctionnellement ce n'est pas grave. 762 00:48:24,440 --> 00:48:28,730 Dans les semaines à venir, nous allons vous expliquer quand et pourquoi c'est important. 763 00:48:28,730 --> 00:48:30,600 Alors maintenant en vert est une solution. 764 00:48:30,600 --> 00:48:33,700 Franchement, on dirait un tas désordonné parce que j'ai toutes ces étoiles. 765 00:48:33,700 --> 00:48:35,380 Permettez-moi de souligner une chose. 766 00:48:35,380 --> 00:48:40,040 La ligne supérieure là où il est dit int * a * b et int 767 00:48:40,040 --> 00:48:42,820 est fondamentalement fait la même chose comme il l'a toujours. 768 00:48:42,820 --> 00:48:47,070 Il est déclaré 2 arguments ou paramètres d'échanger, 769 00:48:47,070 --> 00:48:49,940 dont le premier est un pointeur int appelé, 770 00:48:49,940 --> 00:48:53,100 dont le second est un pointeur int appelé b. 771 00:48:53,100 --> 00:48:55,770 La seule chose qui est nouveau à ce stade, c'est le fait qu'il y est une star là-bas. 772 00:48:55,770 --> 00:48:59,340 >> Qu'est-ce que ça veut dire? A n'est pas un int, b n'est pas un entier. 773 00:48:59,340 --> 00:49:04,100 A est l'adresse d'un int et b est l'adresse d'un int différent. 774 00:49:04,100 --> 00:49:06,980 Ici-bas, c'est là que je l'avoue C devient confus. 775 00:49:06,980 --> 00:49:09,790 Maintenant, nous utilisons une étoile, mais il a un sens différent dans ce contexte. 776 00:49:09,790 --> 00:49:13,150 Parce que nous ne sommes pas déclarer des pointeurs que nous sommes ici, 777 00:49:13,150 --> 00:49:15,500 nous sommes ici déréférencement choses. 778 00:49:15,500 --> 00:49:21,520 Donc, techniquement, la star dans ce contexte, de la première ligne, deuxième, et troisième à l'intérieur de swap 779 00:49:21,520 --> 00:49:24,560 est l'opérateur de déréférencement, ce qui signifie tout simplement aller là-bas. 780 00:49:24,560 --> 00:49:27,400 Ainsi, tout comme mon doigt puis sur la flèche vers h, 781 00:49:27,400 --> 00:49:31,100 * Un moyen aller à cette adresse et me trouver l'int qui est là. 782 00:49:31,100 --> 00:49:34,250 * Moyen b allez à l'adresse et me faire passer ce qui est là. 783 00:49:34,250 --> 00:49:40,730 Donc, nous allons redessiner l'image du lundi utilise maintenant un empilage de cadres, 784 00:49:40,730 --> 00:49:43,130 l'une de fond qui va être principale, 785 00:49:43,130 --> 00:49:47,600 l'une supérieure, qui sera d'échange, 786 00:49:47,600 --> 00:49:50,880 afin que notre monde ressemble, tout comme lundi, comme ça. 787 00:49:50,880 --> 00:49:53,620 Voici un morceau de mémoire principale va utiliser. 788 00:49:53,620 --> 00:49:56,520 >> Rappelons, du lundi que le programme vient d'avoir 2 variables, 789 00:49:56,520 --> 00:50:01,930 celui qui est appelé x et un y appelle, et j'avais mis les numéros 1 et 2 là. 790 00:50:01,930 --> 00:50:06,580 Maintenant, quand je l'appelle comme je le faisais échanger le lundi, 791 00:50:06,580 --> 00:50:11,000 précédemment lorsque j'ai utilisé la version rouge de ce programme, qui ressemble à ceci, 792 00:50:11,000 --> 00:50:17,470 J'ai 2 paramètres, a et b, et qu'est-ce que nous écrivons ici et ici? 793 00:50:17,470 --> 00:50:21,160 Juste 1 et 2, littéralement copie de x et y. 794 00:50:21,160 --> 00:50:23,070 Aujourd'hui, nous changer cela. 795 00:50:23,070 --> 00:50:28,510 Aujourd'hui, au lieu de passer en entiers a et b, nous allons passer à 2 adresses. 796 00:50:28,510 --> 00:50:34,290 Ces adresses se produire pour pointer vers entiers, mais ces adresses ne sont pas eux-mêmes des ints. 797 00:50:34,290 --> 00:50:37,330 Ils sont des adresses. C'est comme une adresse postale à la place. 798 00:50:37,330 --> 00:50:40,580 Alors maintenant, nous devons juste me donner un peu plus détaillée sur l'écran. 799 00:50:40,580 --> 00:50:43,250 C'est la mémoire de mon ordinateur comme ça a été toute la journée. 800 00:50:43,250 --> 00:50:45,120 Maintenant, nous avons besoin de régime arbitraire de numérotation. 801 00:50:45,120 --> 00:50:50,580 Alors disons simplement que, par hasard, que c'est l'adresse mémoire 123, 124. 802 00:50:50,580 --> 00:50:55,660 Disons simplement que c'est 125, c'est 126, et ainsi de suite, mais c'est totalement arbitraire. 803 00:50:55,660 --> 00:50:58,590 Nous avons juste besoin d'un peu schéma de numérotation dans ma mémoire. 804 00:50:58,590 --> 00:51:04,030 Alors maintenant, quand j'ai effectivement passer en x et y, je ne vais pas passer en x et y; 805 00:51:04,030 --> 00:51:08,400 Je vais passer l'adresse postale, pour ainsi dire, de x et de y 806 00:51:08,400 --> 00:51:11,870 de sorte que ce qui est stocké ici et ici n'est pas 1 et 2, 807 00:51:11,870 --> 00:51:16,030 mais si vous pouvez voir mon petit texte, ce qui est transmis ici et là? 808 00:51:16,030 --> 00:51:23,340 [Réponse de l'élève inaudible] >> Exactement. 123 se mettre ici et 124 se mettre ici. 809 00:51:23,340 --> 00:51:28,910 >> Maintenant, parce que j'ai utilisé l'étoile de cette manière toute première ligne ici au sommet, 810 00:51:28,910 --> 00:51:34,340 mon programme sait juste que 123 et 124, même si elles sont évidemment entiers 811 00:51:34,340 --> 00:51:40,160 que tout être humain a pu remarquer, elles doivent être interprétées comme des adresses, des adresses numériques. 812 00:51:40,160 --> 00:51:43,250 Ils ne sont pas en elles-mêmes des ints, ils sont adresses, 813 00:51:43,250 --> 00:51:46,120 et c'est parce que j'ai mis explicitement les étoiles là-bas. 814 00:51:46,120 --> 00:51:51,360 Alors maintenant, dans ma première ligne, deuxième et troisième code réel ce qui se passe ici? 815 00:51:51,360 --> 00:51:53,380 Tirons le reste de l'image. 816 00:51:53,380 --> 00:51:56,980 Tmp est juste comme il était le lundi. Rien de spécial à propos de tmp. 817 00:51:56,980 --> 00:52:03,060 Il est à seulement de 32 bits de la variable locale, et à l'intérieur de ce que je suis apparemment stocker la valeur de * a. 818 00:52:03,060 --> 00:52:08,580 Maintenant, si je viens de dire tmp = a, qu'aurais-je mettre ici? >> [L'élève] 123. 819 00:52:08,580 --> 00:52:10,370 123. Mais ce n'est pas ce que je fais. 820 00:52:10,370 --> 00:52:13,670 Je dis tmp = * a. Moyens étoile y aller. 821 00:52:13,670 --> 00:52:19,370 Voici donc un, 123. Comment puis-je y aller? Faire comme il ya une flèche. 822 00:52:19,370 --> 00:52:24,460 Eh bien, ça y est, 1. Donc, ce qui est stocké dans tmp, apparemment? Juste 1. 823 00:52:24,460 --> 00:52:29,620 Donc, en d'autres termes, tmp est * A, * un moyen aller à l'adresse qui se trouve actuellement dans une, 824 00:52:29,620 --> 00:52:31,320 qui est apparemment 123. 825 00:52:31,320 --> 00:52:33,910 >> Ok, nous sommes ici à l'emplacement 123, je vois le nombre 1, 826 00:52:33,910 --> 00:52:35,670 donc je vais mettre le numéro 1 là-bas. 827 00:52:35,670 --> 00:52:39,020 Maintenant, qu'est-ce que je fais dans la ligne 2, * a = b *? 828 00:52:39,020 --> 00:52:44,570 Celui-ci est un peu plus compliquée parce que maintenant ce qui est un? Il est 123. 829 00:52:44,570 --> 00:52:50,220 So * a est où? Là où j'étais avant. Alors, allez-y. D'accord. 830 00:52:50,220 --> 00:52:53,420 Maintenant, enfin, et puis finalement cela va commencer à faire sens, nous l'espérons, 831 00:52:53,420 --> 00:53:00,280 * B signifie ce qui est en b? 124. Donc j'ai besoin d'aller là-bas, qui est de 2. 832 00:53:00,280 --> 00:53:03,430 Que dois-je mettre où? 833 00:53:03,430 --> 00:53:10,100 2 passe ici parce que dans * b * va dans un. Donc, je vais le faire. 834 00:53:10,100 --> 00:53:13,120 Et vous pouvez déjà voir, peut-être, que nous sommes beaucoup plus proche 835 00:53:13,120 --> 00:53:17,710 pour résoudre ce stupide, simple problème correctement pour la première fois 836 00:53:17,710 --> 00:53:20,920 parce que maintenant nous avons encore un souvenir de ce qui était x, 837 00:53:20,920 --> 00:53:23,230 nous avons 2 exemplaires, il est vrai, de y, 838 00:53:23,230 --> 00:53:25,850 mais la ligne 3 indique maintenant * b. 839 00:53:25,850 --> 00:53:31,080 Alors, voici b. * B moyens d'y aller. Alors, où est l'emplacement 124? 840 00:53:31,080 --> 00:53:35,560 C'est apparemment ici. Alors, que dois-je mettre ici? De toute évidence, tmp. 841 00:53:35,560 --> 00:53:39,600 Alors maintenant, je fais ça. J'ai donc 1 ici et 2 ici. 842 00:53:39,600 --> 00:53:43,560 Et maintenant, qu'en est-il de tout cela, le 123, le 124 et le 1? 843 00:53:43,560 --> 00:53:47,910 Dès le retour de swap, cette mémoire est aussi bonne que perdu 844 00:53:47,910 --> 00:53:51,070 parce que dès le retour de swap, le système d'exploitation 845 00:53:51,070 --> 00:53:54,190 est libre d'utiliser cette mémoire à nouveau à l'avenir. 846 00:53:54,190 --> 00:53:58,870 Que la mémoire principale à la partie inférieure de cette pile dite colle autour. 847 00:53:58,870 --> 00:54:01,470 >> Et donc nous avons enfin maintenant une version de travail. 848 00:54:01,470 --> 00:54:06,310 Laissez-moi aller dans swap.c, et remarquez ce qui suit. 849 00:54:06,310 --> 00:54:11,280 Au début du programme, j'ai changé mon prototype être int * a * b et int. 850 00:54:11,280 --> 00:54:15,000 Donc, la seule chose que j'ai changé pour passer de rouge, ce qui était mauvais, au vert, ce qui est bon, 851 00:54:15,000 --> 00:54:17,350 est j'ai ajouté ces étoiles d'aujourd'hui. 852 00:54:17,350 --> 00:54:21,520 Mais ici, en soi, échanger j'ai dû copier, coller ce qui était juste sur la diapositive. 853 00:54:21,520 --> 00:54:24,140 J'ai ici une étoile, étoile ici - qui correspond au prototype - 854 00:54:24,140 --> 00:54:27,930 et puis toutes ces choses maintenant, sauf pour les étoiles tmp 855 00:54:27,930 --> 00:54:30,680 parce que l'utilisation d'une variable temporaire, il n'y a rien de nouveau là-bas. 856 00:54:30,680 --> 00:54:33,040 J'ai juste besoin de stockage temporaire pour un int. 857 00:54:33,040 --> 00:54:34,820 Donc, nous n'avons pas besoin d'une étoile là-bas. 858 00:54:34,820 --> 00:54:39,310 Nous avons juste besoin de l'étoile afin que nous puissions traverser cette sorte de limite arbitraire 859 00:54:39,310 --> 00:54:42,900 entre ces 2 images dans la mémoire de mon ordinateur. 860 00:54:42,900 --> 00:54:45,630 Mais une dernière chose doit changer, et vous pourriez l'avoir entrevu déjà. 861 00:54:45,630 --> 00:54:48,810 Quelle autre ligne est évidemment différent maintenant? >> [L'élève] et x. 862 00:54:48,810 --> 00:54:53,270 >> Ouais, donc 25 est la dernière ligne de code que j'ai besoin de changer pour que cela fonctionne. 863 00:54:53,270 --> 00:54:58,360 Il ya une semaine et même le lundi de la ligne 25 ressemblait à ceci, échanger x et y, 864 00:54:58,360 --> 00:55:02,020 et cela a été juste de rompre parce que si vous dites swap (x, y) 865 00:55:02,020 --> 00:55:05,660 vous donnez des copies de x et y pour permuter, puis il a fait sa chose, 866 00:55:05,660 --> 00:55:09,080 mais vous n'êtes jamais réellement changer x et y lui-même. 867 00:55:09,080 --> 00:55:12,880 Donc, même si vous n'avez jamais vu ce personnage avant avec l'esperluette dans le code, 868 00:55:12,880 --> 00:55:15,860 il suffit de prendre une supposition. Qu'est-ce que l'esperluette faire, apparemment? 869 00:55:15,860 --> 00:55:17,890 [L'élève] Prend l'adresse. Prend >> l'adresse. 870 00:55:17,890 --> 00:55:21,160 Ainsi, l'esperluette est dit de me donner l'adresse de x. 871 00:55:21,160 --> 00:55:25,590 Qui sait où il est? Il se trouve que 123. Je ne m'inquiète pas. Juste me donner l'adresse de x. 872 00:55:25,590 --> 00:55:28,340 Et y signifie me donner l'adresse de y. 873 00:55:28,340 --> 00:55:34,450 Et à ce point de l'histoire est parfaitement cohérente avec l'image que nous a il ya un instant. 874 00:55:34,450 --> 00:55:38,310 >> Donc, je vais vous avouer pointeurs, certainement pour moi quand j'ai commencé à apprendre ce, 875 00:55:38,310 --> 00:55:40,570 étaient certainement l'une des choses les plus difficiles pour envelopper mon esprit autour. 876 00:55:40,570 --> 00:55:43,760 Mais se rendre compte, d'autant plus que nous avons continuer à jouer avec ce genre de choses, 877 00:55:43,760 --> 00:55:48,030 si vous le décomposer à ces sortes de super simple intellectuellement inintéressantes problèmes 878 00:55:48,030 --> 00:55:52,270 de transférer des numéros autour, la réponse à beaucoup de confusion avec des pointeurs 879 00:55:52,270 --> 00:55:56,590 peut vraiment être tirées de ces mécanismes très simples. 880 00:55:56,590 --> 00:55:59,070 Voici une adresse. Allez-y avec la star. 881 00:55:59,070 --> 00:56:03,830 Ou à l'inverse, voici une esperluette. Pensez à ce que l'adresse est en réalité. 882 00:56:03,830 --> 00:56:06,270 Très bien. 883 00:56:06,270 --> 00:56:09,000 Alors, où est l'ensemble de ce mémoire vient-il? 884 00:56:09,000 --> 00:56:12,360 Nous avons tiré cette image d'un couple de fois, et je garde prometteuse nous allons y revenir, 885 00:56:12,360 --> 00:56:14,920 mais ici, c'est la représentation de la mémoire de votre ordinateur 886 00:56:14,920 --> 00:56:17,420 qui est un peu plus marqué que notre tableau est ici. 887 00:56:17,420 --> 00:56:21,590 Le segment de texte en haut représente ce qui concerne votre programme? 888 00:56:21,590 --> 00:56:26,090 [Réponse de l'élève inaudible] >> Désolé? Dis-le encore. 889 00:56:26,090 --> 00:56:28,660 [L'élève] Le programme proprement dit. >> Le programme proprement dit. 890 00:56:28,660 --> 00:56:32,430 >> Ainsi, le Clang 0 et de 1 que vous avez compilé après l'écriture de code C, puis en exécutant 891 00:56:32,430 --> 00:56:35,910 et générant des bouts 0s et 1s se caché là dans la mémoire 892 00:56:35,910 --> 00:56:38,570 parce que quand vous double-cliquez sur une icône sur votre Mac ou votre PC 893 00:56:38,570 --> 00:56:43,010 ou exécutez une commande comme mario à l'invite, votre 0s et 1s à partir du disque 894 00:56:43,010 --> 00:56:45,700 être chargés dans la mémoire afin que l'ordinateur puisse les manipuler 895 00:56:45,700 --> 00:56:47,540 et de les exécuter plus rapidement. 896 00:56:47,540 --> 00:56:50,880 Ainsi, les données initialisées et non initialisées de données, nous ne pourrons pas parler beaucoup de celles-ci, 897 00:56:50,880 --> 00:56:52,420 mais ce ne sont que des variables globales. 898 00:56:52,420 --> 00:56:54,710 Initialisé les variables globales signifie que vous avez données à valeurs; 899 00:56:54,710 --> 00:56:59,300 initialisé les variables globales qui signifie que vous n'avez pas encore donnent des valeurs de. 900 00:56:59,300 --> 00:57:01,900 Et puis il ya ces variables d'environnement que je vais onde complètement ma main à, 901 00:57:01,900 --> 00:57:04,860 mais ils sont là et que les choses magasins comme votre nom d'utilisateur 902 00:57:04,860 --> 00:57:08,090 et autres sortes de détails de niveau inférieur. 903 00:57:08,090 --> 00:57:12,880 Mais les plus juteux morceaux de la présentation de votre mémoire est cette chose appelée la pile et le tas. 904 00:57:12,880 --> 00:57:17,470 La pile à nouveau, pour être clair, c'est la mémoire qui est utilisée chaque fois que les fonctions sont appelées, 905 00:57:17,470 --> 00:57:19,710 quand il ya des variables locales 906 00:57:19,710 --> 00:57:22,120 et quand il ya des paramètres étant passé autour. 907 00:57:22,120 --> 00:57:24,490 Tout cela se passe dans la pile. 908 00:57:24,490 --> 00:57:29,570 Le tas que nous n'avons pas encore parlé, mais essayer de deviner qui utilise le tas. 909 00:57:31,120 --> 00:57:32,690 Juste un morceau de mémoire différente. 910 00:57:32,690 --> 00:57:36,620 Il arrive à faire ici au sommet, mais c'est une convention arbitraire picturale. 911 00:57:36,620 --> 00:57:41,670 Qui a apparemment eu recours à la mémoire du tas pendant des semaines? 912 00:57:41,670 --> 00:57:44,830 C'est techniquement vous, mais indirectement. >> [L'élève] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString et malloc. Alors, voici la différence fondamentale. 914 00:57:47,950 --> 00:57:51,300 >> Vous savez pour les dernières semaines que si vous avez besoin de mémoire, juste déclarer une variable. 915 00:57:51,300 --> 00:57:54,560 Si vous avez besoin de beaucoup de mémoire, déclarer un tableau à l'intérieur même de votre fonction. 916 00:57:54,560 --> 00:57:59,620 Mais le problème que nous avons gardé en face, c'est que si vous déclarez des variables locales à l'intérieur des fonctions, 917 00:57:59,620 --> 00:58:05,340 dès que la fonction retourne, ce qui arrive à la mémoire et ces variables? 918 00:58:05,340 --> 00:58:09,620 Juste une sorte de que ce n'est plus le vôtre, non? Il disparaît juste une sorte de vue conceptuel. 919 00:58:09,620 --> 00:58:13,950 Il est encore physiquement là, évidemment, mais ce n'est plus votre droit d'utiliser. 920 00:58:13,950 --> 00:58:17,160 C'est évidemment un problème si vous voulez écrire des fonctions dans la vie 921 00:58:17,160 --> 00:58:20,440 qui fait allouer de la mémoire et ne lui donnez pas immédiatement. 922 00:58:20,440 --> 00:58:24,180 Affaire au point: le but GetString dans la vie est d'avoir aucune idée à l'avance 923 00:58:24,180 --> 00:58:26,390 la taille d'une chaîne, je vais taper sur le clavier, 924 00:58:26,390 --> 00:58:30,390 mais ça doit être en mesure d'allouer de la mémoire pour contenir David ou bonjour 925 00:58:30,390 --> 00:58:32,860 ou un essai entier que l'utilisateur pourrait avoir tapé po 926 00:58:32,860 --> 00:58:35,280 Donc GetString a été en utilisant malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc doit donc être en utilisant non pas la pile; 928 00:58:38,910 --> 00:58:40,770 au lieu qu'il utilise ce qu'on appelle le tas. 929 00:58:40,770 --> 00:58:44,430 Il n'y a rien de différent de la mémoire. Ce n'est pas plus rapide ou plus lent ou quelque chose comme ça. 930 00:58:44,430 --> 00:58:46,570 C'est juste physiquement dans un endroit différent. 931 00:58:46,570 --> 00:58:50,120 >> Mais la règle est que la mémoire qui est allouée sur le tas 932 00:58:50,120 --> 00:58:56,180 ne seront jamais enlevés de chez vous jusqu'à ce que vous appelez - faire une supposition - libre. 933 00:58:56,180 --> 00:59:00,510 En revanche, toute la mémoire que vous demandez sur la pile d'un peu déclaration d'un tableau 934 00:59:00,510 --> 00:59:03,320 ou déclarer une variable comme nous l'avons fait pendant des semaines, 935 00:59:03,320 --> 00:59:05,640 que par défaut se retrouve sur la pile. 936 00:59:05,640 --> 00:59:09,550 Et cela fonctionne très bien 90% du temps, mais en ces occasions rares 937 00:59:09,550 --> 00:59:12,470 où vous voulez allouer de la mémoire et de le garder autour, 938 00:59:12,470 --> 00:59:14,730 alors vous devez utiliser une fonction comme malloc. 939 00:59:14,730 --> 00:59:19,370 Ou nous avons utilisé une fonction comme GetString, qui à son tour utilise malloc. 940 00:59:19,370 --> 00:59:23,300 Nous allons voir où cela pourrait briser et ensuite prendre un coup d'oeil à Binky. 941 00:59:23,300 --> 00:59:25,820 Nous y reviendrons que dans le futur. 942 00:59:25,820 --> 00:59:29,270 Voici un programme super simple que dans les 2 premières lignes fait quoi? 943 00:59:29,270 --> 00:59:33,460 En anglais, qu'est-ce que ces 2 premières lignes de code à l'intérieur du principal? 944 00:59:33,460 --> 00:59:35,600 [Réponse de l'élève inaudible] 945 00:59:35,600 --> 00:59:37,880 Attention. Il ne me donne pas l'adresse de x ou y. 946 00:59:37,880 --> 00:59:41,840 [L'élève] Donne des pointeurs vers des entiers. Bon >>. Donnez-moi 2 pointeurs en nombres entiers. 947 00:59:41,840 --> 00:59:45,130 En d'autres termes, donnez-moi 2 morceaux de mémoire que je garde de dessin aujourd'hui, 948 00:59:45,130 --> 00:59:46,950 même si je l'ai effacé aujourd'hui, sous forme de carrés. 949 00:59:46,950 --> 00:59:50,000 Donnez-moi 2 morceaux de mémoire, on appelle x, on appelle y - 950 00:59:50,000 --> 00:59:54,320 plus tôt je les ai appelés s et t - et quel est le type de ce morceau de mémoire? 951 00:59:54,320 --> 00:59:57,160 Il va stocker une adresse. 952 00:59:57,160 --> 00:59:59,110 Il est de type int *. 953 00:59:59,110 --> 01:00:01,630 >> Donc, l'adresse d'un int finira par vivre en x, 954 01:00:01,630 --> 01:00:03,860 l'adresse d'un int finira par vivre en y, 955 01:00:03,860 --> 01:00:08,460 mais d'abord, ce qui est à l'intérieur de x et y? Qui sait? Des valeurs parasites. 956 01:00:08,460 --> 01:00:10,180 Il n'a rien à voir avec des pointeurs. 957 01:00:10,180 --> 01:00:12,720 Si nous n'avons pas mis quelque chose, qui sait ce qui est réellement là-bas? 958 01:00:12,720 --> 01:00:18,950 Maintenant, x. Qu'est-ce qui se passe ici? Ceci est légitime maintenant parce que x est un pointeur. C'est un int *. 959 01:00:18,950 --> 01:00:21,870 Cela signifie donc que je peux mettre dans x l'adresse d'un bloc de mémoire. 960 01:00:21,870 --> 01:00:25,120 Qu'est-ce que malloc retourne? Parfait, il renvoie les adresses, 961 01:00:25,120 --> 01:00:28,510 l'adresse du premier octet dans un bloc de mémoire entier. 962 01:00:28,510 --> 01:00:31,140 Combien d'octets est apparemment cette allocation, par exemple, dans l'appareil? 963 01:00:31,140 --> 01:00:33,510 Quelle est la taille d'un int? 4. 964 01:00:33,510 --> 01:00:36,600 Si vous repensez à la semaine 1, ce n'est pas super important de toujours se rappeler que, 965 01:00:36,600 --> 01:00:38,870 mais dans ce cas, il est utile de savoir, 4 octets. 966 01:00:38,870 --> 01:00:41,770 Donc, ce n'est allocation sur les 4 tas octets 967 01:00:41,770 --> 01:00:46,110 et il renvoie l'adresse de la première à me arbitrairement. 968 01:00:46,110 --> 01:00:47,700 Maintenant, ce que l'on fait x? 969 01:00:47,700 --> 01:00:52,200 Un * x = 42 fait quoi? 970 01:00:52,200 --> 01:00:57,150 Si à ce moment de l'histoire que nous avons x, qui ressemble à ceci avec une certaine valeur ordures, 971 01:00:57,150 --> 01:01:04,120 c'est maintenant avec une certaine valeur y ordures, maintenant dans la ligne 3, j'ai attribué 4 octets. 972 01:01:04,120 --> 01:01:06,950 Cette image ressemble essentiellement à cela. 973 01:01:06,950 --> 01:01:12,010 Ou plus précisément, si cela est arbitraire adresse 123, c'est ce que notre histoire ressemble maintenant. 974 01:01:12,010 --> 01:01:23,940 * X = 42: et maintenant? Cela signifie aller à l'adresse 123 et mettre le numéro 42 là-bas. 975 01:01:23,940 --> 01:01:26,220 Je n'ai pas besoin de porter ces lignes parce que nous ne faisons pas de chaînes. 976 01:01:26,220 --> 01:01:29,480 >> Je viens de l'écrire comme ça, et pour le simple plaisir de démonstration, 977 01:01:29,480 --> 01:01:33,240 42 comme type int occupe beaucoup d'espace, 4 octets. 978 01:01:33,240 --> 01:01:35,960 Donc, c'est ce qui s'est passé là-bas, mais il ya un problème maintenant. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Qu'est-ce qui va se passer ici? 980 01:01:40,580 --> 01:01:46,470 Le problème est y * dans notre monde simplifié signifie simplement aller à l'adresse en y. 981 01:01:46,470 --> 01:01:48,590 Ce qui est dans y? C'est une valeur ordures. 982 01:01:48,590 --> 01:01:53,150 Donc, supposons que cette valeur est 5551212 ordures, quelque chose de fou comme ça. 983 01:01:53,150 --> 01:01:56,750 * Moyens y aller pour répondre 5551212. 984 01:01:56,750 --> 01:02:00,450 C'est comme ici. Il n'existe pas, par exemple. 985 01:02:00,450 --> 01:02:05,310 Donc * y obtient 13 signifie que je suis en train de retirer 13 ici. Il n'existe pas. 986 01:02:05,310 --> 01:02:08,790 J'ai dépassé le segment du tableau. Que dois-je faire? 987 01:02:08,790 --> 01:02:14,930 Cette faute de segmentation message énigmatique parce que je suis en train de mettre en mémoire 988 01:02:14,930 --> 01:02:19,470 une valeur telle que 13 à un endroit qui n'existe pas. 989 01:02:19,470 --> 01:02:23,900 Le reste du programme pourrait fonctionner bien, mais jusque-là elle n'existe pas. 990 01:02:23,900 --> 01:02:25,350 Donc, nous allons essayer de raconter cette histoire. 991 01:02:25,350 --> 01:02:27,830 Nous y reviendrons une fois que nous avons parlé hex. 992 01:02:27,830 --> 01:02:30,290 Revenons à cela et conclure avec cette chose appelée Binky, 993 01:02:30,290 --> 01:02:33,710 qui rappel est un professeur de Stanford assis à la maison à jouer avec pâte à modeler, 994 01:02:33,710 --> 01:02:36,380 pour raconter l'histoire d'exactement le même programme. 995 01:02:36,380 --> 01:02:40,580 C'est juste environ 3 minutes. Ici, nous avons Binky. 996 01:02:40,580 --> 01:02:45,030 [Locuteur masculin en vidéo] Hey Binky, réveillez-vous. Il est temps pour le plaisir pointeur. 997 01:02:45,030 --> 01:02:50,080 [Binky] Qu'est-ce que c'est? Renseignez-vous sur les pointeurs? Oh, ma bonne femme! 998 01:02:50,080 --> 01:02:53,700 [Locuteur masculin] Eh bien, pour commencer, je pense que nous allons avoir besoin de quelques pointeurs couple. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] D'accord. Ce code attribue 2 pointeurs qui peuvent pointer sur des nombres entiers. 1000 01:02:57,890 --> 01:03:02,220 [Locuteur masculin] D'accord. Eh bien, je vois les 2 pointeurs, mais ils ne semblent pas être dirigée vers n'importe quoi. 1001 01:03:02,220 --> 01:03:05,550 [Binky] C'est exact. Initialement, les pointeurs ne pointent pas vers quoi que ce soit. 1002 01:03:05,550 --> 01:03:09,270 Les choses vers lesquels ils pointent sont appelés pointees, et leur mise en place est une étape distincte. 1003 01:03:09,270 --> 01:03:12,330 [Locuteur masculin] Oh, oui, oui. Je le savais. Les pointees sont séparés. 1004 01:03:12,330 --> 01:03:15,630 Euh, alors comment voulez-vous allouer une pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] D'accord. Ce code attribue une nouvelle pointee entier, et cette partie fixe x pour pointer vers elle. 1006 01:03:21,510 --> 01:03:23,500 [Locuteur masculin] Hé, regarde mieux. 1007 01:03:23,500 --> 01:03:26,030 Donc, en faire quelque chose. >> [Binky] D'accord. 1008 01:03:26,030 --> 01:03:30,300 Je vais déréférencer le pointeur x pour enregistrer le numéro 42 dans son pointee. 1009 01:03:30,300 --> 01:03:34,410 Pour cette astuce je vais avoir besoin de mon coup de baguette magique de déréférencement. 1010 01:03:34,410 --> 01:03:38,610 [Locuteur masculin] Votre baguette magique de déréférencement? C'est très bien. 1011 01:03:38,610 --> 01:03:44,230 [Binky] C'est ce que le code ressemble. Je vais mettre en place le nombre et la ... [Claquement] 1012 01:03:44,230 --> 01:03:46,100 [Locuteur masculin] Hé, regardez, là, il va. 1013 01:03:46,100 --> 01:03:50,990 Donc, faire un déréférencement x suit la flèche pour accéder à son pointee, 1014 01:03:50,990 --> 01:03:53,230 dans ce cas, pour stocker 42 à l'intérieur. 1015 01:03:53,230 --> 01:03:57,630 Hé, essayez de l'utiliser pour stocker le numéro 13 à l'autre pointeur, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] D'accord. Je vais aller là-bas pour y et obtenir le numéro 13 mis en place 1017 01:04:03,250 --> 01:04:08,360 et ensuite prendre la baguette de déréférencement et juste ... [Bourdonnement] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Locuteur masculin] Oh hey, ça n'a pas marché. 1019 01:04:10,980 --> 01:04:14,870 >> Dites, Binky, je ne pense pas que le déréférencement y est une bonne idée 1020 01:04:14,870 --> 01:04:17,880 parce que la mise en place de la pointee est une étape distincte 1021 01:04:17,880 --> 01:04:19,850 et je ne pense pas que nous ayons jamais fait. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, bon point. 1023 01:04:21,770 --> 01:04:26,640 [Locuteur masculin] Ouais. Nous avons réparti la y pointeur, mais nous n'avons jamais défini pour pointer vers un pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, très attentif. 1025 01:04:28,780 --> 01:04:30,690 [Locuteur masculin] Hey, tu as l'air là-bas, Binky. 1026 01:04:30,690 --> 01:04:34,160 Pouvez-vous résoudre ce problème afin que les points y à la pointee même que x? >> [Binky] Bien sûr. 1027 01:04:34,160 --> 01:04:37,100 Je vais utiliser ma baguette magique d'affectation du pointeur. 1028 01:04:37,100 --> 01:04:39,070 [Locuteur masculin] Est-ce que cela va être un problème comme avant? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Non, cela ne touche pas les pointees. 1030 01:04:40,840 --> 01:04:44,780 Il change juste un pointeur pour pointer vers la même chose que l'autre. [Claquement] 1031 01:04:44,780 --> 01:04:48,570 [Locuteur masculin] Oh, je vois. Maintenant points y à la même place que x. 1032 01:04:48,570 --> 01:04:51,140 Donc attendre. Maintenant y est fixé. Il a une pointee. 1033 01:04:51,140 --> 01:04:54,520 Ainsi, vous pouvez essayer la baguette de déréférencer à nouveau d'envoyer le plus de 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Euh, d'accord. Va ici. [Claquement] 1035 01:04:58,130 --> 01:05:01,250 [Locuteur masculin] Hé, regardez ça. Maintenant déréférencement travaux sur y. 1036 01:05:01,250 --> 01:05:05,200 Et parce que les pointeurs sont le partage que l'on pointee, ils ont tous deux voir le 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Ouais, le partage. Peu importe. 1038 01:05:06,910 --> 01:05:08,880 >> Donc, allons-nous changer de place maintenant? 1039 01:05:08,880 --> 01:05:11,420 [Locuteur masculin] Oh, regardez, nous n'avons plus de temps. >> [Binky] Mais - 1040 01:05:11,420 --> 01:05:13,880 [Locuteur masculin] Rappelez-vous les 3 règles du pointeur. 1041 01:05:13,880 --> 01:05:18,630 Numéro 1, la structure de base est que vous avez un pointeur et pointe vers un pointee. 1042 01:05:18,630 --> 01:05:23,120 Mais le pointeur et pointee sont séparés, et l'erreur commune est de mettre en place un pointeur 1043 01:05:23,120 --> 01:05:25,680 mais oublier de lui donner un pointee. 1044 01:05:25,680 --> 01:05:29,580 Numéro 2, déréférencement curseur se met au niveau du pointeur et suit sa flèche au-dessus 1045 01:05:29,580 --> 01:05:31,060 pour accéder à son pointee. 1046 01:05:31,060 --> 01:05:34,340 Comme nous le savons tous, cela ne fonctionne que s'il ya un pointee, 1047 01:05:34,340 --> 01:05:36,460 quel type de revient à la règle numéro 1. 1048 01:05:36,460 --> 01:05:39,870 Numéro 3, l'affectation du pointeur prend un pointeur et change 1049 01:05:39,870 --> 01:05:42,390 pour pointer vers le pointee identique à un autre pointeur. 1050 01:05:42,390 --> 01:05:45,890 Donc, après la cession, les 2 pointeurs pointera vers le même pointee. 1051 01:05:45,890 --> 01:05:47,800 Parfois, c'est ce qu'on appelle le partage. 1052 01:05:47,800 --> 01:05:50,910 >> Et c'est tout ce qu'il ya à faire vraiment. Bye-bye maintenant. 1053 01:05:50,910 --> 01:05:55,840 C'est Binky. C'est CS50. Nous vous verrons la semaine prochaine. [Applaudissements] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]