1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID MALAN: Bonjour, et bienvenue à CS50. 3 00:00:13,260 --> 00:00:14,860 Donc, c'est la fin de la quatrième semaine. 4 00:00:14,860 --> 00:00:16,680 Juste une annonce en premier. 5 00:00:16,680 --> 00:00:19,600 Ainsi, le soi-disant cinquième lundi est à venir lundi prochain. 6 00:00:19,600 --> 00:00:22,800 C'est l'occasion de changer d' SAT / UNSAT à un grade de lettre ou de 7 00:00:22,800 --> 00:00:24,130 note par lettre SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Fâcheusement, ce processus exige un signature, parce que vous avez à remplir 9 00:00:27,130 --> 00:00:28,770 sur un de ces insertion / extraction formes roses. 10 00:00:28,770 --> 00:00:31,680 >> Parce que techniquement, le SAT / UNSAT La version et la version de lettre de qualité 11 00:00:31,680 --> 00:00:33,320 avoir les numéros de catalogue distinctes. 12 00:00:33,320 --> 00:00:34,240 Mais pas une grosse affaire. 13 00:00:34,240 --> 00:00:36,620 Il suffit de venir à moi ou à Rob ou à Lauren en tout point. 14 00:00:36,620 --> 00:00:39,550 Ou envoyez-nous si vous n'avez pas le genre de documents dont vous avez besoin aujourd'hui, et nous 15 00:00:39,550 --> 00:00:43,410 ne manquera pas de vous aider à prendre soin de cela avant lundi. 16 00:00:43,410 --> 00:00:45,780 >> Très bien, alors aujourd'hui - 17 00:00:45,780 --> 00:00:47,630 en fait, il ya un peu d'écho. 18 00:00:47,630 --> 00:00:51,070 Pouvons-nous ton me baisser un peu? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Donc, aujourd'hui, nous introduisons un sujet connue sous le nom pointeurs. 21 00:00:54,850 --> 00:00:57,770 Et je dois admettre que c'est l'un des des sujets plus complexes que nous avons tendance à 22 00:00:57,770 --> 00:01:00,960 couvrir dans cette classe, ou vraiment tout cours d'introduction qui utilise C. 23 00:01:00,960 --> 00:01:05,510 >> Mais prenez-en ma parole, en particulier Si votre esprit se sent un peu plus courbé 24 00:01:05,510 --> 00:01:07,100 aujourd'hui et dans les semaines à venir. 25 00:01:07,100 --> 00:01:10,340 Ce n'est pas représentatif de vous faire pire à ce qu'il signifie simplement que 26 00:01:10,340 --> 00:01:13,360 c'est un sujet particulièrement sophistiqué que je le promets, quelques semaines 27 00:01:13,360 --> 00:01:17,610 par conséquent, vous semblera trop frappante simple rétrospectivement. 28 00:01:17,610 --> 00:01:18,720 >> Je me souviens encore à ce jour. 29 00:01:18,720 --> 00:01:22,190 J'étais assis dans Elliott Dining Hall, assis à côté de mon TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 qui était un résident de la maison Elliott. 31 00:01:24,070 --> 00:01:26,340 Et pour une raison quelconque, cette sujet clique simplement. 32 00:01:26,340 --> 00:01:29,430 C'est-à-dire que moi aussi je luttais avec elle pendant un certain laps de temps, mais je 33 00:01:29,430 --> 00:01:33,610 Je ferai mon meilleur pour aider à éviter une telle lutte avec un sujet qui finalement 34 00:01:33,610 --> 00:01:34,580 est assez puissant. 35 00:01:34,580 --> 00:01:37,350 >> En fait, l'un des sujets dont nous discuterons dans les semaines à venir, c'est que 36 00:01:37,350 --> 00:01:41,130 de sécurité, et comment vous pouvez réellement exploiter les machines de façon 37 00:01:41,130 --> 00:01:42,320 qui n'étaient pas prévus. 38 00:01:42,320 --> 00:01:45,850 Et ces exploitations sont généralement le résultat de bugs, des erreurs que nous 39 00:01:45,850 --> 00:01:49,740 les gens font en ne comprenant pas certains de l'implémentation sous-jacente 40 00:01:49,740 --> 00:01:52,250 détails via les programmes qui sont faits. 41 00:01:52,250 --> 00:01:55,410 >> Maintenant, pour faire ce semble d'autant plus facile à utiliser amical, j'ai pensé que je jouerais à 10 42 00:01:55,410 --> 00:01:59,680 deuxième aperçu d'un peu de pâte à modeler Figure nommé Binky qui a été porté à 43 00:01:59,680 --> 00:02:03,020 vie par un de nos amis à Stanford, professeur Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Alors, permettez-moi de vous donner cette teaser de Binky ici. 45 00:02:06,753 --> 00:02:09,520 >> [LECTURE VIDEO] 46 00:02:09,520 --> 00:02:10,380 >> -Hey, Binky. 47 00:02:10,380 --> 00:02:11,050 Réveillez-vous. 48 00:02:11,050 --> 00:02:13,610 Il est temps pour le plaisir du pointeur. 49 00:02:13,610 --> 00:02:14,741 >> -Qu'est-ce que c'est? 50 00:02:14,741 --> 00:02:16,440 Renseignez-vous sur les pointeurs? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [FIN LECTURE VIDÉO] 53 00:02:18,920 --> 00:02:20,670 >> DAVID MALAN: C'est Stanford l'informatique. 54 00:02:20,670 --> 00:02:23,194 Donc, plus sur cela pour venir. 55 00:02:23,194 --> 00:02:24,930 >> [Applaudissements] 56 00:02:24,930 --> 00:02:26,660 >> DAVID MALAN: Désolé, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Alors rappeler que la dernière fois que nous avons fini sur ce cliffhanger vraiment passionnant 58 00:02:30,680 --> 00:02:32,960 par laquelle cette fonction n'a tout simplement pas fonctionner. 59 00:02:32,960 --> 00:02:34,960 Au moins intuitivement, il s'est senti comme cela devrait fonctionner. 60 00:02:34,960 --> 00:02:37,600 Échangeant simplement les valeurs de deux nombres entiers. 61 00:02:37,600 --> 00:02:40,915 Mais rappeler que lorsque nous avons imprimé l' valeurs d'origine dans principale, et une 62 00:02:40,915 --> 00:02:44,210 deux, ils étaient encore un et deux pas et deux et un. 63 00:02:44,210 --> 00:02:46,070 >> Permettez-moi donc réellement commute au cours de l'appareil. 64 00:02:46,070 --> 00:02:50,180 Et j'ai écrit un morceau de code squelettique avancer ici, où je prétends que x 65 00:02:50,180 --> 00:02:52,500 sera 1, y sera 2. 66 00:02:52,500 --> 00:02:54,810 J'ai ensuite imprimer les deux de leur valeurs avec impression f. 67 00:02:54,810 --> 00:02:57,540 >> J'ai ensuite prétends ici que nous allons échanger. 68 00:02:57,540 --> 00:03:00,800 J'ai laissé une tache blanche ici pour nous remplir aujourd'hui dans un instant. 69 00:03:00,800 --> 00:03:03,380 Ensuite, je vais prétendre que l' deux variables ont été échangés. 70 00:03:03,380 --> 00:03:04,770 Alors je vais imprimer les sortir de nouveau. 71 00:03:04,770 --> 00:03:07,090 Et donc j'espère, je devrais voir 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 C'est la super simple objectif en ce moment. 74 00:03:09,830 --> 00:03:12,430 >> Alors, comment allons-nous échanger deux variables? 75 00:03:12,430 --> 00:03:17,220 Eh bien, si je propose ici que ces coupes peut représenter la mémoire dans un ordinateur. 76 00:03:17,220 --> 00:03:19,070 Ce n'est que quelques bouchées, ce est encore quelques bouchées. 77 00:03:19,070 --> 00:03:23,260 Aurions-nous pu un volontaire venu sur place et nous mélanger certaines boissons, si familier? 78 00:03:23,260 --> 00:03:23,920 Venez sur place. 79 00:03:23,920 --> 00:03:24,815 Quel est votre nom? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID MALAN: Jess? 82 00:03:25,690 --> 00:03:26,540 Allez-vous, Jess. 83 00:03:26,540 --> 00:03:29,180 Si vous n'avez pas l'esprit, nous devons mettre l' Verre Google sur vous afin que nous puissions 84 00:03:29,180 --> 00:03:30,430 immortaliser cela. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, verre. 87 00:03:34,670 --> 00:03:37,250 Enregistrer une vidéo. 88 00:03:37,250 --> 00:03:43,103 Et OK, nous sommes bien d' aller avec Jess ici. 89 00:03:43,103 --> 00:03:43,810 Très bien. 90 00:03:43,810 --> 00:03:45,120 Enchanté de faire votre connaissance. 91 00:03:45,120 --> 00:03:47,720 >> Donc ce que je voudrais que vous faites ici - si vous pouviez, assez rapidement - 92 00:03:47,720 --> 00:03:51,040 nous verse juste un demi-verre d'orange jus et un demi-verre de lait, 93 00:03:51,040 --> 00:03:55,710 représenter efficacement les numéros 1 dans une tasse et 2 dans l'autre coupelle. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Cela va être une bonne séquence. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Désolé. 98 00:04:05,860 --> 00:04:06,330 >> DAVID MALAN: Non, non. 99 00:04:06,330 --> 00:04:08,703 C'est OK. 100 00:04:08,703 --> 00:04:10,120 Nice. 101 00:04:10,120 --> 00:04:12,950 Très bien, alors nous avons quatre octets la valeur de jus d'orange. 102 00:04:12,950 --> 00:04:14,460 Nous l'appelions la valeur 1. 103 00:04:14,460 --> 00:04:16,579 Maintenant encore quatre octets d'une valeur de lait. 104 00:04:16,579 --> 00:04:18,519 L'appellerons la valeur 2. 105 00:04:18,519 --> 00:04:20,440 Donc x et y, respectivement. 106 00:04:20,440 --> 00:04:23,450 >> Bon, maintenant si la tâche à accomplir - pour vous, Jess, en face de tous 107 00:04:23,450 --> 00:04:24,270 de vos camarades de classe - 108 00:04:24,270 --> 00:04:28,510 c'est-à permuter les valeurs de x et y tels que nous voulons que le jus d'orange dans le 109 00:04:28,510 --> 00:04:32,070 autre tasse et le lait dans cette coupe, comment Seriez-vous - avant de le faire réellement 110 00:04:32,070 --> 00:04:34,020 elle - s'y prendre? 111 00:04:34,020 --> 00:04:35,220 >> OK, sage décision. 112 00:04:35,220 --> 00:04:36,340 Donc, vous avez besoin d'un peu plus de mémoire. 113 00:04:36,340 --> 00:04:38,190 Donc, nous allons allouer une temporaire tasse, si vous voulez. 114 00:04:38,190 --> 00:04:40,540 Et maintenant procéder à échanger x et y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Excellente. 117 00:04:53,530 --> 00:04:54,420 Donc, très bien fait. 118 00:04:54,420 --> 00:04:55,670 Merci beaucoup, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Voici. 121 00:05:00,020 --> 00:05:01,950 Un petit souvenir. 122 00:05:01,950 --> 00:05:04,350 >> OK, donc évidemment, super idée simple. 123 00:05:04,350 --> 00:05:07,500 Complètement intuitive que nous avons besoin d'un peu plus d'espace de stockage - sous cette forme, 124 00:05:07,500 --> 00:05:09,750 une tasse - si nous voulons réellement échanger ces deux variables. 125 00:05:09,750 --> 00:05:11,110 Donc, nous allons faire exactement cela. 126 00:05:11,110 --> 00:05:14,330 Jusqu'à ici, entre où je prétends que je suis allez faire un certain échange, je vais 127 00:05:14,330 --> 00:05:15,720 aller de l'avant et de déclarer température. 128 00:05:15,720 --> 00:05:17,980 Et je vais mettre cela égale à, disons, x. 129 00:05:17,980 --> 00:05:21,110 >> Alors je vais changer la valeur de x comme Jess a fait ici avec l' 130 00:05:21,110 --> 00:05:23,200 lait et jus d'orange pour être égal à y. 131 00:05:23,200 --> 00:05:27,460 Et je vais changer y être égal de ne pas x, parce que maintenant nous serions 132 00:05:27,460 --> 00:05:29,530 coincé dans un cercle, mais plutôt Temp. 133 00:05:29,530 --> 00:05:33,170 Où puis-je temporairement - ou où Jess mettre temporairement le jus d'orange 134 00:05:33,170 --> 00:05:35,460 avant de démolir que tasse avec le lait. 135 00:05:35,460 --> 00:05:37,250 >> Alors laissez-moi aller de l'avant maintenant et faire cela. 136 00:05:37,250 --> 00:05:39,210 C'est ce qu'on appelle noswap.c. 137 00:05:39,210 --> 00:05:41,190 Et maintenant, permettez-moi de ne cours aucun swap. 138 00:05:41,190 --> 00:05:43,910 Et en effet, je vois, si j'augmente la fenêtre un peu, que 139 00:05:43,910 --> 00:05:45,160 x est 1, y est égal à 2. 140 00:05:45,160 --> 00:05:47,230 Et alors x est 2, y est égal à 1. 141 00:05:47,230 --> 00:05:51,910 >> Mais rappelons que le lundi, nous avons fait des choses un peu différemment par lequel je 142 00:05:51,910 --> 00:05:56,760 plutôt mis en place une fonction d'assistance, si vous voulez, qui était en fait vide. 143 00:05:56,760 --> 00:05:58,010 Je l'ai appelé swap. 144 00:05:58,010 --> 00:06:01,600 Je lui ai donné deux paramètres, et j'ai appelé les a et je les ai appelés b. 145 00:06:01,600 --> 00:06:04,380 >> Franchement, je pouvais les appeler x et y. 146 00:06:04,380 --> 00:06:06,040 Rien n'empêche moi de le faire. 147 00:06:06,040 --> 00:06:08,140 Mais je dirais que c'est alors un peu ambigu. 148 00:06:08,140 --> 00:06:11,910 Parce que le rappel de lundi que nous ont affirmé que ces paramètres étaient 149 00:06:11,910 --> 00:06:13,650 des copies des valeurs transmises po 150 00:06:13,650 --> 00:06:15,640 Donc ça salit avec votre esprit, je pense, si vous utilisez 151 00:06:15,640 --> 00:06:17,370 exactement les mêmes variables. 152 00:06:17,370 --> 00:06:20,150 >> Je vais donc plutôt les appeler un et b, juste pour plus de clarté. 153 00:06:20,150 --> 00:06:21,840 Mais nous pourrions appeler plus tout ce que nous voulons. 154 00:06:21,840 --> 00:06:26,280 Et je vais copier et coller efficacement ce code de là-haut 155 00:06:26,280 --> 00:06:27,170 vers le bas dans ici. 156 00:06:27,170 --> 00:06:29,110 Parce que je viens de voir que cela fonctionne. 157 00:06:29,110 --> 00:06:30,790 C'est donc en assez bonne forme. 158 00:06:30,790 --> 00:06:37,390 Et je vais changer mon x à un, ma x à un, mon y à b et b à mon y. 159 00:06:37,390 --> 00:06:39,130 >> Donc, en d'autres termes, même logique exact. 160 00:06:39,130 --> 00:06:40,850 Exactement la même chose que Jess a fait. 161 00:06:40,850 --> 00:06:44,350 Et puis la seule chose que j'ai à faire jusqu'à ici, bien sûr, est désormais invoquer cette 162 00:06:44,350 --> 00:06:45,990 fonction, ou appeler cette fonction. 163 00:06:45,990 --> 00:06:50,430 Je vais donc appeler cette fonction avec deux entrées, x et y, et appuyez sur Enregistrer. 164 00:06:50,430 --> 00:06:52,300 >> D'accord, donc fondamentalement la même chose. 165 00:06:52,300 --> 00:06:55,570 En fait, j'ai probablement fait le programme inutilement complexe par 166 00:06:55,570 --> 00:07:00,820 écrire une fonction qui vient de prendre quelque six lignes de code alors que je 167 00:07:00,820 --> 00:07:02,970 précédemment avaient mis en œuvre ce en seulement trois. 168 00:07:02,970 --> 00:07:06,230 >> Alors laissez-moi aller de l'avant maintenant et refais cela, ne font aucune swap. 169 00:07:06,230 --> 00:07:07,920 D'accord, j'ai merdé ici. 170 00:07:07,920 --> 00:07:11,290 Ce doit être une erreur que vous pourriez voir de plus en plus souvent que votre 171 00:07:11,290 --> 00:07:12,380 programmes deviennent plus complexes. 172 00:07:12,380 --> 00:07:13,470 Mais il ya une solution facile. 173 00:07:13,470 --> 00:07:15,650 Permettez-moi de revenir en arrière ici. 174 00:07:15,650 --> 00:07:18,190 >> Et quelle est la première erreur que je vois? 175 00:07:18,190 --> 00:07:19,520 Déclaration implicite. 176 00:07:19,520 --> 00:07:21,466 Qu'est-ce que cela indique en général? 177 00:07:21,466 --> 00:07:22,830 Oh, j'ai oublié le prototype. 178 00:07:22,830 --> 00:07:26,900 J'ai oublié d'enseigner le compilateur qui échangent va exister même s'il 179 00:07:26,900 --> 00:07:28,920 n'existe pas au tout début du programme. 180 00:07:28,920 --> 00:07:35,780 Alors je vais juste dire nulle, swap, int, int a b, point-virgule. 181 00:07:35,780 --> 00:07:37,280 >> Donc, je ne vais pas réimplémenter. 182 00:07:37,280 --> 00:07:39,140 Mais maintenant, il correspond à ce qui est ici-bas. 183 00:07:39,140 --> 00:07:42,530 Et remarquez, l'absence d'un point-virgule ici, ce qui n'est pas nécessaire lorsque 184 00:07:42,530 --> 00:07:43,200 la mise en œuvre. 185 00:07:43,200 --> 00:07:46,010 >> Permettez-moi donc refais cela, assurez-pas swap. 186 00:07:46,010 --> 00:07:46,910 Bien meilleure forme. 187 00:07:46,910 --> 00:07:48,130 Exécuter sans swap. 188 00:07:48,130 --> 00:07:48,740 Et bon sang. 189 00:07:48,740 --> 00:07:51,650 Maintenant, nous sommes de retour là où nous étions le lundi, où la chose n'a pas swap. 190 00:07:51,650 --> 00:07:55,410 >> Et quelle est l'explication intuitive pour expliquer pourquoi c'est le cas? 191 00:07:55,410 --> 00:07:56,380 Ouais? 192 00:07:56,380 --> 00:07:57,630 >> ETUDIANT: [inaudible]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID MALAN: Exactement. 195 00:08:05,230 --> 00:08:07,330 Donc a et b sont des copies de x et y. 196 00:08:07,330 --> 00:08:10,680 Et en fait, chaque fois que vous avez été appel d'une fonction jusque-là que 197 00:08:10,680 --> 00:08:12,540 passe des variables comme ints - 198 00:08:12,540 --> 00:08:14,470 juste comme swap attend ici - 199 00:08:14,470 --> 00:08:16,270 Vous avez été le passage dans les copies. 200 00:08:16,270 --> 00:08:19,150 >> Maintenant, ce qui signifie qu'il faut un peu de temps, d'une fraction de seconde, par l' 201 00:08:19,150 --> 00:08:23,270 ordinateur pour copier les bits de l'un variable dans les bits de l'autre. 202 00:08:23,270 --> 00:08:24,610 Mais ce n'est pas une grosse affaire. 203 00:08:24,610 --> 00:08:25,920 Mais ils sont tout de même une copie. 204 00:08:25,920 --> 00:08:30,020 >> Et maintenant, dans le cadre du swap, Je suis en fait avec succès 205 00:08:30,020 --> 00:08:31,180 changeant a et b. 206 00:08:31,180 --> 00:08:33,000 En fait, nous allons faire un rapide bilan de santé. 207 00:08:33,000 --> 00:08:36,830 Imprimer une f% i, nouvelle ligne. 208 00:08:36,830 --> 00:08:38,770 Et la fiche de laisser passer un. 209 00:08:38,770 --> 00:08:41,830 Maintenant, nous allons faire la même chose avec b. 210 00:08:41,830 --> 00:08:43,640 Et nous allons faire la même chose ici. 211 00:08:43,640 --> 00:08:47,260 >> Et maintenant, permettez-moi de copier ces mêmes lignes encore une fois au fond de la fonction 212 00:08:47,260 --> 00:08:51,250 après mes trois lignes d'intéressant auraient exécuté, et 213 00:08:51,250 --> 00:08:53,270 imprimer A et B encore une fois. 214 00:08:53,270 --> 00:08:56,030 Alors maintenant, nous allons faire ceci, faire aucun swap. 215 00:08:56,030 --> 00:08:58,430 Permettez-moi de la fenêtre du terminal un peu plus grand, de sorte que nous pouvons voir 216 00:08:58,430 --> 00:08:59,520 plus de lui à la fois. 217 00:08:59,520 --> 00:09:00,860 >> Et lancez pas de swap. 218 00:09:00,860 --> 00:09:04,000 x est 1, y est égal à 2. a est 1, b est égal à 2. 219 00:09:04,000 --> 00:09:06,070 Et puis, un est 2, b est 1. 220 00:09:06,070 --> 00:09:09,390 Donc, il travaille, tout comme Jess fait ici à l'intérieur de swap. 221 00:09:09,390 --> 00:09:13,090 Mais bien sûr, il est sans effet sur les variables principale. 222 00:09:13,090 --> 00:09:15,360 >> Donc, nous avons vu un truc qui nous pourrait résoudre ce problème, non? 223 00:09:15,360 --> 00:09:19,560 Lorsque vous êtes confronté à cette portée question, vous pouvez simplement botté et faire x 224 00:09:19,560 --> 00:09:22,400 et y quel type de variables à la place? 225 00:09:22,400 --> 00:09:23,390 >> Vous pourriez faire global. 226 00:09:23,390 --> 00:09:27,560 Mettez-les au tout début du fichier comme nous l'avons fait, même dans le jeu de 15. 227 00:09:27,560 --> 00:09:28,890 Nous utilisons une variable globale. 228 00:09:28,890 --> 00:09:32,420 Mais dans le cadre du jeu à 15, il est raisonnable d'avoir une approche globale 229 00:09:32,420 --> 00:09:37,170 variable représentant le conseil, parce que la totalité de l'ensemble est 15.c 230 00:09:37,170 --> 00:09:38,650 sur la mise en œuvre de ce match. 231 00:09:38,650 --> 00:09:41,470 C'est ce que le fichier existe à faire. 232 00:09:41,470 --> 00:09:44,170 >> Mais dans ce cas là, je suis appeler un swap de fonction. 233 00:09:44,170 --> 00:09:45,380 Je veux échanger deux variables. 234 00:09:45,380 --> 00:09:48,950 Et il devrait commencer à se sentir tout simplement bâclée si la solution à tous nos 235 00:09:48,950 --> 00:09:51,300 problèmes lorsque nous nous heurtons à portée questions est de rendre la planète. 236 00:09:51,300 --> 00:09:54,730 Parce que très rapidement notre programme est va devenir tout un gâchis. 237 00:09:54,730 --> 00:09:57,760 Et nous l'avons fait très peu à la suite dans 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Mais il s'avère qu'il ya une meilleure façon tout à fait. 239 00:10:00,470 --> 00:10:05,600 Permettez-moi de réellement revenir en arrière et supprimer les imprimer f est, juste pour simplifier ce code. 240 00:10:05,600 --> 00:10:09,160 Et permettez-moi de proposer que ce, en effet, est mauvais. 241 00:10:09,160 --> 00:10:15,990 Mais si j'ajoute place dans certains astérisques et les étoiles, je peux transformer ce lieu 242 00:10:15,990 --> 00:10:18,670 fonction dans celle qui est en réalité opérationnelle. 243 00:10:18,670 --> 00:10:25,020 >> Alors permettez-moi de revenir ici et j'avoue dire astérisques est toujours difficile, 244 00:10:25,020 --> 00:10:26,170 donc je dirai étoiles. 245 00:10:26,170 --> 00:10:27,660 Je vais Fess jusqu'à celle-ci. 246 00:10:27,660 --> 00:10:28,190 Très bien. 247 00:10:28,190 --> 00:10:30,190 Et maintenant, que vais-je faire à la place? 248 00:10:30,190 --> 00:10:34,130 >> Alors tout d'abord, je vais préciser qu'au lieu de passer un int en 249 00:10:34,130 --> 00:10:37,980 la fonction de permutation, je suis plutôt d'aller dire int étoile. 250 00:10:37,980 --> 00:10:39,170 Maintenant, qu'est-ce que l'étoile indique? 251 00:10:39,170 --> 00:10:41,970 C'est cette notion d'un pointeur qui Binky, le personnage de pâte à modeler, était 252 00:10:41,970 --> 00:10:43,465 se référant à l'heure. 253 00:10:43,465 --> 00:10:47,610 >> Donc, si nous disons int étoiles, le sens de ce qui est maintenant un ne va pas être 254 00:10:47,610 --> 00:10:49,110 passée par sa valeur. 255 00:10:49,110 --> 00:10:50,350 Ça ne va pas être copié po 256 00:10:50,350 --> 00:10:54,700 Au contraire, l'adresse d'un est va être passé po 257 00:10:54,700 --> 00:10:57,840 >> Donc, rappeler que l'intérieur de votre ordinateur est tout un tas de mémoire, sinon 258 00:10:57,840 --> 00:10:58,760 connu sous le nom de RAM. 259 00:10:58,760 --> 00:11:00,520 Et que la RAM est juste un tas d'octets. 260 00:11:00,520 --> 00:11:03,320 Donc, si votre Mac ou votre PC dispose d' deux gigaoctets, vous avez 2 261 00:11:03,320 --> 00:11:05,760 milliard d'octets de mémoire. 262 00:11:05,760 --> 00:11:08,440 >> Maintenant, nous allons simplement supposer que juste à garder les choses bien et ordonnée, nous 263 00:11:08,440 --> 00:11:09,450 attribuer une adresse - 264 00:11:09,450 --> 00:11:10,170 un certain nombre - 265 00:11:10,170 --> 00:11:12,270 pour chaque octet de RAM dans votre ordinateur. 266 00:11:12,270 --> 00:11:15,410 Le premier octet de ces 2 milliards sont en nombre égal à zéro. 267 00:11:15,410 --> 00:11:18,572 Le prochain est l'octet numéro un, numéro deux, tout le chemin sur place, dot dot 268 00:11:18,572 --> 00:11:20,530 point, à environ 2 milliards d'euros. 269 00:11:20,530 --> 00:11:23,640 >> Ainsi, vous pouvez nombre d'octets de mémoire dans votre ordinateur. 270 00:11:23,640 --> 00:11:26,460 Supposons donc que c'est ce que nous entendons par une adresse. 271 00:11:26,460 --> 00:11:31,360 Alors quand je vois int star, ce qui se passe à passer des contrats de swap est maintenant le 272 00:11:31,360 --> 00:11:32,830 l'adresse d'un. 273 00:11:32,830 --> 00:11:37,150 Pas sa valeur, mais quelle que soit sa postal adresse est, pour ainsi dire - 274 00:11:37,150 --> 00:11:38,810 son emplacement dans la mémoire RAM. 275 00:11:38,810 --> 00:11:41,250 >> Et de même pour b, je vais pour dire la même chose. 276 00:11:41,250 --> 00:11:42,720 Int, étoile, b. 277 00:11:42,720 --> 00:11:46,350 En aparté, techniquement l'étoile pourrait aller dans d'autres endroits. 278 00:11:46,350 --> 00:11:50,140 Mais nous allons standardiser sur l'étoile étant juste à côté du type de données. 279 00:11:50,140 --> 00:11:54,080 >> Donc échange de signature signifie maintenant, donnez-moi l'adresse d'un int, et appel 280 00:11:54,080 --> 00:11:55,400 qui adresse un. 281 00:11:55,400 --> 00:11:58,690 Et donnez-moi une autre adresse d'un INT et appelez cette adresse b. 282 00:11:58,690 --> 00:12:01,120 >> Mais maintenant mon code ici doit changer. 283 00:12:01,120 --> 00:12:03,470 Parce que si je déclare int température - 284 00:12:03,470 --> 00:12:05,580 qui est toujours de type int - 285 00:12:05,580 --> 00:12:08,700 mais je stocke dans un, Quelle valeur? 286 00:12:08,700 --> 00:12:12,870 Pour être clair, je mets un avec un le code tel qu'il est rédigé en ce moment? 287 00:12:12,870 --> 00:12:14,360 >> Je suis en train de l'emplacement dans un fichier. 288 00:12:14,360 --> 00:12:16,500 Mais je ne me soucie pas de l' lieu maintenant, non? 289 00:12:16,500 --> 00:12:21,940 Temp existe seulement troisième cup 'Jess existé, dans quel but? 290 00:12:21,940 --> 00:12:23,090 Pour stocker une valeur. 291 00:12:23,090 --> 00:12:24,830 Lait ou de jus d'orange. 292 00:12:24,830 --> 00:12:28,520 Pas de stocker effectivement l'adresse de l'une de ces choses, qui se sent un 293 00:12:28,520 --> 00:12:31,200 peu absurde dans ce réel contexte mondial de toute façon. 294 00:12:31,200 --> 00:12:34,990 >> Alors, vraiment, ce que je veux mettre en température n'est pas l'adresse d'un, mais l' 295 00:12:34,990 --> 00:12:36,180 contenu d'un. 296 00:12:36,180 --> 00:12:41,930 Donc, si a est un nombre comme 123, c'est l'octet 123e mémoire qu'une paix juste 297 00:12:41,930 --> 00:12:45,090 se trouve être occupante, que la valeur en arrive à être occupante. 298 00:12:45,090 --> 00:12:49,040 >> Si je veux aller à cette adresse, Je dois dire une étoile. 299 00:12:49,040 --> 00:12:52,610 De même, si je devais changer ce qui est à l'adresse d'un, je change 300 00:12:52,610 --> 00:12:53,570 ce pour démarrer un. 301 00:12:53,570 --> 00:12:58,185 Si je veux conserver dans ce qui est à l' l'emplacement d'un avec ce qui est à l'emplacement 302 00:12:58,185 --> 00:13:02,180 à b, b étoile étoile. 303 00:13:02,180 --> 00:13:05,340 >> Donc en bref, même si ce n'est pas assez sombrer dans encore - et je ne m'attends pas 304 00:13:05,340 --> 00:13:06,560 qu'il serait si vite - 305 00:13:06,560 --> 00:13:11,100 se rendre compte que tout ce que je fais est le préfixe ces étoiles à mes variables, 306 00:13:11,100 --> 00:13:13,350 Disant ne pas saisir les valeurs. 307 00:13:13,350 --> 00:13:14,520 Ne pas modifier les valeurs. 308 00:13:14,520 --> 00:13:17,600 Mais plutôt, allez à ces adresses et obtenir la valeur. 309 00:13:17,600 --> 00:13:21,430 Aller à cette adresse et le changement la valeur de y. 310 00:13:21,430 --> 00:13:25,500 >> Alors maintenant, permettez-moi de revenir en arrière jusqu'au sommet, juste de fixer cette ligne ici, pour 311 00:13:25,500 --> 00:13:27,690 modifier le prototype de match. 312 00:13:27,690 --> 00:13:30,280 Mais je dois maintenant faire autre chose. 313 00:13:30,280 --> 00:13:35,500 Intuitivement, si j'ai changé les types des arguments qui échangent attend, 314 00:13:35,500 --> 00:13:37,245 Que dois-je changer dans mon code? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Quand j'appelle swap. 317 00:13:40,840 --> 00:13:43,340 Parce que maintenant, ce matin Je passe à échanger encore? 318 00:13:43,340 --> 00:13:47,450 La valeur x et la valeur de y, ou le lait et les jus d'orange. 319 00:13:47,450 --> 00:13:48,510 Mais je ne veux pas faire ça. 320 00:13:48,510 --> 00:13:51,060 Je veux au lieu de passer en quoi? 321 00:13:51,060 --> 00:13:53,050 L'emplacement de x et l'emplacement de y. 322 00:13:53,050 --> 00:13:55,300 Quelles sont leurs adresses postales, pour ainsi dire. 323 00:13:55,300 --> 00:13:57,600 >> Donc, pour ce faire, il ya une esperluette. 324 00:13:57,600 --> 00:13:59,260 Ampersand genre de sons comme adresse. 325 00:13:59,260 --> 00:14:03,240 si n, esperluette, l'adresse de x, et l'adresse de y. 326 00:14:03,240 --> 00:14:06,790 Donc c'est délibéré que nous utilisons esperluette lors de l'appel de la fonction, 327 00:14:06,790 --> 00:14:10,230 et les étoiles lors de la déclaration et lorsque réalisation de la fonction. 328 00:14:10,230 --> 00:14:14,220 >> Et il suffit de penser que l'esperluette adresse de l'opérateur, et l'étoile que l' 329 00:14:14,220 --> 00:14:15,490 y aller opérateur - 330 00:14:15,490 --> 00:14:18,640 ou, plus correctement, l' opérateur de déréférencement. 331 00:14:18,640 --> 00:14:23,480 C'est donc tout un tas de mots juste pour dire que maintenant, je l'espère, le swap va 332 00:14:23,480 --> 00:14:24,440 comme correctes. 333 00:14:24,440 --> 00:14:26,550 >> Permettez-moi d'aller de l'avant et faire - 334 00:14:26,550 --> 00:14:30,940 nous allons effectivement renommer le fichier, de peur ce programme encore être appelé sans swap. 335 00:14:30,940 --> 00:14:33,240 Je prétends que nous appelons swap.c maintenant. 336 00:14:33,240 --> 00:14:35,670 Donc, assurez, swap. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, swap. 338 00:14:37,520 --> 00:14:40,210 >> Et maintenant, en effet, x = 1, y est 2. 339 00:14:40,210 --> 00:14:44,040 Et puis, x 2, y en a un. 340 00:14:44,040 --> 00:14:46,500 Eh bien nous allons voir si nous ne pouvons pas faire cela une peu différemment de ce qui est 341 00:14:46,500 --> 00:14:47,180 passe ici. 342 00:14:47,180 --> 00:14:51,250 Tout d'abord, permettez-moi de zoom avant sur notre dessin écran ici. 343 00:14:51,250 --> 00:14:54,160 Et permettez-moi de proposer un instant - et chaque fois que je dessine ici seront miroir 344 00:14:54,160 --> 00:14:58,660 là-haut - permettez-moi de proposer que voici tout un tas de mémoire, ou 345 00:14:58,660 --> 00:15:00,540 RAM, à l'intérieur de mon ordinateur. 346 00:15:00,540 --> 00:15:04,140 >> Et ce sera le numéro de morsure, disons, 1. 347 00:15:04,140 --> 00:15:05,720 Ce sera le numéro 2 octets. 348 00:15:05,720 --> 00:15:08,220 Et je vais faire tout un tas d'autres, et puis un tas de dot dot points à 349 00:15:08,220 --> 00:15:10,880 indiquent qu'il ya 2 milliards de ces choses. 350 00:15:10,880 --> 00:15:13,520 4, 5, et ainsi de suite. 351 00:15:13,520 --> 00:15:17,055 >> Donc, il ya les cinq premiers octets de la mémoire de mon ordinateur. 352 00:15:17,055 --> 00:15:17,560 Tout va bien? 353 00:15:17,560 --> 00:15:19,060 Très peu de 2 milliards d'euros. 354 00:15:19,060 --> 00:15:21,120 Mais maintenant, je vais proposer ce qui suit. 355 00:15:21,120 --> 00:15:27,490 Je vais proposer que x va mémoriser le numéro 1, et y va 356 00:15:27,490 --> 00:15:29,690 à stocker le numéro 2. 357 00:15:29,690 --> 00:15:35,000 Et permettez-moi d'aller de l'avant maintenant et représente ces valeurs comme suit. 358 00:15:35,000 --> 00:15:41,510 >> Faisons-le comme suit. 359 00:15:41,510 --> 00:15:42,870 Donnez-moi juste une seconde. 360 00:15:42,870 --> 00:15:44,150 Une seconde. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Je veux faire un peu - 363 00:15:47,560 --> 00:15:50,440 Faisons-le à nouveau. 364 00:15:50,440 --> 00:15:53,250 Sinon, je vais et en utilisant le mêmes numéros, sans le vouloir, 365 00:15:53,250 --> 00:15:54,230 plusieurs fois. 366 00:15:54,230 --> 00:15:57,320 >> Il suffit donc de sorte que nous avons des numéros différents parler, appelons cet octet 367 00:15:57,320 --> 00:16:03,391 numéro 123, 124, 125, 126, et dot dot dot. 368 00:16:03,391 --> 00:16:08,400 Et permettez-moi de prétendre maintenant que je vais mettre la valeur 1 ici, et la valeur 2 369 00:16:08,400 --> 00:16:11,990 ici, autrement connu comme x et y. 370 00:16:11,990 --> 00:16:15,300 Donc, il se trouve que c'est x, c'est y. 371 00:16:15,300 --> 00:16:18,180 >> Et juste par hasard aléatoire, le l'ordinateur, le système d'exploitation, 372 00:16:18,180 --> 00:16:21,890 arrivé à mettre x à l'endroit numéro 123. 373 00:16:21,890 --> 00:16:25,590 Et y a fini à l'emplacement 124 - 374 00:16:25,590 --> 00:16:26,330 bon sang. 375 00:16:26,330 --> 00:16:28,700 J'aurais résolu ce. 376 00:16:28,700 --> 00:16:34,040 Oh man, ce que je veux vraiment faire ça? 377 00:16:34,040 --> 00:16:37,340 Oui, je veux résoudre ce problème et b appropriée à ce sujet aujourd'hui. 378 00:16:37,340 --> 00:16:39,950 Désolé, novice en la matière. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, et je ne voulais pas être cette complexe, mais pourquoi n'ai-je changer le 380 00:16:45,020 --> 00:16:46,340 nombre là-bas? 381 00:16:46,340 --> 00:16:48,360 Parce que je veux que les ints à en fait de quatre octets. 382 00:16:48,360 --> 00:16:49,810 Donc, nous allons être super anal à ce sujet. 383 00:16:49,810 --> 00:16:53,800 Alors que si 1 arrive à être abordée 123, le 2 va être à l'adresse 384 00:16:53,800 --> 00:16:55,730 127 parce que c'est seulement 4 adieux loin. 385 00:16:55,730 --> 00:16:56,210 Voilà tout. 386 00:16:56,210 --> 00:16:58,640 Et nous oublions tous les autres adresses dans le monde. 387 00:16:58,640 --> 00:17:03,320 >> Alors x est à l'emplacement 123, y est à l'emplacement 127. 388 00:17:03,320 --> 00:17:05,770 Et maintenant, que dois-je réellement envie de faire? 389 00:17:05,770 --> 00:17:10,099 Quand j'appelle virtuelle maintenant, ce qui est passe réellement? 390 00:17:10,099 --> 00:17:14,920 Eh bien, quand je l'appelle swap, je suis de passage dans l'adresse de l'adresse x et de y. 391 00:17:14,920 --> 00:17:18,540 Ainsi, par exemple, si ces deux morceaux de papier représentent maintenant les deux 392 00:17:18,540 --> 00:17:23,510 arguments a et b de swap, que suis-je allez écrire sur le premier d'entre eux, 393 00:17:23,510 --> 00:17:27,720 que je vais appeler appeler une? 394 00:17:27,720 --> 00:17:30,610 >> Exactement, 123. 395 00:17:30,610 --> 00:17:31,905 Donc, ce que je prétends est un. 396 00:17:31,905 --> 00:17:32,955 C'est le paramètre a. 397 00:17:32,955 --> 00:17:35,856 Je mets l'adresse de x à y. 398 00:17:35,856 --> 00:17:38,152 >> Qu'est-ce que c'est? 399 00:17:38,152 --> 00:17:40,890 >> Qu'est-ce que c'est? 400 00:17:40,890 --> 00:17:41,190 >> Non, non. 401 00:17:41,190 --> 00:17:41,720 C'est OK. 402 00:17:41,720 --> 00:17:42,570 Toujours bon, toujours bon. 403 00:17:42,570 --> 00:17:43,530 Il s'agit donc d'un. 404 00:17:43,530 --> 00:17:46,240 Et maintenant sur le deuxième morceau de papier, cela va être b, et ce que je 405 00:17:46,240 --> 00:17:49,010 va être écrit sur ce morceau de papier? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Donc, la seule chose qui a changé depuis notre précédent récit de cette histoire est, 408 00:17:53,720 --> 00:17:58,590 plutôt que littéralement 1 et 2, je suis va passer à 123 et 127. 409 00:17:58,590 --> 00:18:02,130 Et je vais maintenant mettre ces intérieur de cette boîte, d'accord? 410 00:18:02,130 --> 00:18:04,640 Alors que la boîte noire représente désormais la fonction de permutation. 411 00:18:04,640 --> 00:18:07,230 >> Pendant ce temps, nous allons avoir maintenant quelqu'un mettre en œuvre la fonction de permutation. 412 00:18:07,230 --> 00:18:09,090 Est-ce que quelqu'un ici faire du bénévolat? 413 00:18:09,090 --> 00:18:09,560 Venez sur place. 414 00:18:09,560 --> 00:18:11,080 Quel est votre nom? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Très bien, Charlie. 417 00:18:12,080 --> 00:18:14,810 Venez sur place. 418 00:18:14,810 --> 00:18:17,310 >> Alors, Charlie va jouer le rôle de notre boîte noire. 419 00:18:17,310 --> 00:18:21,460 Et Charlie, ce que je voudrais que vous fassiez maintenant, c'est la mise en œuvre échange de manière 420 00:18:21,460 --> 00:18:25,320 que, compte tenu de ces deux adresses, vous étiez réellement allez 421 00:18:25,320 --> 00:18:26,330 pour modifier les valeurs. 422 00:18:26,330 --> 00:18:28,290 Et je vais chuchoter dans votre oreille comment faire fonctionner la TV ici. 423 00:18:28,290 --> 00:18:29,930 >> Alors allez-y, et vous êtes la boîte noire. 424 00:18:29,930 --> 00:18:30,920 Atteindre là-dedans. 425 00:18:30,920 --> 00:18:34,054 Quelles sont les valeurs que vous voyez un, et Quelles sont les valeurs voyez-vous pour b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: une de 123 et b est de 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID MALAN: OK, exactement. 428 00:18:37,530 --> 00:18:38,940 Maintenant s'y arrêter pour un instant. 429 00:18:38,940 --> 00:18:41,680 La première chose que vous allez faire maintenant, selon le code - qui 430 00:18:41,680 --> 00:18:43,220 Je vais maintenant tirer sur l'écran - 431 00:18:43,220 --> 00:18:46,750 va être d'allouer un peu peu de mémoire appelée température. 432 00:18:46,750 --> 00:18:48,850 Donc, je vais aller de l'avant et vous donner cette mémoire. 433 00:18:48,850 --> 00:18:52,210 >> Donc cela va être une troisième variable que vous avez accès à 434 00:18:52,210 --> 00:18:54,080 vous avez appelé Temp. 435 00:18:54,080 --> 00:18:57,120 Et qu'est-ce que vous allez écrire sur la pièce temp de papier? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: pointeurs, non? 438 00:19:03,470 --> 00:19:04,790 >> DAVID MALAN: OK, eh bien pas nécessairement pointeurs. 439 00:19:04,790 --> 00:19:07,230 Ainsi, la ligne de code que j'ai mis en évidence sur le côté droit, 440 00:19:07,230 --> 00:19:07,900 nous allons commencer par là. 441 00:19:07,900 --> 00:19:08,890 Il dit une étoile. 442 00:19:08,890 --> 00:19:11,670 Ainsi, un stocke actuellement le numéro 123. 443 00:19:11,670 --> 00:19:16,660 Et intuitivement, ce n'a étoiles 123 signifie? 444 00:19:16,660 --> 00:19:21,630 >> Mais précisément, si a est 123, étoile a veut dire quoi? 445 00:19:21,630 --> 00:19:22,560 La valeur d'un. 446 00:19:22,560 --> 00:19:24,580 Ou de façon plus décontractée, allez-y. 447 00:19:24,580 --> 00:19:28,620 Alors permettez-moi de proposer que, tenant la une dans votre main, aller de l'avant et à traiter que 448 00:19:28,620 --> 00:19:29,430 comme si c'est une carte. 449 00:19:29,430 --> 00:19:32,940 Et marchez-vous sur l'ordinateur de mémoire, et nous trouver ce qui est 450 00:19:32,940 --> 00:19:36,520 à l'emplacement 123. 451 00:19:36,520 --> 00:19:37,720 Exactement. 452 00:19:37,720 --> 00:19:41,100 >> Ainsi, nous voyons à l'emplacement 123 C'est ce que, évidemment? 453 00:19:41,100 --> 00:19:44,240 OK, donc quelle valeur êtes-vous va mettre en température? 454 00:19:44,240 --> 00:19:44,750 Exactement. 455 00:19:44,750 --> 00:19:45,600 Alors n'hésitez plus et le faire. 456 00:19:45,600 --> 00:19:51,280 Et notez le numéro 1 sur le morceau de papier qui est actuellement intitulé température. 457 00:19:51,280 --> 00:19:53,540 >> Et maintenant, la prochaine étape qui vous allez mettre en œuvre 458 00:19:53,540 --> 00:19:54,310 va être quoi. 459 00:19:54,310 --> 00:19:57,820 De plus, sur le côté droit de l' ligne de code suivante est la star b. b, de 460 00:19:57,820 --> 00:19:59,260 Bien sûr, stocke une adresse. 461 00:19:59,260 --> 00:20:02,270 Qui traite 127. 462 00:20:02,270 --> 00:20:06,620 Star B signifie que, parlant avec désinvolture? 463 00:20:06,620 --> 00:20:08,700 >> Aller à cet endroit. 464 00:20:08,700 --> 00:20:14,988 Alors allez-y et nous trouver ce qui est à l'emplacement 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Bien sûr, à l'emplacement 127, est toujours la valeur 2. 467 00:20:19,170 --> 00:20:24,060 Alors, qu'allez-vous maintenant au magasin tout ce qui est à l'emplacement d'une? 468 00:20:24,060 --> 00:20:26,860 Alors star moyens vont à l'emplacement d'un. 469 00:20:26,860 --> 00:20:29,770 Quel est le lieu d'un? 470 00:20:29,770 --> 00:20:30,430 >> Exactement. 471 00:20:30,430 --> 00:20:34,190 Alors maintenant, si vous voulez changer ce qui est à cet endroit - 472 00:20:34,190 --> 00:20:36,470 Je vais aller de l'avant et lance la gomme sont ici. 473 00:20:36,470 --> 00:20:37,760 Et maintenant le remettre sur la brosse. 474 00:20:37,760 --> 00:20:42,190 Quel numéro vas-tu écrire dans cette boîte vide maintenant? 475 00:20:42,190 --> 00:20:42,850 >> Exactement. 476 00:20:42,850 --> 00:20:46,470 Donc, cette ligne de code, pour être clair - et encore moi de m'arrêter ce que Charlie fait et 477 00:20:46,470 --> 00:20:51,730 souligner ici, ce qu'il vient de faire est écrire dans cette boîte à l'emplacement 123 478 00:20:51,730 --> 00:20:55,150 la valeur qui était précédemment en b. 479 00:20:55,150 --> 00:20:59,140 Et donc nous avons maintenant mis en place en effet cette deuxième ligne de code. 480 00:20:59,140 --> 00:21:01,920 >> Maintenant, malheureusement, il ya encore une ligne restante. 481 00:21:01,920 --> 00:21:04,900 Maintenant ce qui est en temp, littéralement? 482 00:21:04,900 --> 00:21:06,200 C'est évidemment le numéro un. 483 00:21:06,200 --> 00:21:07,020 Ce n'est pas une adresse. 484 00:21:07,020 --> 00:21:09,380 C'est juste un nombre, une sorte de une variable à partir de la première semaine. 485 00:21:09,380 --> 00:21:13,520 >> Et maintenant, quand vous dites étoiles B, ce qui signifie Allez à l'adresse B, qui est de 486 00:21:13,520 --> 00:21:15,090 Bien sûr ici. 487 00:21:15,090 --> 00:21:16,020 Donc, une fois que vous y arrivez - 488 00:21:16,020 --> 00:21:18,320 Je vais aller de l'avant et d'effacer ce qui est réellement là - et ce sont vous 489 00:21:18,320 --> 00:21:20,820 vais écrire maintenant à l'emplacement 127? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, qui en est un. 491 00:21:22,010 --> 00:21:23,430 >> DAVID MALAN: Temp, qui en est un. 492 00:21:23,430 --> 00:21:25,670 Et ce qui arrive à température à la fin? 493 00:21:25,670 --> 00:21:26,600 Eh bien, nous ne savons pas vraiment. 494 00:21:26,600 --> 00:21:27,420 Nous ne m'inquiète pas vraiment. 495 00:21:27,420 --> 00:21:31,090 Chaque fois que nous avons mis en place une fonction Jusqu'à présent, toutes les variables locales vous ont 496 00:21:31,090 --> 00:21:31,890 sont en effet local. 497 00:21:31,890 --> 00:21:33,060 Et ils disparaissent tout simplement. 498 00:21:33,060 --> 00:21:35,040 Ils sont récupérés par l'exploitation système par la suite. 499 00:21:35,040 --> 00:21:39,800 >> Donc, le fait que température a encore le valeur 1 est en quelque sorte fondamentalement 500 00:21:39,800 --> 00:21:41,150 sans intérêt pour nous. 501 00:21:41,150 --> 00:21:43,100 Très bien, alors une salve d'applaudissements si nous pouvions pour Charlie. 502 00:21:43,100 --> 00:21:46,400 Très bien fait. 503 00:21:46,400 --> 00:21:51,520 >> Bon, alors quoi de plus fait cela signifie que nous pouvons faire? 504 00:21:51,520 --> 00:21:54,400 Ainsi, il s'avère que nous avons été dire quelques mensonges 505 00:21:54,400 --> 00:21:55,540 depuis un certain temps. 506 00:21:55,540 --> 00:21:59,990 En effet, il s'avère que d'une chaîne, tout ce temps, n'est pas vraiment une 507 00:21:59,990 --> 00:22:02,190 séquence de caractères en soi. 508 00:22:02,190 --> 00:22:03,980 Il genre, c'est que intuitivement. 509 00:22:03,980 --> 00:22:08,270 >> Mais techniquement parlant, est une chaîne type de données que nous avons déclaré à l'intérieur de 510 00:22:08,270 --> 00:22:12,170 la bibliothèque CS50 de simplifier le monde pendant les premières semaines de cours. 511 00:22:12,170 --> 00:22:20,130 Qu'est-ce qu'une chaîne est vraiment, c'est l'adresse d'un caractère quelque part dans la mémoire RAM. 512 00:22:20,130 --> 00:22:25,530 Une chaîne est vraiment un numéro, comme 123 ou 127, qui arrive à délimiter 513 00:22:25,530 --> 00:22:28,420 où une chaîne commence à la mémoire de votre ordinateur. 514 00:22:28,420 --> 00:22:31,870 >> Mais il ne représente pas le Chaîne, en soi, lui-même. 515 00:22:31,870 --> 00:22:33,460 Et nous pouvons voir cela comme suit. 516 00:22:33,460 --> 00:22:35,980 Permettez-moi d'aller de l'avant et d'ouvrir un code qui est parmi 517 00:22:35,980 --> 00:22:38,340 Les exemples de code source d'aujourd'hui. 518 00:22:38,340 --> 00:22:42,225 Et je vais aller de l'avant et d'ouvrir jusqu'à, disons, comparez-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Il s'agit d'un programme bogué qui va être mis en œuvre comme suit. 521 00:22:48,790 --> 00:22:49,040 >> Première. 522 00:22:49,040 --> 00:22:50,420 Je vais dire quelque chose. 523 00:22:50,420 --> 00:22:52,660 Ensuite, je vais aller de l'avant et obtenir une chaîne de caractères à partir de l'utilisateur 524 00:22:52,660 --> 00:22:53,750 en ce que la ligne suivante. 525 00:22:53,750 --> 00:22:55,370 Ensuite, je vais le dire encore. 526 00:22:55,370 --> 00:22:57,540 Alors je vais prendre un autre Chaîne de l'utilisateur. 527 00:22:57,540 --> 00:23:00,390 >> Et remarquez, je montre l'un des chaînes dans une variable appelée S, et 528 00:23:00,390 --> 00:23:03,040 l'autre de ces cordes dans une variable appelée t. 529 00:23:03,040 --> 00:23:07,480 Et maintenant, je vais demander, très raisonnablement que, si s est égal à égal t, 530 00:23:07,480 --> 00:23:08,940 les chaînes de caractères sont les mêmes. 531 00:23:08,940 --> 00:23:09,970 Vous tapez la même chose. 532 00:23:09,970 --> 00:23:11,830 Sinon, les chaînes sont pas la même chose. 533 00:23:11,830 --> 00:23:15,440 >> Après tout, si nous saisir deux ints, deux chars, deux chars, deux doubles, chacune des 534 00:23:15,440 --> 00:23:18,400 les types de données dont nous avons parlé à ce jour pour les comparer - 535 00:23:18,400 --> 00:23:22,070 rappelons-nous dit très clairement il ya un certain temps que vous ne faites pas cela, car une 536 00:23:22,070 --> 00:23:25,840 seul signe égal est bien sûr l'opérateur d'affectation. 537 00:23:25,840 --> 00:23:26,820 Ce serait donc une erreur. 538 00:23:26,820 --> 00:23:29,260 >> Nous utilisons le signe égal égal, qui compare en effet 539 00:23:29,260 --> 00:23:31,050 choses pour une véritable égalité. 540 00:23:31,050 --> 00:23:32,275 Mais je prétends que c'est buggy. 541 00:23:32,275 --> 00:23:37,400 Si je vais de l'avant et faire comparer à zéro, et puis ne point slash comparer zéro. 542 00:23:37,400 --> 00:23:39,700 Et je tape dans, disons, bonjour. 543 00:23:39,700 --> 00:23:41,590 Et puis, disons bonjour à nouveau. 544 00:23:41,590 --> 00:23:46,040 Littéralement la même chose, l'ordinateur Allégations relatives J'ai tapé des choses différentes. 545 00:23:46,040 --> 00:23:47,640 >> Maintenant, j'ai peut-être une erreur de frappe quelque chose. 546 00:23:47,640 --> 00:23:49,910 Je tape mon nom cette fois. 547 00:23:49,910 --> 00:23:52,580 Je veux dire, bonjour. 548 00:23:52,580 --> 00:23:54,770 Bonjour. 549 00:23:54,770 --> 00:23:57,360 C'est différent à chaque fois. 550 00:23:57,360 --> 00:23:58,430 >> Eh bien, pourquoi est-ce? 551 00:23:58,430 --> 00:24:00,140 Qu'est-ce qui se passe réellement sous le capot? 552 00:24:00,140 --> 00:24:03,270 Eh bien, qu'est-ce qui se passe vraiment en dessous le capot est la chaîne puis 553 00:24:03,270 --> 00:24:07,410 J'ai tapé la première fois, par exemple, est le mot bonjour, bien sûr. 554 00:24:07,410 --> 00:24:11,660 Mais si nous représentons cette sous le capot, rappelons qu'un 555 00:24:11,660 --> 00:24:13,470 chaîne est dans un tableau. 556 00:24:13,470 --> 00:24:15,040 Et nous avons dit autant dans le passé. 557 00:24:15,040 --> 00:24:20,200 >> Donc, si je dessine ce tableau comme celui-ci, je suis va représenter quelque chose d'assez 558 00:24:20,200 --> 00:24:23,030 similaire à ce que nous avons fait il ya un moment. 559 00:24:23,030 --> 00:24:25,390 Et il ya effectivement quelque chose spécial ici, aussi. 560 00:24:25,390 --> 00:24:28,090 Qu'avons-nous déterminons était à la fin de chaque chaîne de caractères? 561 00:24:28,090 --> 00:24:30,760 Ouais, c'est zéro barre oblique inverse, qui est juste la manière de représenter, 562 00:24:30,760 --> 00:24:33,610 littéralement, 00000000. 563 00:24:33,610 --> 00:24:35,680 Huit bits à 0 dans une rangée. 564 00:24:35,680 --> 00:24:37,610 >> Je ne sais pas, franchement, ce qui est après cela. 565 00:24:37,610 --> 00:24:40,090 C'est juste une bande de plus de RAM à l'intérieur de mon ordinateur. 566 00:24:40,090 --> 00:24:40,970 Mais c'est un tableau. 567 00:24:40,970 --> 00:24:42,260 Nous avons parlé de tableaux avant. 568 00:24:42,260 --> 00:24:45,010 Et nous parlons généralement sur les tableaux comme lieu de zéro, 569 00:24:45,010 --> 00:24:46,580 puis un, puis deux. 570 00:24:46,580 --> 00:24:47,950 Mais ce n'est que pour plus de commodité. 571 00:24:47,950 --> 00:24:49,380 Et c'est tout à fait relative. 572 00:24:49,380 --> 00:24:53,010 >> Lorsque vous êtes en train de faire mémoire de l'ordinateur, c'est bien sûr tout 573 00:24:53,010 --> 00:24:55,450 2 milliards d'octets certains impairs, potentiellement. 574 00:24:55,450 --> 00:24:59,100 Alors, vraiment sous le capot, tout ce temps, oui. 575 00:24:59,100 --> 00:25:01,670 Cela pourrait très bien être zéro de support. 576 00:25:01,670 --> 00:25:04,780 Mais si vous creusez plus profond sous le capot, c'est vraiment 577 00:25:04,780 --> 00:25:07,000 adresse, numéro 123. 578 00:25:07,000 --> 00:25:09,150 C'est l'adresse 124. 579 00:25:09,150 --> 00:25:11,040 C'est l'adresse 125. 580 00:25:11,040 --> 00:25:12,540 >> Et je n'ai pas bousiller ce moment. 581 00:25:12,540 --> 00:25:15,840 Ce sont maintenant une bytes à part pour quelle raison? 582 00:25:15,840 --> 00:25:17,930 Quelle est la taille d'un chevalier? 583 00:25:17,930 --> 00:25:19,170 Un char est juste un octet. 584 00:25:19,170 --> 00:25:20,570 Un int est généralement de quatre octets. 585 00:25:20,570 --> 00:25:24,850 C'est pour ça que je l'ai fait 123, 127, 131 et ainsi de suite. 586 00:25:24,850 --> 00:25:27,560 Maintenant, je peux garder le calcul simple et juste faire plus 1. 587 00:25:27,560 --> 00:25:30,510 Et c'est maintenant ce qui se passe réellement le dessous de la hotte. 588 00:25:30,510 --> 00:25:37,760 >> Ainsi, lorsque vous déclarez quelque chose comme ça, string s, c'est en fait - 589 00:25:37,760 --> 00:25:39,170 il s'avère - 590 00:25:39,170 --> 00:25:41,190 étoiles caractères. 591 00:25:41,190 --> 00:25:44,640 Star, bien sûr, signifie adresse, pointeur aka. 592 00:25:44,640 --> 00:25:46,200 Donc, c'est l'adresse de quelque chose. 593 00:25:46,200 --> 00:25:47,510 Qu'est-ce que l'adresse? 594 00:25:47,510 --> 00:25:47,760 >> Eh bien - 595 00:25:47,760 --> 00:25:51,680 Je suis le seul qui peut voir le très point important que je fais, ou de penser 596 00:25:51,680 --> 00:25:52,560 Je fais. 597 00:25:52,560 --> 00:25:55,270 Alors string - 598 00:25:55,270 --> 00:25:57,180 Le plus triste est que j'ai un moniteur là où je 599 00:25:57,180 --> 00:25:58,100 aurait vu cela. 600 00:25:58,100 --> 00:26:00,990 >> Très bien, alors chaîne s est ce J'ai déclaré précédemment. 601 00:26:00,990 --> 00:26:04,600 Mais il s'avère, grâce à un peu magie dans la bibliothèque CS50, tout cela 602 00:26:04,600 --> 00:26:08,780 chaîne d'heure a littéralement étoiles caractères été. 603 00:26:08,780 --> 00:26:11,310 L'étoile signifie à nouveau pointeur ou adresse. 604 00:26:11,310 --> 00:26:14,180 Le fait que ça flanquant la caractère mot signifie que c'est le 605 00:26:14,180 --> 00:26:15,970 adresse d'un personnage. 606 00:26:15,970 --> 00:26:23,100 >> Donc, si obtenir chaîne est appelé, et je tape en H-E-L-L-O, proposer maintenant ce faire a 607 00:26:23,100 --> 00:26:27,330 chaîne littéralement rentrait tous cette fois, même si nous avons plutôt 608 00:26:27,330 --> 00:26:29,980 simpliste du monde? 609 00:26:29,980 --> 00:26:33,310 Ce qui ne se fait string retourner sa valeur de retour? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 dans ce cas, par exemple. 612 00:26:38,720 --> 00:26:42,630 Nous avons déjà dit que se string retourne simplement une chaîne, une séquence de 613 00:26:42,630 --> 00:26:43,300 caractères. 614 00:26:43,300 --> 00:26:44,790 Mais c'est un peu un mensonge. 615 00:26:44,790 --> 00:26:48,010 La façon dont se string fonctionne vraiment sous le capot est elle obtient un 616 00:26:48,010 --> 00:26:48,930 Chaîne de l'utilisateur. 617 00:26:48,930 --> 00:26:51,530 Il fait flac les caractères il ou elle types de mémoire. 618 00:26:51,530 --> 00:26:54,680 Il met un zéro de barre oblique inverse à la fin ceux de séquence de caractères. 619 00:26:54,680 --> 00:26:57,310 >> Mais alors qu'est-get ne string littéralement retourner? 620 00:26:57,310 --> 00:27:02,710 Il retourne littéralement l'adresse de l' premiers octets de la mémoire vive que 621 00:27:02,710 --> 00:27:04,130 a utilisé pour cette force. 622 00:27:04,130 --> 00:27:07,500 Et il s'avère que, tout en renvoyant une adresse unique de l' 623 00:27:07,500 --> 00:27:12,120 premier caractère de la chaîne, qui est suffisant pour trouver la totalité de 624 00:27:12,120 --> 00:27:12,630 la chaîne. 625 00:27:12,630 --> 00:27:16,930 >> En d'autres termes, obtenir chaîne n'a pas pour revenir 123 et 124 et 125. 626 00:27:16,930 --> 00:27:19,950 Il n'a pas à me donner une longue la liste de tous les octets qui 627 00:27:19,950 --> 00:27:20,740 ma chaîne utilise. 628 00:27:20,740 --> 00:27:22,670 Parce que l'un, ils sont tous dos à dos. 629 00:27:22,670 --> 00:27:28,160 Et de deux, basé sur la première adresse, je peut comprendre où la chaîne se termine. 630 00:27:28,160 --> 00:27:29,910 Comment? 631 00:27:29,910 --> 00:27:33,490 >> Le caractère nul spéciale, l' backslasher zéro à la fin. 632 00:27:33,490 --> 00:27:35,430 Donc, en d'autres termes, si vous passez autour - 633 00:27:35,430 --> 00:27:36,530 à l'intérieur de variables - 634 00:27:36,530 --> 00:27:41,300 l'adresse d'un char, et vous assumez que, à la fin d'une chaîne de caractères, une 635 00:27:41,300 --> 00:27:45,040 séquence de caractères que nous, les humains penser à cordes, si vous supposez que 636 00:27:45,040 --> 00:27:48,600 à la fin d'une telle chaîne, il ya un zéro barre oblique inverse, vous êtes d'or. 637 00:27:48,600 --> 00:27:52,430 Parce que vous pouvez toujours trouver la fin d'une chaîne. 638 00:27:52,430 --> 00:27:54,870 >> Maintenant, ce qui est vraiment d'aller ensuite dans ce programme? 639 00:27:54,870 --> 00:27:59,990 Pourquoi est ce programme, compare-0.c, poussette? 640 00:27:59,990 --> 00:28:01,690 Qu'est-ce qui est réellement en comparaison? 641 00:28:01,690 --> 00:28:02,420 Ouais? 642 00:28:02,420 --> 00:28:05,000 >> ETUDIANT: [inaudible]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID MALAN: Exactement. 644 00:28:05,730 --> 00:28:08,350 C'est en comparant les locations des cordes. 645 00:28:08,350 --> 00:28:12,420 Donc, si l'utilisateur a tapé dans bonjour une fois, comme je l'ai fait, la mémoire pourrait finir 646 00:28:12,420 --> 00:28:13,430 ressemblant à ceci. 647 00:28:13,430 --> 00:28:18,210 Si l'utilisateur tape ensuite dans Bonjour à nouveau, mais en appelant obtenir à nouveau string, c est 648 00:28:18,210 --> 00:28:21,800 pas particulièrement intelligent, sauf si vous enseignez qu'il soit intelligent en écrivant du code. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 et plus généralement les ordinateurs - 651 00:28:23,860 --> 00:28:27,370 si vous tapez le mot bonjour à nouveau, vous savez ce que vous allez obtenir. 652 00:28:27,370 --> 00:28:31,480 Vous allez juste pour obtenir un second réseau de mémoire, oui, arrive-être 653 00:28:31,480 --> 00:28:35,510 stocker H-E-L-L-S, etc. 654 00:28:35,510 --> 00:28:38,240 >> Il va chercher la même chose pour nous, les humains, mais cette adresse 655 00:28:38,240 --> 00:28:39,460 pourrait ne pas être 123. 656 00:28:39,460 --> 00:28:42,470 Il pourrait bien arriver que l' système d'exploitation offre quelques uns d' 657 00:28:42,470 --> 00:28:45,430 espace par exemple à l'emplacement - 658 00:28:45,430 --> 00:28:49,820 disons quelque chose d'arbitraire, comme cela est l'emplacement 200. 659 00:28:49,820 --> 00:28:51,620 Et ce n'est emplacement 201. 660 00:28:51,620 --> 00:28:53,060 Et ce n'est emplacement 202. 661 00:28:53,060 --> 00:28:55,730 Nous n'avons aucune idée où c'est va être en mémoire. 662 00:28:55,730 --> 00:28:59,110 >> Mais ce que cela signifie, c'est que ce qui est va être stocké en fin de compte à s? 663 00:28:59,110 --> 00:29:00,750 Le nombre 123. 664 00:29:00,750 --> 00:29:04,860 Qu'est-ce qui se passe pour être stocké dans t, Dans cet exemple arbitraire? 665 00:29:04,860 --> 00:29:06,300 Le nombre 200. 666 00:29:06,300 --> 00:29:11,410 Et tout cela signifie alors est évidemment, 123 n'est pas égale à 200. 667 00:29:11,410 --> 00:29:14,940 Et si cette situation si jamais évalue à true. 668 00:29:14,940 --> 00:29:18,430 Parce chaîne get utilise différents morceaux de mémoire à chaque fois. 669 00:29:18,430 --> 00:29:20,360 >> Maintenant, nous pouvons voir ce message Dans un autre exemple. 670 00:29:20,360 --> 00:29:23,764 Permettez-moi d'aller de l'avant et d'ouvrir la copie 0.c. 671 00:29:23,764 --> 00:29:28,770 Je prétends que cet exemple va essayer - mais ne parviennent pas - de copier deux chaînes 672 00:29:28,770 --> 00:29:29,910 comme suit. 673 00:29:29,910 --> 00:29:31,730 >> Je vais dire quelque chose à l'utilisateur. 674 00:29:31,730 --> 00:29:34,490 Je suis alors allez obtenir un chaîne et appeler s. 675 00:29:34,490 --> 00:29:36,400 Et maintenant, je fais ce test ici. 676 00:29:36,400 --> 00:29:37,990 Nous en avons parlé un retour de tout. 677 00:29:37,990 --> 00:29:42,490 Mais quand Might Get chaîne return null, un autre caractère spécial ou spéciaux 678 00:29:42,490 --> 00:29:45,050 symbole nous a laissés dire. 679 00:29:45,050 --> 00:29:45,900 Si c'est de mémoire. 680 00:29:45,900 --> 00:29:48,970 >> Par exemple, si l'utilisateur est vraiment être difficile et types atroce 681 00:29:48,970 --> 00:29:51,220 nombre de caractères à l' clavier et touche Entrée. 682 00:29:51,220 --> 00:29:54,580 Si ce nombre de caractères ne peuvent tout simplement pas tenir en mémoire vive pour une folle 683 00:29:54,580 --> 00:29:57,820 raison, bien obtenir chaîne peut très bien retourner null. 684 00:29:57,820 --> 00:30:01,080 >> Ou si votre programme lui-même fait beaucoup d'autres choses et il ya juste 685 00:30:01,080 --> 00:30:03,790 pas assez de mémoire pour la chaîne get Pour réussir, il pourrait finir 686 00:30:03,790 --> 00:30:05,240 par retourner null. 687 00:30:05,240 --> 00:30:07,160 Mais soyons plus précis pour ce que c'est. 688 00:30:07,160 --> 00:30:10,280 Quel est le type de données est vraiment? 689 00:30:10,280 --> 00:30:11,610 Étoiles Char. 690 00:30:11,610 --> 00:30:14,560 >> Ainsi, il s'avère maintenant que nous pouvons éplucher sauvegarder la couche null. 691 00:30:14,560 --> 00:30:17,500 Il s'avère que, nulle est - oui, évidemment un symbole spécial. 692 00:30:17,500 --> 00:30:19,190 Mais quel est-il vraiment? 693 00:30:19,190 --> 00:30:25,220 Vraiment, null est juste un symbole qui nous les humains utilisent pour représenter zéro aussi. 694 00:30:25,220 --> 00:30:29,010 >> Ainsi, les auteurs de C et des ordinateurs plus généralement, a décidé il ya quelques années 695 00:30:29,010 --> 00:30:30,010 que, vous savez quoi. 696 00:30:30,010 --> 00:30:34,850 Pourquoi ne pas nous assurons qu'aucun utilisateur donnée n'est jamais, jamais, jamais 697 00:30:34,850 --> 00:30:36,730 stockée à zéro au revoir? 698 00:30:36,730 --> 00:30:39,610 En fait, même dans mon exemple arbitraire avant, je n'ai pas commencer la numérotation de la 699 00:30:39,610 --> 00:30:40,390 octets à zéro. 700 00:30:40,390 --> 00:30:41,540 J'ai commencé à un. 701 00:30:41,540 --> 00:30:44,950 Parce que je savais que les gens dans le monde ont décidé de réserver le zéro 702 00:30:44,950 --> 00:30:47,970 octet dans la mémoire vive de quelqu'un comme quelque chose de spécial. 703 00:30:47,970 --> 00:30:52,020 >> La raison étant, quand vous voulez signal que quelque chose a mal tourné 704 00:30:52,020 --> 00:30:55,960 en ce qui concerne les adresses, vous revenez null - autrement connu comme zéro - 705 00:30:55,960 --> 00:30:59,410 et parce que vous savez qu'il n'y a pas légitimer données à l'adresse zéro, clairement 706 00:30:59,410 --> 00:31:00,400 ce qui signifie qu'une erreur. 707 00:31:00,400 --> 00:31:04,080 Et c'est pourquoi nous avons, par convention, vérifions pour nulle et retour quelque chose 708 00:31:04,080 --> 00:31:06,260 comme l'un de ces cas. 709 00:31:06,260 --> 00:31:09,300 >> Donc, si nous défiler vers le bas maintenant, ce n'est que puis la vérification d'erreur, juste au cas où 710 00:31:09,300 --> 00:31:10,610 quelque chose se passait mal avec [? Bail?] 711 00:31:10,610 --> 00:31:13,470 tout à fait et quitter le programme par un retour hâtif. 712 00:31:13,470 --> 00:31:19,030 Cette ligne maintenant pourrait être réécrit celui-ci, ce qui signifie quoi? 713 00:31:19,030 --> 00:31:23,155 Sur le côté gauche, donne-moi un autre pointeur sur un caractère, et l'appeler t. 714 00:31:23,155 --> 00:31:26,935 Que vais-je stocker à l'intérieur de t, basée sur cette seule ligne de code? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Je stocker un emplacement. 717 00:31:32,170 --> 00:31:34,742 Plus précisément l'emplacement C'était en s. 718 00:31:34,742 --> 00:31:39,000 Donc, si l'utilisateur a tapé dans bonjour, et qui arrive en premier bonjour à finir 719 00:31:39,000 --> 00:31:42,567 ici, le nombre 123 est va revenir à obtenir 720 00:31:42,567 --> 00:31:43,810 String et être stockées - 721 00:31:43,810 --> 00:31:44,780 comme nous le disions plus tôt - 722 00:31:44,780 --> 00:31:45,440 à s. 723 00:31:45,440 --> 00:31:50,560 >> Lorsque je déclare un autre pointeur vers un chevalier et appeler t, ce qui est le numéro 724 00:31:50,560 --> 00:31:53,940 va littéralement se retrouver dans t en fonction de l'histoire? 725 00:31:53,940 --> 00:31:55,420 Donc 123. 726 00:31:55,420 --> 00:32:00,310 >> Donc, techniquement désormais à la fois s et t pointent à l'exact 727 00:32:00,310 --> 00:32:02,410 mêmes morceaux de mémoire. 728 00:32:02,410 --> 00:32:06,140 Donc, remarque ce que je vais faire maintenant pour prouver que ce programme est bogué. 729 00:32:06,140 --> 00:32:08,820 >> D'abord, je vais demander, avec une f d'impression, en capitalisant 730 00:32:08,820 --> 00:32:10,080 la copie de la chaîne. 731 00:32:10,080 --> 00:32:11,660 Alors je vais faire un peu Vérification des erreurs. 732 00:32:11,660 --> 00:32:12,160 Je vais m'en assurer. 733 00:32:12,160 --> 00:32:16,710 Faisons en sorte que la chaîne t est à moins supérieur à zéro dans la longueur, 734 00:32:16,710 --> 00:32:19,190 il ya donc un certain caractère il à réellement tirer profit. 735 00:32:19,190 --> 00:32:22,840 >> Et puis, vous pouvez vous rappeler ce des exemples précédents. 736 00:32:22,840 --> 00:32:25,630 2 supérieure - qui est en le fichier ctype.h. 737 00:32:25,630 --> 00:32:30,800 T support zéro me donne le zéro caractère de la chaîne t. 738 00:32:30,800 --> 00:32:34,360 Et 2 supérieure de cette même valeur, de Bien sûr, le convertit en majuscules. 739 00:32:34,360 --> 00:32:38,230 >> Alors, intuitivement, cette ligne a souligné de code est en capitalisant la première 740 00:32:38,230 --> 00:32:40,250 lettre t. 741 00:32:40,250 --> 00:32:44,485 Mais ce n'est pas capitaliser, intuitivement, la première lettre de l'art. 742 00:32:44,485 --> 00:32:48,130 Mais si vous songez à venir, que suis-je sur le point de voir quand je lance ce programme 743 00:32:48,130 --> 00:32:54,220 et imprimer à la fois de l'original, s, et la copie dite, t? 744 00:32:54,220 --> 00:32:55,350 >> Ils vont réellement être la même. 745 00:32:55,350 --> 00:32:56,600 Et pourquoi vont-ils être les mêmes? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Ils sont tous deux pointant vers exactement la même chose. 748 00:33:01,020 --> 00:33:01,610 Donc, nous allons le faire. 749 00:33:01,610 --> 00:33:03,160 >> Faire une copie zéro. 750 00:33:03,160 --> 00:33:04,070 Il compile OK. 751 00:33:04,070 --> 00:33:06,500 Permettez-moi de courir copie zéro. 752 00:33:06,500 --> 00:33:10,110 Permettez-moi de taper quelque chose comme bonjour dans tout en minuscules puis appuyez sur Entrée. 753 00:33:10,110 --> 00:33:16,520 Et il affirme que tant le s initial et la copie sont en effet identiques. 754 00:33:16,520 --> 00:33:17,920 >> Alors qu'est-ce qui s'est réellement passé ici? 755 00:33:17,920 --> 00:33:20,100 Permettez-moi de redessiner cette image juste pour raconter l'histoire d'une 756 00:33:20,100 --> 00:33:21,340 manière légèrement différente. 757 00:33:21,340 --> 00:33:26,060 Qu'est-ce qui se passe vraiment en dessous de la hotte lorsque je déclare quelque chose comme 758 00:33:26,060 --> 00:33:30,410 chevalier Commençons ou une chaîne s, Je reçois un pointeur - 759 00:33:30,410 --> 00:33:33,090 qui se trouve être de quatre octets dans l'appareil CS50 760 00:33:33,090 --> 00:33:34,410 et dans un grand nombre d'ordinateurs. 761 00:33:34,410 --> 00:33:36,008 Et je vais appeler cet art. 762 00:33:36,008 --> 00:33:39,810 Et cela a actuellement une valeur inconnue. 763 00:33:39,810 --> 00:33:43,900 >> Lorsque vous déclarez une variable, sauf si vous vous mettez une valeur là-bas, qui 764 00:33:43,900 --> 00:33:44,570 sait ce qui est là. 765 00:33:44,570 --> 00:33:48,110 Il pourrait y avoir une séquence aléatoire de les bits de l'exécution précédente. 766 00:33:48,110 --> 00:33:52,490 Alors, quand j'ai, dans ma ligne de code reçois chaîne, puis stocker le retour 767 00:33:52,490 --> 00:33:54,800 valeur en s obtenir chaîne en quelque sorte - 768 00:33:54,800 --> 00:33:58,520 et nous finirons par peler comment obtenir travaux à cordes, en quelque sorte alloue une 769 00:33:58,520 --> 00:34:00,480 tableau qui ressemble probablement un peu comme ça. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, barre oblique inverse zéro. 771 00:34:05,390 --> 00:34:09,510 >> Supposons que c'est l'adresse 123 tout d'abord la cohérence. 772 00:34:09,510 --> 00:34:13,000 Donc obtenir des rendements de chaîne, dans le ligne en surbrillance là, elle renvoie la 773 00:34:13,000 --> 00:34:15,000 Numéro nous l'avons dit, 123. 774 00:34:15,000 --> 00:34:17,420 Donc ce qui se passe vraiment à l'intérieur de s ici? 775 00:34:17,420 --> 00:34:26,590 >> Eh bien, ce qui se passe vraiment à l'intérieur de S est 123. 776 00:34:26,590 --> 00:34:29,250 Mais franchement, je suis un peu confondu par l'ensemble de ces adresses, 777 00:34:29,250 --> 00:34:30,320 tous ces chiffres arbitraires. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Donc, nous allons réellement simplifier le monde un peu. 780 00:34:34,570 --> 00:34:38,800 >> Lorsque nous parlons de pointeurs, franchement, nous, les humains, qui est le diable se soucie où 781 00:34:38,800 --> 00:34:39,870 les choses sont en mémoire? 782 00:34:39,870 --> 00:34:41,080 C'est complètement arbitraire. 783 00:34:41,080 --> 00:34:43,370 Ça va dépendre de la façon quantité de RAM que l'utilisateur possède. 784 00:34:43,370 --> 00:34:46,590 Ça va dépendre du moment de la journée vous exécutez le programme, peut-être, et 785 00:34:46,590 --> 00:34:48,250 quelle entrée l'utilisateur vous donne. 786 00:34:48,250 --> 00:34:50,060 Nous sommes s'attarder sur des détails sans importance. 787 00:34:50,060 --> 00:34:54,230 >> Donc le résumé de let loin et dire que, lorsque vous exécutez une ligne de code comme celui-ci, 788 00:34:54,230 --> 00:34:57,320 omble étoile s obtient le retour valeur de chaîne GET. 789 00:34:57,320 --> 00:35:02,720 Pourquoi n'avons-nous pas plutôt juste attirons ce que nous continuer à appeler un pointeur comme s'il s'agissait d' 790 00:35:02,720 --> 00:35:04,140 pointant à quelque chose? 791 00:35:04,140 --> 00:35:07,000 Donc je prétends maintenant que s up il existe un pointeur - 792 00:35:07,000 --> 00:35:08,480 sous le capot, c'est une adresse. 793 00:35:08,480 --> 00:35:11,330 Mais c'est juste pointant vers le premier octet dans l' 794 00:35:11,330 --> 00:35:12,780 chaîne qui a été retourné. 795 00:35:12,780 --> 00:35:16,710 >> Si je reviens maintenant au code ici, ce qui se passe sur cette ligne? 796 00:35:16,710 --> 00:35:20,020 Eh bien, dans cette ligne en surbrillance maintenant, Je déclarant apparemment un autre 797 00:35:20,020 --> 00:35:21,070 variable appelée t. 798 00:35:21,070 --> 00:35:25,700 Mais c'est aussi un pointeur, donc je vais pour dessiner comme, en théorie, exactement 799 00:35:25,700 --> 00:35:26,710 même boîte de taille. 800 00:35:26,710 --> 00:35:28,160 Et je vais l'appeler t. 801 00:35:28,160 --> 00:35:33,500 >> Et maintenant, si nous revenons à nouveau le code, quand je stocke s à l'intérieur de t, 802 00:35:33,500 --> 00:35:36,920 ce que je suis techniquement mettre à l'intérieur de la t? 803 00:35:36,920 --> 00:35:39,350 Eh bien, techniquement, cette était le numéro 123. 804 00:35:39,350 --> 00:35:42,270 Alors, vraiment, je devrais écrire le numéro 123 là-bas. 805 00:35:42,270 --> 00:35:43,900 Mais prenons le plus haut niveau. 806 00:35:43,900 --> 00:35:48,090 t, si elle est juste un pointeur, intuitivement, c'est exactement cela. 807 00:35:48,090 --> 00:35:49,800 C'est tout ce qui est en cours stocké à l'intérieur. 808 00:35:49,800 --> 00:35:54,970 >> Alors maintenant, dans les dernières lignes intéressantes du code, quand je vais en fait sur 809 00:35:54,970 --> 00:36:00,680 capitalisant le caractère zéro en t, ce qui se passe? 810 00:36:00,680 --> 00:36:06,310 Eh bien, t support zéro est désormais pointé à ce personnage, sans doute? 811 00:36:06,310 --> 00:36:07,460 >> Il pointe vers h. 812 00:36:07,460 --> 00:36:08,870 Parce t support de zéro - 813 00:36:08,870 --> 00:36:12,490 Rappel, c'est l'ancienne syntaxe. t support zéro signifie simplement que si t est une chaîne, t 814 00:36:12,490 --> 00:36:15,590 support de zéro signifie obtenir le zéro caractère en ce que la force. 815 00:36:15,590 --> 00:36:18,650 Alors qu'est-ce que cela signifie vraiment est d'aller à ce tableau - 816 00:36:18,650 --> 00:36:21,520 et oui, cela pourrait être 123, cela pourrait être 124. 817 00:36:21,520 --> 00:36:22,790 Mais tout est relatif, rappelez-vous. 818 00:36:22,790 --> 00:36:25,640 Chaque fois parler d'un tableau, nous avons l'avantage de parler 819 00:36:25,640 --> 00:36:27,000 les indices relatifs. 820 00:36:27,000 --> 00:36:31,120 >> Et maintenant, nous pouvons simplement supposer que t est zéro support h. 821 00:36:31,120 --> 00:36:35,090 Donc, si j'appelle 2 supérieure sur elle, ce que c'est faire est vraiment capitaliser 822 00:36:35,090 --> 00:36:38,290 l'h minuscule à majuscule H. Mais bien sûr, ce qui est s? 823 00:36:38,290 --> 00:36:41,010 C'est pointant vers la même chaîne sacrément. 824 00:36:41,010 --> 00:36:44,200 >> Donc, c'est tout ce qui se passe dans ce code jusqu'ici. 825 00:36:44,200 --> 00:36:45,960 Alors, quelle est alors la conséquence? 826 00:36:45,960 --> 00:36:48,300 Comment pouvons-nous résoudre ces deux problèmes? 827 00:36:48,300 --> 00:36:50,870 Comment nous comparons-nous à cordes réelles? 828 00:36:50,870 --> 00:36:53,720 >> Eh bien, intuitivement, comment vous allez sur la comparaison de deux 829 00:36:53,720 --> 00:36:55,090 cordes pour une véritable égalité? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Qu'est-ce que cela signifie si deux chaînes sont égales? 832 00:37:00,750 --> 00:37:04,330 Ce n'est manifestement pas que leurs adresses sont égale à la mémoire, parce que c'est un faible 833 00:37:04,330 --> 00:37:06,590 détail d'implémentation de niveau. 834 00:37:06,590 --> 00:37:08,360 Tous les caractères sont les mêmes. 835 00:37:08,360 --> 00:37:12,810 Alors permettez-moi de proposer, et permettez-moi de vous présenter en version un compare.c 836 00:37:12,810 --> 00:37:14,970 ici, donc comparer-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Permettez-moi de proposer que nous obtenons toujours une pointeur appelé s, et le magasin en lui l' 838 00:37:19,590 --> 00:37:20,610 valeur de ficelle obtenir le retour. 839 00:37:20,610 --> 00:37:21,750 Faisons la même chose avec t. 840 00:37:21,750 --> 00:37:23,230 Donc, aucun du code est différent. 841 00:37:23,230 --> 00:37:25,420 Je vais ajouter un peu plus de contrôle d'erreur maintenant. 842 00:37:25,420 --> 00:37:29,390 Alors, maintenant que nous sommes en quelque sorte éplucher ces couches dans CS50 de ce qu'est une chaîne 843 00:37:29,390 --> 00:37:33,520 en fait, c'est que nous devons être plus anal À propos de nous assurer que nous n'avons pas abuser 844 00:37:33,520 --> 00:37:35,330 valeurs invalides comme nulle. 845 00:37:35,330 --> 00:37:36,440 >> Alors je vais juste vérifier. 846 00:37:36,440 --> 00:37:41,490 Si s n'est pas égal nulle et T ne égal nulle, cela signifie que nous sommes OK. 847 00:37:41,490 --> 00:37:44,460 Faites chaîne n'a pas bousiller obtenir l'une de ces chaînes. 848 00:37:44,460 --> 00:37:51,270 Et vous pouvez peut-être deviner maintenant, qu'est-ce ne STR CMP vraisemblablement faire? 849 00:37:51,270 --> 00:37:52,000 Comparaison de chaîne. 850 00:37:52,000 --> 00:37:55,470 >> Donc, si vous avez programme en java avant, c'est comme la méthode égaux dans la 851 00:37:55,470 --> 00:37:56,490 classe de chaînes. 852 00:37:56,490 --> 00:37:57,890 Mais pour ceux d'entre vous qui n'ont pas programmé, 853 00:37:57,890 --> 00:37:59,320 c'est juste une fonction c. 854 00:37:59,320 --> 00:38:02,180 Il arrive à entrer dans un fichier appelé . 855 00:38:02,180 --> 00:38:03,830 C'est là où elle est déclarée. 856 00:38:03,830 --> 00:38:05,110 >> Et comparaison de chaîne - 857 00:38:05,110 --> 00:38:07,530 En fait, j'ai oublié son utilisation, mais qu'à cela ne tienne. 858 00:38:07,530 --> 00:38:10,470 Rappelez-vous que nous pouvons faire homme, remuer comparer. 859 00:38:10,470 --> 00:38:12,590 Et cela va faire apparaître le Manuel du programmeur Linux. 860 00:38:12,590 --> 00:38:14,060 Et c'est, franchement, un peu énigmatique. 861 00:38:14,060 --> 00:38:15,270 Mais je vois ici que, yep. 862 00:38:15,270 --> 00:38:17,570 Je dois comprendre . 863 00:38:17,570 --> 00:38:20,590 >> Et il est dit ici sous la description, "l' fonction de comparaison de chaîne compare 864 00:38:20,590 --> 00:38:24,560 les deux chaînes S1 et S2. "et S1 et S2 sont apparemment les deux 865 00:38:24,560 --> 00:38:26,120 arguments passés po 866 00:38:26,120 --> 00:38:28,650 Je ne me souviens pas vraiment ce const est, mais maintenant Avis - 867 00:38:28,650 --> 00:38:31,480 et vous avez peut-être déjà vu cette lorsque vous avez utilisez les pages de manuel si vous 868 00:38:31,480 --> 00:38:32,390 tout avoir - 869 00:38:32,390 --> 00:38:36,220 cette étoile char est tout simplement synonyme avec de la ficelle. 870 00:38:36,220 --> 00:38:40,440 >> Donc, il compare les deux chaînes, S1 et S2, et il renvoie un nombre entier inférieur 871 00:38:40,440 --> 00:38:44,930 supérieur ou égal à ou plus grand que zéro si S1 se trouve, respectivement, pour être 872 00:38:44,930 --> 00:38:47,450 inférieur ou correspondre, ou être supérieur à S2. 873 00:38:47,450 --> 00:38:51,220 C'est juste une façon très complexe de dire cette chaîne comparer les rendements 874 00:38:51,220 --> 00:38:55,760 zéro si deux chaînes sont intuitivement identiques, caractère pour 875 00:38:55,760 --> 00:38:57,120 au caractère près. 876 00:38:57,120 --> 00:38:59,970 >> Elle retourne un nombre négatif si s, par ordre alphabétique, est censé 877 00:38:59,970 --> 00:39:01,010 à venir avant de t. 878 00:39:01,010 --> 00:39:05,300 Ou renvoie un nombre positif si s est censé venir après t 879 00:39:05,300 --> 00:39:06,170 par ordre alphabétique. 880 00:39:06,170 --> 00:39:08,360 Donc, avec cette simple fonction, pourrait vous, par exemple, trier une 881 00:39:08,360 --> 00:39:09,770 tas de mots? 882 00:39:09,770 --> 00:39:13,984 >> Ainsi, dans cette nouvelle version, je vais à aller de l'avant et faire compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash comparer un. 884 00:39:15,750 --> 00:39:18,030 Je vais taper dans Bonjour tout en minuscules. 885 00:39:18,030 --> 00:39:20,300 Je vais taper dans bonjour en minuscules nouveau. 886 00:39:20,300 --> 00:39:23,340 Et heureusement maintenant il se rend compte J'ai tapé la même chose. 887 00:39:23,340 --> 00:39:27,520 >> En attendant, si je tape dans bonjour en bas BONJOUR cas et en majuscules et 888 00:39:27,520 --> 00:39:29,710 les comparer, j'ai tapé des choses différentes. 889 00:39:29,710 --> 00:39:32,530 Parce que non seulement les adresses différent, mais nous comparons 890 00:39:32,530 --> 00:39:35,350 différents personnages encore et encore. 891 00:39:35,350 --> 00:39:37,320 >> Eh bien, allons-y et fixer une autre problème maintenant. 892 00:39:37,320 --> 00:39:41,590 Permettez-moi de m'ouvrir la version d'un exemplaire, qui porte maintenant 893 00:39:41,590 --> 00:39:42,900 cette question comme suit. 894 00:39:42,900 --> 00:39:45,650 Et celui-ci va chercher un peu plus complexe. 895 00:39:45,650 --> 00:39:49,320 Mais si vous pensez à ce problème, nous nécessité de résoudre, j'espère que ce sera 896 00:39:49,320 --> 00:39:51,870 effacer dans un moment maintenant. 897 00:39:51,870 --> 00:39:57,280 >> Donc, cette première ligne, char début t, en termes simples quelqu'un pourrait proposer 898 00:39:57,280 --> 00:39:59,450 ce qui signifie ici que cette ligne? 899 00:39:59,450 --> 00:40:01,050 Char étoile t, ce que c'est que faire? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Bon. 902 00:40:07,210 --> 00:40:09,500 Créer un pointeur vers une certaine place dans la mémoire. 903 00:40:09,500 --> 00:40:10,930 Et permettez-moi de le peaufiner un peu. 904 00:40:10,930 --> 00:40:17,180 Déclarez une variable qui stockera l' Adresse de certains caractères dans la mémoire, juste 905 00:40:17,180 --> 00:40:18,480 d'être un peu plus propre. 906 00:40:18,480 --> 00:40:21,210 >> OK, donc maintenant sur le côté droit, j'ai jamais vu une de ces fonctions 907 00:40:21,210 --> 00:40:22,660 avant, malloc. 908 00:40:22,660 --> 00:40:26,980 Mais que pourrait-il signifier? 909 00:40:26,980 --> 00:40:28,050 Allocation de mémoire. 910 00:40:28,050 --> 00:40:29,410 Allocation mémoire. 911 00:40:29,410 --> 00:40:33,050 >> Ainsi, il s'avère, jusqu'à maintenant, nous n'ont pas vraiment eu un puissant moyen d' 912 00:40:33,050 --> 00:40:36,210 demandant au système d'exploitation, donnez-moi un peu de mémoire. 913 00:40:36,210 --> 00:40:39,980 Au contraire, nous avons maintenant une fonction appelée malloc qui fait exactement cela. 914 00:40:39,980 --> 00:40:42,960 Même si c'est un peu un distraction en ce moment, notez que dans 915 00:40:42,960 --> 00:40:46,200 entre les deux parenthèses est juste va être un numéro. 916 00:40:46,200 --> 00:40:48,510 Lorsque j'ai tapé en question marques peuvent être un nombre. 917 00:40:48,510 --> 00:40:51,020 >> Et ce nombre signifie, donnez-moi 10 octets. 918 00:40:51,020 --> 00:40:52,320 Donnez-moi 20 octets. 919 00:40:52,320 --> 00:40:53,820 Donnez-moi 100 octets. 920 00:40:53,820 --> 00:40:56,500 Et malloc fera de son mieux pour demander au système d'exploitation - 921 00:40:56,500 --> 00:40:57,630 Linux, dans ce cas - 922 00:40:57,630 --> 00:40:59,630 hey, sont leurs 100 octets de RAM disponible? 923 00:40:59,630 --> 00:41:04,320 Si c'est le cas, retourner ces octets à moi par renvoyer l'adresse de laquelle de 924 00:41:04,320 --> 00:41:06,610 ces octets peut-être? 925 00:41:06,610 --> 00:41:07,610 Le tout premier. 926 00:41:07,610 --> 00:41:10,460 >> Donc, ici aussi - et cela est prédominante en C, une fois que vous êtes 927 00:41:10,460 --> 00:41:11,680 traiter avec des adresses? 928 00:41:11,680 --> 00:41:15,830 Vous avez presque toujours affaire avec le première domicile, peu importe la taille 929 00:41:15,830 --> 00:41:19,490 un morceau de mémoire que vous êtes restitué, pour ainsi dire. 930 00:41:19,490 --> 00:41:20,880 >> Donc, nous allons plonger ici. 931 00:41:20,880 --> 00:41:23,940 J'essaie de répartir comment nombre d'octets, exactement? 932 00:41:23,940 --> 00:41:24,080 Eh bien. 933 00:41:24,080 --> 00:41:26,090 Longueur de corde de s - LET'S faire un exemple concret. 934 00:41:26,090 --> 00:41:30,700 Si s est bonjour, H-E-L-L-O, ce qui est le longueur de la chaîne s, évidemment? 935 00:41:30,700 --> 00:41:32,010 Donc, c'est cinq. 936 00:41:32,010 --> 00:41:34,590 Mais je fais un plus 1 à ce sujet, pourquoi? 937 00:41:34,590 --> 00:41:37,700 Pourquoi je veux six octets au lieu de cinq? 938 00:41:37,700 --> 00:41:38,790 Le caractère nul. 939 00:41:38,790 --> 00:41:41,210 >> Je ne veux pas cesser cette caractère spécial nulle. 940 00:41:41,210 --> 00:41:45,160 Parce que si je fais une copie de Bonjour et fais juste H-E-L-L-O, mais je ne mets pas 941 00:41:45,160 --> 00:41:50,160 ce caractère spécial, l'ordinateur pourraient ne pas avoir, par hasard, une barre oblique inverse 942 00:41:50,160 --> 00:41:51,730 zéro là pour moi. 943 00:41:51,730 --> 00:41:55,570 Et si je suis à essayer de comprendre la longueur de la copie, je pourrais penser que 944 00:41:55,570 --> 00:41:59,360 c'est 20 caractères de long, ou un million caractères si je viens jamais arriver 945 00:41:59,360 --> 00:42:01,050 de frapper un zéro de barre oblique inverse. 946 00:42:01,050 --> 00:42:05,780 >> Nous avons donc besoin de six octets pour stocker H-E-L-L-O, barre oblique inverse zéro. 947 00:42:05,780 --> 00:42:07,870 Et puis, ce n'est que être super anal. 948 00:42:07,870 --> 00:42:10,700 Supposons que j'oublie la taille d'un char est. 949 00:42:10,700 --> 00:42:12,020 Nous continuons à dire que c'est un octet. 950 00:42:12,020 --> 00:42:12,860 Et il est habituellement. 951 00:42:12,860 --> 00:42:15,425 En théorie, il pourrait être quelque chose différent, sur un autre Mac ou un 952 00:42:15,425 --> 00:42:16,250 PC différent. 953 00:42:16,250 --> 00:42:19,650 >> Ainsi, il s'avère qu'il ya cet opérateur appelé sizeof que si vous lui passez le 954 00:42:19,650 --> 00:42:22,680 nom d'un type de données - comme char, ou int, float ou - 955 00:42:22,680 --> 00:42:26,930 il vous dira, dynamique, combien de octets un chevalier prend sur cette 956 00:42:26,930 --> 00:42:28,090 notamment ordinateur. 957 00:42:28,090 --> 00:42:31,360 >> Donc, c'est effectivement juste comme si on disait fois 1 ou 958 00:42:31,360 --> 00:42:32,440 fois rien du tout. 959 00:42:32,440 --> 00:42:36,340 Mais je le fais juste pour être super anal, que juste au cas où un caractère différent 960 00:42:36,340 --> 00:42:40,610 sur votre ordinateur contre la mienne, de cette façon le calcul va toujours à vérifier. 961 00:42:40,610 --> 00:42:43,720 >> Enfin, ici je vérifie pour null, ce qui est toujours bon - encore une fois, 962 00:42:43,720 --> 00:42:44,920 chaque fois que nous avons affaire à des pointeurs. 963 00:42:44,920 --> 00:42:47,520 Si malloc n'était pas en mesure de donner moi six adieux - ce qui est 964 00:42:47,520 --> 00:42:49,210 peu probable, mais juste au cas où - 965 00:42:49,210 --> 00:42:50,730 retourner un immédiatement. 966 00:42:50,730 --> 00:42:53,290 Et maintenant, allez-y et copier la chaîne comme suit. 967 00:42:53,290 --> 00:42:57,240 Et ce n'est syntaxe familière, mais dans un rôle différent. 968 00:42:57,240 --> 00:43:01,210 >> Je vais aller de l'avant et obtenir la chaîne longueur de s et le stocker dans n. 969 00:43:01,210 --> 00:43:06,620 Je suis ensuite aller à parcourir à partir de i égale zéro jusqu'à et y compris le N, 970 00:43:06,620 --> 00:43:08,410 supérieure ou égale à. 971 00:43:08,410 --> 00:43:13,540 Alors que à chaque itération, j'ai mis le ième caractère de s dans la ième 972 00:43:13,540 --> 00:43:15,380 caractère de t. 973 00:43:15,380 --> 00:43:18,190 >> Alors qu'est-ce qui se passe vraiment en dessous le capot ici? 974 00:43:18,190 --> 00:43:22,140 Eh bien, si, par exemple, est s - 975 00:43:22,140 --> 00:43:26,400 et j'ai tapé le mot H-E-L-L-O et il ya un zéro de barre oblique inverse. 976 00:43:26,400 --> 00:43:29,020 Et encore, il s'agit de pointer ici. 977 00:43:29,020 --> 00:43:30,830 Et voilà maintenant t. 978 00:43:30,830 --> 00:43:34,860 >> Et cette pointe désormais à une copie de la mémoire, non? 979 00:43:34,860 --> 00:43:37,340 Malloc m'a donné une toute morceau de mémoire. 980 00:43:37,340 --> 00:43:41,440 Je ne sais pas ce qui est initialement dans aucun de ces endroits. 981 00:43:41,440 --> 00:43:44,340 Donc, je vais penser à ceux-ci comme tout un tas de points d'interrogation. 982 00:43:44,340 --> 00:43:50,190 >> Mais dès que je commence une boucle à partir de zéro le haut à travers la longueur de s, t 983 00:43:50,190 --> 00:43:52,790 Support zéro et t étrier 1 - 984 00:43:52,790 --> 00:43:55,080 et je mettrai cela maintenant sur la tête - 985 00:43:55,080 --> 00:44:04,190 t support de zéro et de support de moyenne nulle que je vais être la copie 986 00:44:04,190 --> 00:44:09,875 itérative h ici, E-L-L-O. De plus, parce que j'ai fait sur le signe plus 987 00:44:09,875 --> 00:44:12,370 1, barre oblique inverse zéro. 988 00:44:12,370 --> 00:44:19,060 >> Alors maintenant, dans le cas de comparaison-1.c, à la fin, si je imprimer les 989 00:44:19,060 --> 00:44:24,760 capitalisation de t, nous devrions voir que s est inchangé. 990 00:44:24,760 --> 00:44:26,090 Permettez-moi d'aller de l'avant maintenant et je fais cela. 991 00:44:26,090 --> 00:44:28,630 Donc, assurez-copy1. 992 00:44:28,630 --> 00:44:30,860 Dot slash copy1. 993 00:44:30,860 --> 00:44:33,670 Je vais taper bonjour, Entrée. 994 00:44:33,670 --> 00:44:37,430 Et maintenant le constater, seule la copie ont été capitalisés. 995 00:44:37,430 --> 00:44:40,890 Parce que j'ai vraiment deux morceaux de mémoire. 996 00:44:40,890 --> 00:44:44,390 >> Malheureusement, vous pouvez faire quelques jolies mauvaises et très dangereux choses ici. 997 00:44:44,390 --> 00:44:49,290 Laisse-moi ôter jusqu'à un exemple ici maintenant, qui nous donne un exemple de quelques-uns 998 00:44:49,290 --> 00:44:51,540 différentes lignes. 999 00:44:51,540 --> 00:44:56,040 Il suffit donc intuitivement ici, la première ligne de code, int x étoiles, est de déclarer 1000 00:44:56,040 --> 00:44:57,340 une variable appelée x. 1001 00:44:57,340 --> 00:44:58,810 Et quel est le type de données de cette variable? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Quel est le type de données de cette variable? 1004 00:45:04,290 --> 00:45:06,980 Ce n'était pas le cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Le type de données est int étoile. 1006 00:45:08,350 --> 00:45:12,600 Alors qu'est-ce que ça veut dire? x volonté stocker l'adresse d'un int. 1007 00:45:12,600 --> 00:45:13,520 C'est aussi simple que cela. 1008 00:45:13,520 --> 00:45:16,220 Y va stocker l' adresse d'un int. 1009 00:45:16,220 --> 00:45:18,390 Qu'est-ce que la troisième ligne du Code fais là? 1010 00:45:18,390 --> 00:45:21,850 C'est allouer combien octets, le plus probable? 1011 00:45:21,850 --> 00:45:22,350 Four. 1012 00:45:22,350 --> 00:45:25,460 En raison de la taille d'un int est généralement quatre, malloc de quatre donne 1013 00:45:25,460 --> 00:45:29,950 me redonné l'adresse d'un morceau de la mémoire, le premier des octets dont est 1014 00:45:29,950 --> 00:45:32,110 stocké maintenant dans x. 1015 00:45:32,110 --> 00:45:34,410 >> Maintenant, nous passons un peu vite. 1016 00:45:34,410 --> 00:45:35,760 Étoile x veut dire quoi? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Cela signifie aller à cette adresse et mettre ce nombre là-bas? 1019 00:45:42,590 --> 00:45:43,870 Mettez le numéro 42 là-bas. 1020 00:45:43,870 --> 00:45:47,590 Étoile y signifie aller à ce qui est en y et mettre le numéro 13 là-bas. 1021 00:45:47,590 --> 00:45:48,600 >> Mais attendez une minute. 1022 00:45:48,600 --> 00:45:51,640 Ce qui est en Y à l'instant? 1023 00:45:51,640 --> 00:45:54,950 Quelle adresse est y stocker? 1024 00:45:54,950 --> 00:45:55,770 Nous ne savons pas, c'est ça? 1025 00:45:55,770 --> 00:45:59,230 Nous n'avons jamais une fois utiliser l'affectation opérateur impliquant y. 1026 00:45:59,230 --> 00:46:03,370 Alors, y déclaré sur la deuxième ligne de code est juste une valeur d'ordures, un grand 1027 00:46:03,370 --> 00:46:04,760 interrogation pour ainsi dire. 1028 00:46:04,760 --> 00:46:07,230 Il pourrait être dirigée au hasard à quoi que ce soit dans la mémoire, ce qui 1029 00:46:07,230 --> 00:46:08,340 est généralement mauvaise. 1030 00:46:08,340 --> 00:46:13,540 >> Donc, dès que nous avons atteint cette ligne là-bas, étoile y est égal à 13, quelque chose de mauvais, 1031 00:46:13,540 --> 00:46:17,220 quelque chose de très mauvais est sur le point arriver à Binky. 1032 00:46:17,220 --> 00:46:25,810 Donc, nous allons voir ce qui va se finir passe à Binky ici, dans cette minute 1033 00:46:25,810 --> 00:46:26,200 ou alors regarder. 1034 00:46:26,200 --> 00:46:26,490 >> [LECTURE VIDEO] 1035 00:46:26,490 --> 00:46:26,745 >> -Hey, Binky. 1036 00:46:26,745 --> 00:46:27,000 Réveillez-vous. 1037 00:46:27,000 --> 00:46:29,296 Il est temps pour le plaisir du pointeur. 1038 00:46:29,296 --> 00:46:30,680 >> -Qu'est-ce que c'est? 1039 00:46:30,680 --> 00:46:31,980 Renseignez-vous sur les pointeurs? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Eh bien, pour commencer, je suppose que nous sommes allez avoir besoin d'un couple de pointeurs. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Ce code attribue deux pointeurs qui peut pointer vers entiers. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, bien, je vois les deux pointeurs. 1045 00:46:43,760 --> 00:46:45,850 Mais ils ne semblent pas être pointant à quelque chose. 1046 00:46:45,850 --> 00:46:46,490 >> -C'est vrai. 1047 00:46:46,490 --> 00:46:48,630 Initialement, les pointeurs ne sont pas pointer vers quelque chose. 1048 00:46:48,630 --> 00:46:51,700 Les choses ils pointent sont appelés pointees, et leur mise en place est un 1049 00:46:51,700 --> 00:46:52,850 étape séparée. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, droite, droite. 1051 00:46:53,740 --> 00:46:54,500 Je le savais. 1052 00:46:54,500 --> 00:46:56,270 Les pointees sont séparés. 1053 00:46:56,270 --> 00:46:58,553 Alors, comment voulez vous allouez un pointée? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Eh bien, ce code alloue une nouvelle entiers pointée, et cette partie fixe x 1056 00:47:03,707 --> 00:47:05,520 pour pointer vers elle. 1057 00:47:05,520 --> 00:47:06,760 >> -Hé, regarde mieux. 1058 00:47:06,760 --> 00:47:08,520 Donc, pour lui faire faire quelque chose. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Je vais déréférencement du pointeur x pour stocker le nombre 42 dans sa pointée. 1061 00:47:14,110 --> 00:47:17,660 Pour cette astuce, je vais avoir besoin de ma magie baguette de déréférencement. 1062 00:47:17,660 --> 00:47:20,695 >> -Votre baguette magique de déréférencement? 1063 00:47:20,695 --> 00:47:22,632 Euh, c'est super. 1064 00:47:22,632 --> 00:47:24,620 >> -C'est ce que le code ressemble. 1065 00:47:24,620 --> 00:47:27,526 Je vais régler le nombre, et - 1066 00:47:27,526 --> 00:47:28,250 >> -Hé, regardez. 1067 00:47:28,250 --> 00:47:29,680 Là il va. 1068 00:47:29,680 --> 00:47:34,520 Ce faisant, le déréférencement de x suit la flèche pour accéder à son pointée. 1069 00:47:34,520 --> 00:47:36,690 Dans ce cas, pour stocker 42 là-dedans. 1070 00:47:36,690 --> 00:47:40,890 Hey, essayez de l'utiliser pour enregistrer le numéro 13 à travers l'autre pointeur, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Je vais juste ici pour y et Obtenez le numéro 13 a mis en place. 1073 00:47:46,810 --> 00:47:50,890 Et puis prendre la baguette de déréférencement et juste - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Cela n'a pas fonctionné. 1077 00:47:54,610 --> 00:47:58,200 Dites, Binky, je ne pense pas que le déréférencement y est une bonne idée, 1078 00:47:58,200 --> 00:48:01,370 parce que la mise en place du pointée est une étape séparée. 1079 00:48:01,370 --> 00:48:03,460 Et je ne pense pas que nous ayons jamais fait. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Bon point. 1082 00:48:05,160 --> 00:48:07,410 >> -Ouais, nous avons attribué le pointeur y. 1083 00:48:07,410 --> 00:48:10,045 Mais nous n'avons jamais mis à pointer vers un pointée. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Très attentif. 1086 00:48:12,170 --> 00:48:13,790 >> -Hé, vous êtes à la recherche bon là, Binky. 1087 00:48:13,790 --> 00:48:16,920 Pouvez-vous résoudre ce problème afin que Y des points à la même pointée comme x? 1088 00:48:16,920 --> 00:48:17,810 >> -Bien sûr. 1089 00:48:17,810 --> 00:48:20,300 Je vais utiliser ma baguette magique de affectation pointeur. 1090 00:48:20,300 --> 00:48:22,240 >> -Est-ce que cela va être un problème comme avant? 1091 00:48:22,240 --> 00:48:22,665 >> -No. 1092 00:48:22,665 --> 00:48:24,300 Cela ne touche pas les pointees. 1093 00:48:24,300 --> 00:48:27,880 Il change juste un pointeur pour pointer à la même chose que l'autre. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, je vois. 1095 00:48:28,970 --> 00:48:31,730 Maintenant y pointe vers le même endroit que x. 1096 00:48:31,730 --> 00:48:32,450 Alors n'attendez. 1097 00:48:32,450 --> 00:48:33,490 Maintenant y est fixé. 1098 00:48:33,490 --> 00:48:34,630 Il a un pointée. 1099 00:48:34,630 --> 00:48:36,520 Ainsi, vous pouvez essayer la baguette de déréférencement nouveau 1100 00:48:36,520 --> 00:48:39,200 d'envoyer les 13 plus. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Voilà. 1103 00:48:41,570 --> 00:48:42,870 >> -Hé, regardez ça. 1104 00:48:42,870 --> 00:48:44,320 Maintenant déréférencement œuvres y. 1105 00:48:44,320 --> 00:48:47,020 Et parce que les pointeurs se partagent que l'on pointée, ils 1106 00:48:47,020 --> 00:48:48,585 à la fois voir le 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Ouais. 1108 00:48:49,040 --> 00:48:49,670 Partage. 1109 00:48:49,670 --> 00:48:50,380 Peu importe. 1110 00:48:50,380 --> 00:48:52,290 Alors, allons-nous changer de place maintenant? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, regardez. 1112 00:48:52,970 --> 00:48:54,150 Nous n'avons plus de temps. 1113 00:48:54,150 --> 00:48:55,200 >> -Mais - 1114 00:48:55,200 --> 00:48:57,060 >> Rappelez-vous que tous les trois règles de pointeur. 1115 00:48:57,060 --> 00:49:00,100 Tout d'abord, la structure de base c'est que vous avez un pointeur. 1116 00:49:00,100 --> 00:49:02,170 Et il pointe vers un pointée. 1117 00:49:02,170 --> 00:49:04,160 Mais le pointeur et pointée sont séparés. 1118 00:49:04,160 --> 00:49:06,460 Et l'erreur courante consiste à mettre en place un pointeur, mais à 1119 00:49:06,460 --> 00:49:08,540 oublier de donné un pointée. 1120 00:49:08,540 --> 00:49:12,460 >> Numéro deux, pointeur déréférencement commence au niveau du pointeur et suit son 1121 00:49:12,460 --> 00:49:14,570 flèche sur pour accéder à son pointée. 1122 00:49:14,570 --> 00:49:18,640 Comme nous le savons tous, cela ne fonctionne que s'il ya est un pointée, ce qui revient à 1123 00:49:18,640 --> 00:49:19,790 la règle numéro un. 1124 00:49:19,790 --> 00:49:23,670 >> Numéro trois, affectation du pointeur prend un pointeur et les changements qu'il pointe vers 1125 00:49:23,670 --> 00:49:25,850 Même pointée comme un autre pointeur. 1126 00:49:25,850 --> 00:49:27,840 Ainsi, après la cession, les deux pointeurs 1127 00:49:27,840 --> 00:49:29,430 pointer vers le même pointée. 1128 00:49:29,430 --> 00:49:31,600 Parfois, c'est ce qu'on appelle le partage. 1129 00:49:31,600 --> 00:49:33,430 Et c'est tout ce qu'il ya à faire, vraiment. 1130 00:49:33,430 --> 00:49:33,840 Bye bye maintenant. 1131 00:49:33,840 --> 00:49:34,300 >> [FIN LECTURE VIDÉO] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID MALAN: Donc plus sur les pointeurs, plus sur Binky semaine prochaine. 1133 00:49:36,940 --> 00:49:38,190 Nous vous verrons lundi. 1134 00:49:38,190 --> 00:49:42,187