[MUSIQUE LECTURE] DAVID J. Malan: Très bien. C'est CS50, et ce est la fin de la quatrième semaine. Et l'un des sujets aujourd'hui est celui de la criminalistique numérique, l'art de la récupération des informations. Et en effet, même si vous êtes dans le milieu en ce moment de paix à trois et Breakout, la semaine prochaine, l'accent sera mis sur précisément ce domaine. Donc, l'un des emplois les plus cool que jamais eu était de retour à l'école diplômé, quand je travaillais pour les locaux Middlesex County District Attorney de bureau, la médecine légale qui font travailler. Donc, essentiellement, le Massachusetts Police d'Etat, à l'occasion, lorsque l'on travaille sur des cas serait apporter des choses comme les disques durs et les disquettes et cartes mémoire et similaires. Et ils les remettre pour moi et mon mentor, et notre objectif était de trouver des preuves, s'il y avait, sur ces médias. Aperçus Maintenant, vous avez peut-être vu de ce monde de la médecine légale dans les médias, de la télévision et des films. Mais le travail, j'ai eu, et disons-le, ce monde, n'est pas tout à fait comme vous le voir. Jetons un oeil à ce que vous avez probablement vu. [VIDEO LECTURE] -OK. Maintenant, passons un bon coup d'oeil à vous. [MUSIQUE LECTURE] -hold Il. Exécutez ce retour. -wait Une minute. Allez à droite. -Il. Congeler que. -Full Écran. -OK. Congeler que. -Serrez Là-dessus, vous? En ce que sur -vector type de la roue arrière. -Zoom En droit ici à cet endroit. -Avec Le bon équipement, la image peut être agrandie et aiguisé. -Quel Ce que c'est? -C'est Un programme d'amélioration. -Pouvez Vous clair que n'importe quel? Je n'en sais rien. Disons améliorer. -Améliorez Section A6. J'ai amélioré le détail, et-- -I Pense qu'il ya assez d'améliorer. Relâchez-le pour mon écran. -I Amélioré la réflexion dans son oeil. -Let Est géré par ce l'amélioration de la vidéo. -Edgar, Pouvez-vous améliorer cela? -hang Sur. -J'ai Travaillé sur cette réflexion. La réflexion de la personne de -Il. -Réflexion. -Il C'est une réflexion du visage de l'homme. Réflexion -Le! -Il C'est une réflexion. -Zoom Dans le miroir. Vous pouvez voir un reflet. -Peut Vous améliorez l'image à partir d'ici? -Peut Vous améliorer? -Peut Vous améliorer? -Peut Nous améliorons ce? -Peut Vous améliorer? -hold Une seconde. Je vais à améliorer. -Zoom Dans la porte. -Times 10. -Zoom. Vous suffit de placer dans. -Plus. Attends, arrêter. -stop. -PAUSE Il. Nous -tourner 75 degrés autour de la verticale, s'il vous plaît. -stop. Retour à la partie sur la porte. -Got Un activateur d'image qui peut bitmap? -peut-Être nous pouvons utiliser la Pradeep Singh méthode de voir dans les fenêtres. -Le Logiciel est l'état de l'art. -Le Valeur propre est éteint. -Avec Le droit combinaison de algorithms-- L'illumination pris de -Il algorithmes au niveau suivant, et je peux les utiliser pour améliorer cette photo. -lock Sur et agrandir l'axe z. -Améliorez. Améliorer. -Améliorez. -Freeze Et améliorer. [FIN LECTURE VIDÉO] DAVID J. Malan: Ce sont donc les tous les mots, mais ils ne sont pas utilisé dans des phrases correctement. Et en effet, à l'avenir, à tout moment, s'il vous plaît, vous entendez quelqu'un dire le mot, «Améliorer», rire un peu. Parce que quand vous essayez d'améliorer, par exemple, c'est ce qui arrive. Alors, voici une photo magnifique. C'est propre Daven de CS50. Et supposons que nous voulions concentrer sur l'étincelle dans les yeux, ou la réflexion de l' méchant qui était clairement capturée par la caméra de surveillance. C'est ce qui arrive quand vous zoomez sur une image a un nombre fini de bits qui lui sont associés. C'est ce que vous obtiendrez. Et en effet, dans l'œil de Daven est mais quatre, peut-être six pixels composer exactement ce que il a été étincelant. Donc problème Set Four aura finalement d'explorer ce monde, en particulier par la nature de quelque chose nous appelons fichier i / o, où i / o est juste une façon élégante de disant entrée et de sortie. Donc, jusqu'à présent, toutes les interactions nous avons eu avec un ordinateur ont été largement avec votre clavier et l'écran, mais pas autant avec le disque dur, ou de l'enregistrement de fichiers au-delà de celles que vous vous écrire. Vos programmes ont jusqu'à présent pas été la création et l'enregistrement, et mettre à jour leurs propres fichiers. Eh bien, ce qui est un fichier? Eh bien, quelque chose comme un JPEG. C'est une image que vous pourriez avoir ou télécharger sur Facebook, ou voir n'importe où sur le web. En effet, cette photo nous venons de scie de Daven était un JPEG. Et ce qui est intéressant sur les fichiers comme les fichiers JPEG est qu'ils peuvent être identifiés, typiquement, par certains motifs de bits. En d'autres termes, qu'est-ce que distingue un JPEG de GIF d'un PING à partir d'un mot document à partir d'un fichier Excel? Eh bien, c'est juste différent motifs de bits. Et ces différents modèles sont généralement au début de ces fichiers. De sorte que lorsque votre ordinateur ouvrait un fichier Word doc, ou quand un ordinateur ouvre un fichier JPEG, il ressemble généralement à la premiers plusieurs bits dans le fichier. Et si elle reconnaît un motif, il dit, oh, c'est une image. Permettez-moi de l'afficher à l'utilisateur sous forme graphique. Ou, oh, cela ressemble à un document Word. Permettez-moi de montrer à l'utilisateur comme un essai. Ainsi, par exemple, JPEG, il s'avère, sont assez sophistiqué sous la hotte. Mais les trois premiers octets de plus chaque JPEG commencer par ces trois numéros. Donc octet zéro, un, et deux sont en plus tous les JPEG, 255, puis le numéro 216, puis le numéro 255. Et ce que vous serez en mesure de commencer à faire la semaine prochaine est en fait piquer dessous le capot de fichiers comme les fichiers JPEG et comme les fichiers bitmap, et de voir ce qui a toujours été là pour aussi longtemps que vous avez été en utilisant un ordinateur. Mais ce qui est là n'est généralement pas écrite comme nombres décimaux de ce genre. Les informaticiens ne font pas tendance à parler en décimal. Ils ne parlent pas vraiment en binaire. En règle générale, lorsque l'on veut pour exprimer des nombres, nous utilisons effectivement hexadécimal, que vous pouvez rappeler de, disons, ensemble de problèmes Un, qui a contesté vous pensez à un système différent. Nous, bien sûr, connaît avec décimale, de zéro à neuf. Nous avons parlé de binaire. Et nous n'avons pas vraiment à utiliser que beaucoup ici sur, parce que les ordinateurs vont utiliser cela. Mais les programmeurs sera très souvent, mais pas toujours, utiliser hexadécimal, ce qui signifie tout simplement vous avez 16 lettres dans votre alphabet, au lieu de deux ou 10. Alors, comment comptez-vous de la hausse de neuf en hexadécimal? On va à 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, juste par convention. Mais ce qui est important est que chaque de ceux-ci est un symbole unique. Il n'y a pas 10. Il n'y a pas 11, en soi, car chaque de vos chiffres, tout comme en décimal et tout comme dans binaire, si juste être un caractère unique, par convention. Donc, qui est alors l'alphabet que nous avons à notre disposition pour hexadécimal. Alors qu'est-ce qu'un JPEG ressembler si vous étaient d'écrire les trois premiers octets pas en décimal mais, par exemple, comme hexadécimal? Et pourquoi est-hex même si utile que ça? Eh bien, un coup d'oeil à un exemple. Donc, si j'écris sur les bits représenter ces numbers-- décimal cela pourrait être un peu rouillé maintenant de quelques semaines, mais l'un à gauche et l' droite sont assez facile. 255 est le plus grand nombre nous pourrait représenter huit bits. Il était tout petits. Donc, le seul qui est légèrement intéressant est celui du milieu. Et si vous sorte de faire le mathématiques, vous en déduire que, en effet, ce modèle d'une seule et zéros représente 216. Alors disons simplement stipuler maintenant que ce sont correctes. Mais pourquoi est-ce intéressant? Bien, un octet, bien sûr, est de huit bits. Et il s'avère que si vous pensez d'un octet en tant que deux blocs de quatre bits, comme ça. Permettez-moi d'ajouter un peu d'espace. Donc, avant, après. Je viens d'ajouter un espace blanc pour l'amour de visualisation ici. Comment pourrions-nous représenter maintenant, par exemple, hexadécimal chaque quad de bits, chaque groupe de quatre bits? Ainsi, par exemple, sur la gauche maintenant, nous avons 1 111 en binaire. Quel est ce nombre en décimal, si vous faites le calcul? Vous avez la position des unités, le lieu de deux, la place à quatre pattes, et le lieu de huit. PUBLIC: 15. DAVID J. Malan: C'est 15. Donc, si nous faisons huit plus quatre plus deux plus un, on obtient 15. Ainsi, j'ai pu écrire 15 ci-dessous 1111, mais toute la question ici est hexadécimal, décimal pas. Ainsi, au lieu d'écrire 15, 1-5, Je vais écrire que dans l'hexagone, qui si vous pensez en arrière, si vous avez zéro à f, ce qui est 15 va être? PUBLIC: f. DAVID J. Malan: Donc, il s'avère que c'est f. Et vous pouvez travailler que par dire: bien, si a est 10, puis sur OK, f est 15. Donc, en effet, nous pourrions réécrire cette même série de numéros que f f. Et puis, si nous faisons un peu de maths, nous en déduisons que c'est d. Huit est assez facile, parce que nous en avoir un à la place de huit. Et puis, nous avons un couple plus f f de. Donc, ce que les humains ont tendance à faire par convention quand ils utilisent hexadécimal est qu'ils viennent écrire ce un peu plus succinctement, se débarrasser de la plupart de l'espace blanc. Et juste pour être super clair lecteurs que ce n'est hexadécimal, simple convention entre l'homme est que vous écrivez zéro x, qui n'a pas d'autre sens d'un identifiant visuel de, voici un nombre hexadécimal. Et puis, vous mettez les deux chiffres, f f dans ce cas, d un, alors f f. Donc, longue histoire courte, hexadécimal tend juste pour être utile, car chacune de ses chiffres, de zéro à f, parfaitement lignes avec un motif de quatre bits. Donc, si vous avez deux chiffres hexadécimaux, zéro à F, encore et encore, qui vous donne parfaitement ou huit bits d'un octet. Voilà pourquoi il a tendance à classiquement être utile. Il n'y a pas intellectuelle contenu vraiment au-delà, autre que son utilité réelle. Maintenant JPEG ne sont pas la seule formats de fichier pour les graphiques. Vous vous rappelez peut qu'il existe fichiers de ce genre dans le monde, au moins de quelques années en arrière. Il s'agissait donc d' installé dans Windows XP sur des millions de PC dans le monde entier. Et ce fut un fichier bitmap, BMP. Et un fichier bitmap, comme vous le verrez à côté semaine, signifie simplement un motif de points, pixels comme on les appelle, une carte sur les bits, vraiment. Donc ce qui est intéressant, cependant, sur ce format de fichier, BMP, est que sous le capot, il a plus que seulement trois octets qui composent son en-tête, de sorte de parler, les premières bouchées. Il semble en fait un peu compliqué à première vue. Et vous verrez ce dans l'ensemble de P. Et obtenir quelque chose particulier de cette entreprise n'est pas si important, que le simple fait que, au début de chaque bitmap fichier, un format graphique, il ya tout un tas de chiffres. Maintenant Microsoft, l' auteur de ce format, ont tendance à appeler les Choses à ne pas ints et chars et flotteurs mais les mots et d des mots et des longs et des octets. Donc, ils ne sont que des types de données différents. Ils sont des noms différents pour la même chose. Mais vous verrez que dans P Set Four. Mais ce n'est que de dire que si un humain double-clique sur un fichier quelconque BMP sur son ou son disque dur, et une fenêtre s'ouvre jusqu'à lui que l'image montrant, ce qui s'est passé parce que l'exploitation Système probablement remarqué non seulement l'extension de fichier BMP dans le nom du fichier, mais aussi le fait que il ya un certain convention pour le modèle de bits au début de ce fichier bitmap. Mais concentrons-nous maintenant sur un tel fichier complexe, mais plutôt sur quelque chose comme ça. Suppose ici dans GEdit, je avoir juste les débuts d'un programme qui est assez simple. J'ai quelques inclut en haut. "Structs.h" #include Maintenant j'ai mais Je reviendrai dans un instant. Mais ce qui est utile pour l'instant. Il s'agit donc d'un programme qui va mettre en œuvre comme la base de données de l'état civil. Ainsi, une base de données des étudiants, et chaque élève dans le monde a un nom et une maison et probablement certains autres choses, mais nous allons garder les choses simples. Chaque élève a un nom et une maison. Donc, si je voulais écrire une programme dont le but dans la vie vient d'une itération d' zéro sur un maximum de trois, s'il ya trois étudiants à l'Université Harvard. Et je veux juste, en utilisant GetString, le nom et le domicile de chaque élève, et puis il suffit de les imprimer sur. C'est un peu comme la Semaine Un: Semaine Deux choses maintenant, où je veux juste un pour boucle ou quelque chose comme ça. Et je tiens à appeler GetString un peu fois, puis imprimer f à quelques reprises. Alors, comment pourrais-je faire cela, cependant, quand à la fois un nom et une maison sont impliqués pour chaque élève? Donc, mon premier instinct pourrait être de faire quelque chose comme ça. Je pourrais d'abord dire, eh bien, donnez-moi, dire, un tableau de chaînes de tous les noms. Et je ne veux pas un hardcode trois ici. Que dois-je veux y mettre? Ainsi, les étudiants, parce que c'est juste une constante déclarée au sommet, juste pour que je n'ai pas à coder en dur trois en plusieurs endroits. De cette façon, je peux changer un seul endroit, et elle affecte un changement partout. Et puis, je pourrais faire chaîne abrite ÉTUDIANTS. Et maintenant, je pourrais faire quelque chose comme for (int i = 0; i <ÉTUDIANTS; i ++. Donc je tape vite, mais c'est probablement syntaxe familière maintenant. Et maintenant, ce n'était plus récente. Si je veux mettre dans le i-ème nom de l'étudiant, je pense que je fais ça. Et puis, pas les noms mais les maisons encadrent i. Je le fais, GetString, et laissez- moi de revenir et corriger cette ligne. D'accord? Pas d'accord? Ce n'est pas très convivial. Je n'ai pas dit à l'utilisateur ce qu'il faut faire. Mais maintenant, si j'ai aussi voulu plus tard, nous allons par exemple, imprimer ces choses out-- si TODO plus tard. Je vais faire plus avec this-- ce est sans contredit l' une mise en œuvre correcte de obtenir des noms et des maisons, trois de leur total de chacun, à partir d'un utilisateur. Mais ce n'est pas une très bonne conception, non? Que faire si un élève n'a pas seulement un nom et une maison, mais aussi un numéro d'identification, et un numéro de téléphone, et une adresse e-mail, et peut-être une page d'accueil, et peut-être une poignée Twitter, et un nombre quelconque d'autres détails associé à un étudiant ou une personne, plus généralement. Comment pourrions-nous commencer à ajouter fonctionnalité de ce programme? Eh bien, je me sens comme la façon la plus simple pourrait être faire quelque chose comme, disons, int étudiants en EDI. Je peux donc mettre tous leurs papiers d'identité à l'intérieur. Et puis, quelque chose comme les numéros de téléphone, Je ne suis pas sûr de savoir comment représenter que pour l'instant. Donc, nous allons aller de l'avant et juste appel ce gazouille étudiants, ce qui est un peu étrange, mais-- et un tas plusieurs champs. J'ai commencé à efficacement copier et coller ici. Et cela va se développer assez lourd assez rapidement, non? Ce ne serait pas bien s'il y avait dans le monde d'une structure de données connu pas comme un int ou une chaîne, mais quelque chose niveau plus élevé, une abstraction, si de parler, connu en tant qu'étudiant? C n'est pas venu avec haut- fonctionnalité pour les étudiants, mais si je voulais lui donner telle? Eh bien, il s'avère, je vais ouvrir un fichier appelé structs.h ici, et vous pouvez faire exactement cela. Et nous allons commencer à le faire maintenant. Et sous le capot de P Set Trois, vous avez déjà fait cela maintenant. Il n'y a pas une telle chose comme un g rect ou g un ovale dans le langage de programmation C. Gens de Stanford en œuvre les types de données à l'aide de cette approche ici, déclarant leur propre nouvelles données types en utilisant un nouveau mot-clé et une autre appelée struct un appelé typedef. Et en effet, même si la syntaxe est un peu différent de trucs nous avons vu auparavant, dans principe, c'est super simple. Cela signifie simplement «définir un type." Cela va être un la structure, et une structure c'est comme un conteneur pour de multiples choses. Et cette structure va d'avoir une chaîne appelée nom, et une chaîne appelée maison. Et disons, simplement pour des raisons pratiques, toute cette élève de structure de données. Donc, au moment où vous arrivez à le point-virgule, vous avez maintenant créé vos propres données type appelé étudiant qui se tient maintenant aux côtés int, et le flotteur, et char, et la chaîne, et g rect, et g ovale, et un certain nombre d'autres choses que les gens ont inventé. Donc, ce qui est utile à ce sujet c'est maintenant que si je reviens struct 0 et terminer cette mise en œuvre, que j'ai écrit à l'avance ici, vous remarquerez que tous les du désordre inévitable que était sur le point de commencer à se produire comme je l'ai ajouté les numéros de téléphone et gazouille et tous ces autres choses à la définition d'un étudiant, maintenant il est succinctement enveloppé comme tout un réseau d'étudiants. Et chacun de ces étudiants maintenant a plusieurs choses à l'intérieur de celui-ci. Alors que tout laisse une question. Comment obtenez-vous au nom, et la maison, et l'ID, et tout ce qui est l'intérieur de l'étudiant? Super simple, aussi. Nouvelle syntaxe, mais une idée simple. Vous indice simplement dans le tableau, comme nous l'avons fait la semaine dernière et ce. Et ce qui est clairement le nouveau morceau de syntaxe? Just., Qui signifie «aller à l'intérieur du structure et faire le champ appelé nom, obtenir le champ appelé maison, obtenir le champ appelé étudiant. " Donc, en P Set Trois, si vous êtes travaille encore, et la plupart des gens encore sont, réaliser que vous commencer à utiliser des choses comme g rectangles et ovales g et d'autres choses qui ne semblent pas provenir de la semaine zéro, un, ou deux, se rendent compte que c'est parce que Stanford déclaré certains nouveaux types de données. Et en effet, c'est exactement ce que nous allons faire, ainsi, dans P Set Quatre, quand nous commençons à traiter avec les choses comme des images, bitmaps, et plus encore. Donc, c'est juste un teaser et une modèle mental de ce qui est à venir. Maintenant, je tergiverse un peu ce matin. J'étais un peu curieux de voir ce le fond d'écran Microsoft fait ressemble aujourd'hui. Et il se trouve quelqu'un en 2006 effectivement allé à presque exactement au même endroit à photographier, en réalité, ce qui ressemble à ce que ces jours-ci. Le champ est maintenant un peu envahi. Ainsi parle maintenant d'images, nous allons ramener Daven ici sur l'écran et Nicolas, et vous rappeler que si vous souhaitez vous joindre à nous pour le déjeuner ce vendredi, à la tête de notre URL habituelle Ici. Alors, où en sommes-nous faire abandonner le lundi? Nous avons introduit ce problème, non? C'est apparemment une bonne la mise en œuvre de swap, lequel vous prendre deux ints, un appelé, un appelé b, échanger entre eux, tout comme Laura a fait ici sur scène avec le lait et l'eau, en utilisant un temporaire variable ou une tasse vide, afin que nous puissions mettre b dans un et un en b sans faire un tas de choses. Nous avons utilisé une variable. C'est ce qu'on appelle température. Mais ce qui était fondamental problème avec ce code le lundi? Quel était le problème ici? Ouais. PUBLIC: Il prend plus de place. DAVID J. Malan: prend plus l'espace, parce que je suis en utilisant une variable, et c'est OK. C'est vrai, mais je suis va dire que c'est OK. C'est seulement 32 bits dans le grand schéma des choses, donc pas une grosse affaire. D'autres pensées? PUBLIC: Il permute seulement les variables localement. DAVID J. Malan: Exactement. Il ne permute les variables localement. Parce que chaque fois que vous appelez un function-- quand j'ai eu les plateaux de Annenberg la dernière fois, vous avez principal sur le fond. Dès que vous appelez une fonction appelée swap, swap de n'obtient pas x et y, les valeurs d'origine. Qu'est-ce que échange get, avons-nous prétendons? PUBLIC: Exemplaires. DAVID J. Malan: Donc copies. Donc, il obtient un et deux, si vous rappeler l'exemple de la dernière fois, mais une copie d'un et deux qui est échangé avec succès. Mais, malheureusement, à la fin, ces valeurs sont toujours les mêmes. Ainsi, nous pouvons voir cela à notre nouvel ami, j'espère que GDB, que vous ou les fonds fiduciaires et de Ca avez été en vous guidant vers la suivante. Donc, pas de rappel de swap regarde like-- de laisser ouvrir this-- ressemble à ceci. Nous avons initialisé x pour un, y à deux. Il y avait un tas de f impression de. Mais alors, la touche d'appel ici était d'échanger, ce qui est exactement le code que nous juste vu il ya un moment. Lequel est le bon à première coup d'oeil, mais fonctionnellement, ce programme ne fonctionne pas, parce que ne pas intervertir x et y de façon permanente. Voyons donc cela, une ambiance chaleureuse rapide ici avec GDB, un ./noswap. Un tas d'informations écrasante que Je vais me débarrasser de contrôle avec L pour l'instant. Et maintenant, je vais aller de l'avant et l'exécuter. Et malheureusement, que était pas très utile. Il a dirigé le programme à l'intérieur de cette programme appelé GDB, un débogueur, mais il ne m'a pas laissé fouiller. Alors, comment puis-je fait une pause exécution à l'intérieur de ce programme? Alors briser. Et je ne pouvais briser sur tout nombre, un, 10, 15 ligne. Mais je peux aussi casser symboliquement en disant bris. Et cela va définir un saut moment-là, apparemment à la ligne 16 dans le principal. Et où est la ligne 16? Montons au code et aller jusqu'à NOSWAP. Et en effet, la ligne 16 est la tout premier dans le programme. Alors maintenant, si je vais de l'avant et le type exécuter ce temps, Entrez, il s'arrêta. Donc, nous allons fouiller. Imprimer x-- pourquoi x zéro? Et ignorer le signe du dollar. C'est juste pour amateur l'utilisation du programme. Pourquoi est-x zéro en ce moment? Ouais. PUBLIC: Il s'arrêta juste avant ligne 16, pas vraiment sur la ligne 16. DAVID J. Malan: Exactement. GDB, par défaut, a suspendu exécution juste avant la ligne 16. Donc, il n'a pas exécuté, qui signifie x est d'une certaine valeur inconnue. Et nous avons eu de la chance que c'est quelque chose de propre comme zéro. Alors maintenant, si je tape suivante, maintenant il a exécuté 16. Il m'attend à exécuter 17. Permettez-moi d'aller de l'avant et print x. C'est l'un. Permettez-moi d'aller de l'avant et print y. Que dois-je voir maintenant? PUBLIC: [inaudible] DAVID J. Malan: Un peu plus fort. PUBLIC: [inaudible] DAVID J. Malan: Pas tout à fait un consensus. Alors oui, nous voyons une certaine valeur d'ordures. Or, il y est 134514064. Eh bien, c'est juste une valeur d'ordures. Mon programme utilise la mémoire vive à des fins différentes. Il ya d'autres fonctions. D'autres personnes ont écrit à l'intérieur de mon ordinateur. Donc, ces bits sont utilisés pour d'autres valeurs, et ce que je vois est les restes de certains utilisation antérieure de cette mémoire. Donc, pas grand-chose, parce que dès que je tape suivante, puis imprimer y, il est initialisé à la valeur que je veux. Alors maintenant, allons-y un peu plus vite. N pour une livraison. Faisons-le à nouveau. Faisons-le à nouveau. Mais je ne veux pas frapper ici, parce que si je vous voulez voir ce qui se passe à l'intérieur de swap, ce qui est la commande? PUBLIC: étapes. DAVID J. Malan: étapes. Donc cela me étapes dans un fonction, plutôt que sur elle. Et maintenant, c'est un peu cryptique honnêtement, mais ce n'est que me disant que je suis dans la ligne 33 maintenant. Et nous allons le faire à nouveau. Imprimer température. valeur des ordures, négatif cette fois, mais c'est juste encore une valeur d'ordures. Alors, faisons prochain, impression température. Il est initialisée à 1, ce qui était la valeur de x, alias un. Maintenant, où sont nos A et X en venir? Eh bien, remarquons en principal, nous appelé ces valeurs x et y. Nous avons ensuite passé les d'échanger de la façon suivante. X est venu en premier, y virgule. Et puis, échange pourrait les appeler x et y. Mais pour plus de clarté, c'est les appelant a et b. Mais a et b vont maintenant être copies de x et y, respectivement. Donc, si je reviens à GDB, la température est maintenant un an et est aujourd'hui l'un. Mais si je le fais à côté et maintenant faire imprimer un, une a déjà été déplacé sur. Le lait a été répandu dans l'ancien le verre de jus d'orange, ou vice versa. Et si je fais prochaine fois, et maintenant si j'imprime comme un test de cohérence, un est encore deux, mais b est aujourd'hui l'un. Franchement, il est toujours là. Je n'aime pas ce temp est. Mais dès que je tape maintenant, disons, continue à revenir en arrière, maintenant je suis à la fin le programme. Et malheureusement, x est encore un et y est toujours deux. Alors quelle est l'utilité de GDB il? Il n'a pas aidé moi de résoudre le problème en soi, mais il me espérons aider comprendre en réalisant que oui, ma logique est bonne, mais mon code n'est pas d'avoir en fin de compte un effet permanent. Donc, c'est un problème que nous sommes va résoudre maintenant, aujourd'hui. Mais nous allons y arriver par le biais de cette. String est un mensonge. C'est, aussi, pas un type de données qui existe en C. Il est été un synonyme pour certains temps pour autre chose, et nous pouvons révéler que comme suit. Permettez-moi aller de l'avant et d'ouvrir un programme appelé comparer-0. Et plutôt que de taper celui-ci dehors, nous allons commencer à marcher à travers le code J'ai déjà écrit, mais c'est seulement quelques lignes. Donc, ce n'est comparer-0. Et la première chose que je fais est d'obtenir une ligne de texte. Mais remarque que je suis faire pour la première fois. Ce qui est différent clairement sur la ligne 21? En fait, attendez une minute. Cette copie est deux. Ce n'est même pas le bon programme. Très bien, alerte spoiler. Très bien, alors cela ne tienne. C'est la réponse à la question d'un avenir. Voici comparer-0, et je suis sur le point d'obtenir une ligne de texte. Programme de beaucoup plus simple. Donc, c'est simple. C'est comme première semaine, la deuxième semaine des trucs en ce moment. = GetString de chaîne. Maintenant, je le répète ici. chaîne t = GetString. Et puis, la dernière chose dans ce programme, comme son nom l'indique, c'est que je vais essayer de les comparer. Donc, si s, la première chaîne, égaux = t, alors je suis allez dire que vous tapez la même chose. Sinon, je vais dire vous tapez des choses différentes. Donc, nous allons compiler et exécuter ce programme. Donc, assurez comparer zéro. On dirait bien. Aucune erreur de compilation. Permettez-moi maintenant aller de l'avant et tapez ./compare-0. Permettez-moi d'aller de l'avant et de dire quelque chose : Daven et quelque chose: Rob. Et je tape des choses différentes. Jusqu'ici, tout va bien. Programme semble être correct. Mais on devrait courir à nouveau. Dire quelque chose: Gabe. Dire quelque chose: Gabe. Bien. Peut-être que j'ai frappé la barre d'espace ou quelque chose de funky. Faisons-le à nouveau. Donc Zamyla. Zamyla. Différentes choses. Donc ce qui se passe? Nous avons donc ces deux lignes de code, GetString appelé deux fois. Et puis, je suis tout simplement essayer de comparer s et t. Mais ce qui se passe alors? Eh bien, sur mon écriture à boucher cet exemple un peu. Et nous allons jeter effectivement cette place ici, aussi. Donc, nous avons une ligne comme = GetString de chaîne. Donc, c'est tout simplement la première ligne intéressante de ce programme. Mais ce que tout ce temps a été passe sous le capot? Eh bien, sur le côté gauche est une chaîne, qui est un type de variable, et on appelle ça de l'art. Donc, je sais que cela est d'utiliser la mémoire, ou RAM, dans mon ordinateur en quelque sorte. Donc, je vais abstraite dessiner que comme un carré. 32 bits, il s'avère, mais plus à ce sujet dans l'avenir. Et puis, qu'est-ce qui se passe ici? Eh bien, de toute évidence GetString Obtient une chaîne de l'utilisateur. Et GetString a Zamyla ou Gabe ou Daven. Donc, nous allons choisir la première de ceux, qui était Daven. Donc, en réalité, ce qui a GetString moi dans ce premier cas était D-un-v-e-n. Et puis, quoi d'autre l'a fait il me donne secrètement? PUBLIC: [inaudible] DAVID J. Malan: Ouais, le caractère / 0 ou nulle. Alors il m'a effectivement donné une chaîne. Mais nous savons déjà de précédent semble que la chaîne est juste un tableau de caractères, et il est mis fin par ce caractère spécial de sentinelle, / 0. Mais si cela est vrai et il s'agit d'un carré, il s'agit clairement d'un beaucoup plus grand rectangle. Et en effet, c'est, Je prétends, seuls 32 bits. Et ce n'est clairement plus de 32 bits, parce que cela est probablement huit plus huit plus huit plus huit plus huit, juste parce que d'octets en ASCII. Comment diable allons-nous tenir Daven dans cette petite boîte ici? Eh bien, ce qui est en train de faire GetString? Eh bien, cette grille représente ici la mémoire ou la mémoire vive de mon ordinateur. Donc, disons que si arbitrairement chacun d'entre eux représente un octet, alors nous pouvons penser de chaque octet comme ayant une adresse, comme 33 Oxford Street, ou 34 Oxford Street, ou 35 Oxford Street. Ainsi, tout comme les maisons ont des adresses et les bâtiments ont des adresses, donc faire octets individuels de mémoire ont des adresses ou des numéros que de les identifier de manière unique. Maintenant, c'est arbitraire. Mais pour faire simple, je vais utiliser hexadécimal juste par convention, mais la 0x signifie rien d'autre que «ce n'est hexadécimal." et je vais demander que le «D» se termine à un octet en mémoire. Je n'ai rien d'autre à faire dans mémoire, donc Daven a obtenu la première place à un octet. Ce, alors, va être 0x2. Cela va 0x3. Cela va être 0x4. Cela va 0x5. Cela va être 0x6. Mais une fois que vous commencer à penser sur ce Doing l'ordinateur sous le capot, vous pouvez commencer à déduire comment vous, il ya quelques années, serait ont mis en œuvre C lui-même. Quel est GetString probablement returning-- car il sent comme il n'est pas Daven retour, en soi, parce qu'il a sûrement pas aller pour tenir dans ce petit box-- si ce n'est GetString probablement de retour? PUBLIC: [inaudible] DAVID J. Malan: L'emplacement de Daven. Et il a été fait ce depuis la première semaine. Qu'est-ce GetString est vraiment retour n'est pas une chaîne, en soi. C'est l'un des petits mensonges blancs. Il est de retour l'adresse de l' chaîne dans la mémoire, l'adresse unique. Daven vit à 33 Oxford Street. Mais de façon plus succincte, Gavin vit au 0x1, adresse, numéro un. Alors, que se mettre dans cette petite boîte alors, pour être clair, est juste l'adresse de cette chaîne. Donc, tout ce temps, ce est en cours. Mais ce que cette allusion à maintenant, c'est que si tout s a est un nombre à l'intérieur de celui-ci, qui est de vous arrêter, le programmeur, un nombre quelconque de mise en n'importe quelle variable et de sauter à ce morceau de mémoire? Et en effet, nous verrons c'est une menace prochaine fois. Mais pour l'instant, cela se sent insuffisant. Si je dis, me chercher un chaîne, vous me donnez Daven. Mais vous n'avez pas vraiment me donnez pas Daven. Tout ce que vous me donnez est l'adresse de Daven. Comment puis-je savoir alors c'est sûr Daven où commence et ends-- l'histoire de l'obtention weird-- Daven où commence et se termine, et ensuite, la prochaine chaîne dans la mémoire commence? Eh bien, si vous êtes remise moi le début de Daven, essentiellement, comment puis-je savoir où la fin de son nom? Ce caractère spécial null, qui est d'autant plus important maintenant si des chaînes en dessous de la capot sont simplement identifiés de façon unique par leur emplacement dans la mémoire. Donc, tout ce temps, c'est ce qui a été en cours. Ainsi, lorsque l'on regarde maintenant le code ici, expliquer si vous voulez le bogue dans la ligne 26. Pourquoi est-Zamyla et Zamyla différent? Pourquoi est-Gabe et Gabe différent? Oui, à l'arrière. PUBLIC: Ils ont des adresses différentes. DAVID J. Malan: Tout simplement parce que ils ont des adresses différentes. Parce que quand vous appelez GetString encore une fois, que je vais le faire rapidement ici, si c'est la deuxième ligne, chaîne t, comme je l'ai fait dans ce programme, est égal à un autre appel à GetString. La prochaine fois que j'appelle GetString, je vais pour obtenir un autre bloc de mémoire. GetString est autorisé de demander à l'exploitation système de mémoire de plus en plus. Il ne va pas réutiliser le même six octets à chaque fois unique. Il va y avoir une nouvelle bloc de mémoire, qui signifie t va se faire une autre valeur ici. Donc, quand je fais du égal = t, vous n'êtes pas la comparaison D contre cela et contre un ce et V contre cela. Vous comparez ce dans ce qui est franchement useless-- jolie useful-- est assez inutile, car qui en ont vraiment se soucie où les cordes sont dans la mémoire? Et en effet, nous n'avons pas. Et nous n'allons pas commencer particulièrement attentionné. Que dans la mesure que les bugs peuvent survenir et les menaces de sécurité peuvent survenir volonté nous commençons réellement à se soucier de cela. Donc, nous allons résoudre ce problème. Il s'avère que, vous le réparer superbe tout simplement. Et de laisser effectivement, avant que je révèlent que nouveau, ce qui serait vous si dans une classe CS50, et vous avez eu à mettre en œuvre une comparaison par rapport à deux chaînes. Vous avez clairement ne pouvez pas utiliser l égal = t. Mais tout logiquement, comment voulez-vous comparer cette chaîne contre cette chaîne en utilisant le code C? Ouais. PUBLIC: Il suffit de faire la pour la boucle [inaudible] DAVID J. Malan: Parfait. PUBLIC: [inaudible] DAVID J. Malan: Ouais. Il suffit d'utiliser une boucle ou un while ou autre. Mais il suffit d'appliquer l'idée de base que si il s'agit d'un morceau de la mémoire ou un tableau et c'est, itérer sur les deux en même temps. Et il suffit de comparer les lettres. Et vous avez à être un peu prudent, parce que vous ne veulent pas d'un doigt de dépasser l'autre car une corde est plus longue que l'autre. Donc, vous allez vouloir vérifier pour cette valeur spéciale à la fin, null. Mais il est vraiment, dans la fin, aussi simple que cela. Et franchement, nous n'avons pas besoin de réinventer cette roue. Voici la version deux. Et ce que je vais dire ici, c'est que au lieu de comparer s est égal à = t, Je vais dire à la place, si la chaîne comparaison de s est égale à virgule t = 0. Maintenant, ce qui est une chaîne de comparer? Il s'avère, c'est une fonction qui livré avec C, dont le but dans la vie est de comparer deux chaînes. Et remuer comparer, si nous lisons son page de manuel ou de la documentation ou CS50 référence, il sera tout simplement vous dire que remuer comparer les rendements soit un négatif nombre ou un nombre positif ou nul, où zéro signifie qu'ils sont égaux. Il suffit donc de conjecture. Qu'est-ce que cela pourrait signifier si remuer rendements comparer valeur négative ou valeur positive? PUBLIC: Supérieur ou inférieur. DAVID J. Malan: Ouais, supérieure ou inférieure. Donc, si vous voulez trier un ensemble bouquet de chaînes dans un dictionary-- que nous finirons par en bas de la road-- fonction parfait à utiliser éventuellement, parce que ça va le faire comparaison de chaînes de caractères pour vous, et dire vous fait un vient avant b, ou ne b comparaître devant un ordre alphabétique. Nous pouvons faire exactement cela. Et remarquez que j'ai fait un autre chose dans cet exemple. Qu'est-ce qui a changé plus dans cette fonction principale? Char *. Et c'est cet autre mensonge. Pendant tout ce temps, lorsque vous avez été écrit chaîne, nous avons été secrètement en train de réécrire chaîne comme char * afin que clang fait vous comprend. En d'autres termes, dans CS50.h et que nous finirons par voir, nous avons fait une chaîne de synonyme appelé c'est la même chose que char *. Et pour l'instant, de savoir que ce que l' *, Dans ce contexte, au moins, signifie l'adresse. L'adresse de quoi? Eh bien, le fait que je l'ai dit char *, et non int * ou * flotter, un moyen qui est char * l'adresse d'un caractère. Donc, cette petite boîte ici, aka chaîne, est vraiment de type char *, qui est tout simplement une façon élégante de dire, dans cette boîte ira une adresse. Et qu'est-ce que cette adresse référence? Apparemment, un omble chevalier. Mais nous ne pouvions absolument avoir int * et d'autres choses. Mais pour l'instant, char * est vraiment le plus simple et l'un des intérêts. Donc, ce problème va d'augmenter, même si, encore une fois. Supposons que j'ouvre ce programme. Voyons voir si nous pouvons maintenant prédire Quel est le problème avec ce code. Donc, dans ce programme, copier-0, je suis aller de l'avant et de nouveau communiquer GetString et stocker la valeur de l'art. Et puis, pourquoi je fais cela, juste comme un rappel de quelques semaines passé? Nous avons dit que GetString renvoie parfois nulle. Qu'est-ce que cela signifie si GetString renvoie null? Quelque chose s'est mal passé. Cela signifie probablement la chaîne est trop grand, sur la mémoire de l'ordinateur. Il arrive super, super, super rarement, mais cela pourrait arriver. Nous voulons vérifier pour elle, et c'est tout ce que nous faisons. Parce que nous allons voir maintenant, si vous n'avez pas commencer à vérifier habituellement pour des choses comme nulle, vous pourriez réellement commencer à aller à des adresses en mémoire qui ne sont pas valides. Et vous allez commencer à induire de plus en plus des erreurs de segmentation. Ou un Mac ou un PC, tout amener un ordinateur à accrocher ou un programme de geler, potentiellement. Alors maintenant, je prétends en copie-0.c, que je vais copier ces chaînes par de la ligne 28. Et puis, je vais la revendication en bas ici que je vais de changer l'un d'eux. Donc apercevoir. J'appelle notre vieil ami strlen. Et tout expliquer en anglais Qu'est-ce que la ligne 34 est en train de faire? Qu'est-ce que t support 0 représenter sur la gauche. Ouais. AUDIENCE: Le premier caractère de t? DAVID J. Malan: Le premier caractère de t. C'est tout. Le premier caractère de t, je veux d'attribuer la version majuscule du premier caractère à t. Donc ce capitalise la première lettre. Et puis, la dernière chose que je fais dans ce programme, c'est que je prétends ici est l'original, s, et voici la copie, t. Mais sur la base de l'histoire que nous venons de dit à propos de ce que les chaînes sont vraiment, ce qui est vraiment la ligne 28 faire, et ce qui est le bug entraînant aller d'être à l'écran? Alors d'abord, la première question, 28. Qu'est-ce que la chaîne t = s vraiment en train de faire? Si nous avons sur la gauche côté ici chaîne t = s; ça me donne une boîte ici et une boîte ici. Et supposons que cette adresse est 0x, disons, 50 cette fois-ci, de façon arbitraire. Qu'est-ce que la chaîne t = s faire sous le capot? PUBLIC: [inaudible] DAVID J. Malan: Il stocke la mémoire il adresse, de sorte 0x50 y va. Donc, si maintenant, je vais à la première caractère en majuscule et t il, ce que je fais efficacement à s? Je fais vraiment la même chose, non? Parce que si Adresse 0x50-- et juste, je n'ont pas beaucoup de place sur la carte ici, mais supposons que ce soit 0x50 ici-bas, quelque part dans la mémoire de mon ordinateur. Et j'ai, par exemple, Gabe en minuscules là, comme ça. Et je l'ai dit t support 0 se capitalise. Eh bien, t support est 0 la première lettre t. Si peu g va devenu grand G. Mais le problème est, ce qui ne s ont aussi pointer vers? AUDIENCE: Le même. DAVID J. Malan: exactement la même chose. Ainsi, une explication simple peut-être, même si la syntaxe est un peu bizarre. Donc, nous allons le faire. Assurez-copie-0 puis ./copy-0. Dire quelque chose: Gabe. Et malheureusement, les deux les ont été capitalisés, mais pour ce sous-jacent raison pour laquelle nous sommes tout simplement maintenant faire face à des adresses. Alors, comment pouvons-nous commencer à address-- sans jeu de mots intended-- comment pouvons-nous commencer à traiter ce problème particulier? Eh bien, dans copy1.c, les choses vont pour obtenir un peu plus compliqué. Mais je voudrais demander une solution conceptuellement simple. Si difficile à obtenir à première vue. Ne va pas être facile pour la première fois que vous tapez-le, peut-être, mais si le problème est que faisant tout simplement t = s seulement copies l'adresse, ce qui, encore si je peux prendre à vous, va être la solution pour la copie fait une chaîne? PUBLIC: Nous allons probablement utiliser de nouveau une boucle. DAVID J. Malan: Ouais. Donc, nous allons avoir besoin de nouveau une boucle. Et parce que si nous voulons copier une chaîne s dans une autre chaîne, nous voulons probablement de le faire caractère par caractère. Mais le problème est, si ceci est à l'origine de, maintenant nous devons commencer explicitement allouer de la mémoire pour t. En d'autres termes, nous allons redessiner une dernière fois. Si ce n'est = GetString de chaîne. Et nous allons mettre ce ici, aussi. C'est GetString. Et puis, l'image de quelque chose comme ça va être comme avant, g-a-b-e-/ 0. Cela ressemble un peu quelque chose comme ça. Et donc l'art, on appelle ce 0x50, et que ça va être 51, 52. C'est donc 0x50. Et puis, je fais chaîne t. Dans la mémoire, qui va tout simplement donnez-moi une petite place comme ça. Alors, quelle est l'étape clé maintenant? Si je veux copier s en t, ce qui blanc devons-nous remplir ici? Ou qu'est-ce que nous devons faire à un niveau élevé? Ouais? Quelqu'un? Ouais. PUBLIC: Nous avons besoin de [inaudible]. DAVID J. Malan: Oui, nous besoin de remplir ce vide. Je ne peux pas copier, puis capitaliser le nom de Gabe jusqu'à ce que je demande au système d'exploitation pour un autre bloc de mémoire c'est au moins aussi grand que l'original. Alors que nous laisse avec une question. Comment puis-je demander au système d'exploitation ne juste pour un simple petit pointer-- comme ce qu'on appelle, une adresse, une pointer-- pas un peu simple boîte comme ce appelé une chaîne? Comment puis-je demander l'exploitation système pour une grande partie de la mémoire? Jusqu'à présent, je n'ai eu que de retour indirectement en appelant GetString. Alors, comment est GetString même obtenir sa mémoire? Eh bien, il s'avère qu'il n'y a cette autre fonction ici que nous allons maintenant commencer à utiliser. Maintenant, cela ressemble than-- façon plus cryptique et je suis le seul qui peut voir it-- cette ligne a l'air bien plus cryptique alors il devrait à première vue. Mais nous allons taquiner à part. Sur le côté gauche, j'ai char * t. Donc, en anglais, nous allons commencer à formuler des phrases correctes dans le jargon technique. Donc ce alloue une variable de type char * appelé t. Maintenant, qu'est-ce que cela signifie réellement? Eh bien, cela signifie, que vais-je à mettre dans cette variable appelée t? Une adresse d'un caractère. Donc, ce n'est que le plus simple, plus de façon raisonnable de décrire le côté gauche. Cela crée cette boîte ici seulement. Donc le côté droit, sans doute, va d'allouer plus que bloc de mémoire comment? Donc, nous allons taquiner cet appart. Il est écrasante au premier abord, mais ce qui se passe à l'intérieur ici? Tout d'abord, il ya malloc, qui est apparemment notre nouvel ami, «Mémoire allouer." Donc, c'est l'argument étant passé en elle, c'est donc un assez grand argument. Donc, nous allons taquiner cet appart. strlen de s, bien sûr, représente the-- AUDIENCE: Le nombre de caractères. DAVID J. Malan: Juste le nombre de caractères dans s. Ainsi, la longueur de s, la chaîne d'origine. So G-a-b-e. C'est donc probablement quatre dans ce cas. Pourquoi suis-je en train de faire une après appels à strlen de s? PUBLIC: [inaudible] DAVID J. Malan: Pour que caractère spécial nulle. Si vous me demandez quelle est la longueur de Le nom de Gabe, je vais dire quatre. Sous le capot, cependant, je dois que le cinquième octet pour le caractère nul. C'est pour cela que je fais la une. Maintenant, juste au cas où vous utilisez ce programme sur un ordinateur autre que, par exemple, l'appareil de CS50, où la taille d'un caractère peut être différent de ma propre computer-- s'avère que je peux appeler ce opérateur sizeof, il suffit de demander l'ordinateur, quelle est la taille d'un carboniser sur cet ordinateur? Et en multipliant par cinq dans ce par exemple la taille d'un caractère, qui sur la plupart des ordinateurs juste un, malloc va allouer pour moi ce grand bloc de mémoire ici sur la droite. Et ça va return-- c'est un function-- il est donc va revenir à moi quoi? PUBLIC: L'adresse? DAVID J. Malan: L'adresse de quoi? PUBLIC: De la mémoire, il alloué? DAVID J. Malan: De la mémoire, il alloué. Donc, je n'ai aucune idée, franchement, où cela va finir. Je vais proposer que ça va finir à 0x88. Tout à fait arbitraire, mais ailleurs que 0x50, parce que le système d'exploitation, ce qui Windows et Mac OS font pour moi, est assurez-vous que c'est donner moi différents morceaux de RAM. Donc, c'est la valeur où ce bloc de mémoire pourrait finir. Donc, c'est ce qui finit ici, 0x88. Alors maintenant, clairement, je peux comprendre ce qui n'est pas le même que celui, parce qu'ils en montrant différents blocs de mémoire. Donc, si je veux maintenant fait de copier ce en, faisons la solution proposée. Disons simplement aller, créer une boucle, et faire t support i obtient de support i. Parce que maintenant je peux utiliser cette notation semblable à un tableau, parce que même si malloc très me alloue génériquement mémoire, mémoire est juste octets contigus. Octet, octet, octet, dos à dos à dos. Je ne peux certainement en tant que programmeur traiter comme un tableau, qui signifie que je peux utiliser ce enfin familier notation de seulement quelques crochets. Alors permettez-moi de m'arrêter là, parce que c'est beaucoup à la fois, même si l'idée de base pour récapituler est cette chaîne, tout ce temps, n'est pas un nouveau type de données en soi. C'est juste un pointeur soi-disant, une adresse d'un caractère, ce qui signifie que c'est un nombre que par convention humain nous avons tendance à écrire comme 0x quelque chose. Mais c'est juste un nombre, comme 33 Oxford Street, qui se trouve être l' Adresse de bâtiment CS. Vous avez des questions sur ces détails? Ouais? PUBLIC: Pourquoi nous vérifions pour t égal à null? DAVID J. Malan: Pourquoi avons-nous vérifier t égal à null? Si nous lisons la documentation-- grand question-- pour malloc, il va dire en petits caractères, parfois malloc pourrait retourner null, comme GetString. Et en effet, GetString renvoie null si, à son tour, malloc renvoie null, parce GetString utilise malloc. Et qui pourrait se produire si le système d'exploitation, Mac OS, Windows, que ce soit, est tout simplement de mémoire pour vous. Voilà donc ce qui s'est passé. Et permettez-moi de révéler une autre chose qui pourrait bien souffler votre esprit ou complètement être trop loin sur la ligne. Mais laissez-moi ôter la même pour la boucle pour la copie, Il ya un moment où, le rappel était ce. t i obtient support de tranche i. Nice et conviviale. On se sent comme la deuxième semaine de nouveau. Mais cette version peut effectivement être réécrite comme cela, qui semble énigmatique. Il s'agit d'un pointeur de la technique appelée arithmétique, adresse arithmétique. Mais pourquoi ça marche? Maintenant, fâcheusement, le auteurs de C ont décidé d'utiliser le symbole * dans des buts différents. Nous avons vu qu'il était déjà une fois, char *, qui signifie «donne-moi une variable qui va contenir l'adresse d'un caractère. " * Donc, l'omble dans ce contexte signifie «donne-moi une variable." Malheureusement, si vous utilisez l'* sans un mot en face d'elle, comme l'omble, il est maintenant appelé le opérateur de déréférencement. Et nous allons voir plus de cette avant longtemps. Mais cela signifie juste "y aller." C'est comme dire que, si quelqu'un me tendit sur un morceau de papier "33 Oxford Street," si je fais "* 33 Oxford Street," ce qui signifie "Descendre la route à la construction CS." Donc * signifie juste là si aller il n'y a aucun mot en face d'elle. Alors, quelle est t, pour être clair? t est l'adresse de la partie de mémoire qui a été donnée de nouveau à moi. s est l'adresse de ce qui, pour être clair, dans l'exemple que nous avons discuté, de gabe minuscules? s est l'adresse de-- PUBLIC: La chaîne. DAVID J. Malan: De nom original de Gabe. C'est donc l'adresse de ce morceau de mémoire. Donc, si je dis t + i i--, avis, est juste notre vieil ami. C'est juste une variable d'index que cela itération à partir de zéro sur place à la longueur de la chaîne s. Donc ça va être zéro, un, puis deux, puis trois, puis quatre. Donc, nous allons assembler ces nouveaux Des pièces de puzzle rayures comme, si vous voulez, même si, encore une fois, la syntaxe est beaucoup plus obscur que Scratch. Donc t est une adresse + i va me donner un certain nombre, parce que ce sont tous chiffres que nous avons dessin comme hex. Mais ils ne sont que des chiffres. Donc, si l'adresse de t nous dit était 0x88, 0x88 ce n'est plus zéro. Même si vous n'êtes pas à l'aise avec six pans encore, faire une supposition. PUBLIC: L'original. DAVID J. Malan: Toujours 0x88. Alors qu'est-ce * 0x88 signifie? Cela signifie, "y aller", qui signifie effectivement, «Avance ton doigt ici." Et maintenant, sur le côté droit de cette expression, * puis dans parens, s + i signifie s, ce qui est le traiter ici de la petite g. s + 0 est, bien sûr, s, quel que soit l est. Alors maintenant, c'est * s, tout comme 33 * Oxford Street signifie aller à l'adresse s. Alors, voici ce doigt, la main droite. Alors qu'est-ce que je vais copier dans quoi? La chose sur la droite, qui est gabe, peu g ici, en voici. Et si l'effet de cette première itération de la boucle, comme vous l'avez proposé, même s'il semble fou plus compliqué que tout nous avons vu auparavant, dit simplement aller ici et copier ce personnage ici. Il te donne une carte à deux endroits. Et nous allons voir beaucoup plus de cette. Mais pour l'instant, l'espoir est tout à introduire certaines de ces idées de base. Et en effet, regardons un programme final ici, puis la pâte à modeler promis, qui fera que tout va bien. Bien. Alors permettez-moi d'ouvrir up-- là nous allons. Alors laissez moi-- nous reviendrons à cette image avant longtemps. Permettez-moi d'ouvrir cette dernier exemple ici. Voici donc un super, super programme qui accomplit rien dans la vie qui fait la suivante. Il déclare d'abord deux variables, x et y, qui ne sont pas des nombres ce temps, en soi. Ils ne sont pas entiers, en soi. Ils sont apparemment int *. Donc n'importe qui, ça veut dire quoi si votre type de données, votre variable, est de type int * étoiles? C'est l'adresse d'un int. Donc, je n'ai aucune idée d'où il est encore. Cela signifie tout simplement "mis, par la suite, l'adresse d'un int ici. " 0x50, 0x88, où il est en mémoire, une adresse y va. Et c'est ce qui y est va être ainsi. Si je vous dis maintenant x = malloc (sizeof (int)), c'est une façon élégante de dire, hey système d'exploitation, via malloc, me donner assez de mémoire pour la taille d'un int, ce qui est probablement va être 32 bits ou quatre octets. Alors qu'est-ce que malloc revenir? Malloc renvoie une adresse. Alors, que va se faire stockée dans x? L'adresse de la partie de la mémoire, les quatre octets, que malloc vient de trouver pour moi en demandant le système d'exploitation. Maintenant, quant à lui, ligne quatre ici, le * x = 42. Juste pour être clair, ce qui se passe là-bas? Sur le côté gauche, * x. c'est comme * 33 Oxford Street. Donc * x signifie quoi? PUBLIC: Aller à. DAVID J. Malan: Aller à cette adresse. Partout où ce morceau de la mémoire est, allez-y. Et mettre ce que là, évidemment? PUBLIC: 42. DAVID J. Malan: 42. Tous les droits, y *, même idée. Allez à l'adresse en y. Mettez le numéro 13 là-bas, mais ce qui est y en ce moment? PUBLIC: Il n'y a pas de mémoire pour y. DAVID J. Malan: Il est pas de mémoire pour y. Alors qu'est-ce y probablement contenir, comme nous l'avons dit? PUBLIC: Garbage. DAVID J. Malan: Certains valeur des ordures. Maintenant, la valeur des déchets est encore un certain nombre. Il peut encore être confondu avec une adresse. C'est comme si quelqu'un griffonné quelque chose en bas, et j'ai mal interprété comme signifiant quelques bâtiments dans la rue. Et si vous essayez juste d'entrer dans quelques bâtiments vous ne possédez pas, ou un morceau de mémoire que vous ne l'avez pas été donné, de mauvaises choses peuvent se produire. Ordinateur peut se bloquer, ou de quelque autre comportement indéterminé pourrait se produire. Donc l'intro, puis, à Binky est la suivante. Je me souviens encore, 20 et quelques années plus tard, où j'étais quand j'ai finalement compris pointeurs. C'est-à-dire, si vous laisser ici en trois minutes et je pense que je ne suis pas comprendre les pointeurs, réaliser Je me suis souvenu de 20 ans pour une raison folle quand et pourquoi il a finalement coulé en, assis avec mon enseignement camarade, Nishat Mehta dans le retour d'Eliot Dining Hall. Maintenant, je suis rappelé ce parce que c'était l'un des thèmes I, dans notamment, aux prises avec. Et puis, il a finalement cliqué, comme j'ose dire beaucoup de sujets finira par y arriver. Et maintenant, de faire sentir que tout le heureux et d'autant plus convaincante, nous allons jeter un dernier coup d'œil dans notre trois dernières minutes ici à Binky, de notre ami, Nick Parlante de Stanford. [VIDEO LECTURE] Hé, Binky. Réveillez-vous! Il est temps pour pointeur plaisir. -Quel Ce que c'est? En savoir plus sur les pointeurs? Oh, Goody! Eh bien, pour commencer, je suppose que nous sommes va avoir besoin de quelques pointeurs. -OK. Ce code attribue deux pointeurs, qui peut pointer vers entiers. -OK. Eh bien, je vois les deux pointeurs, mais ils ne semblent pas être pointant à quelque chose. -C'est Droite. Initialement, les pointeurs ne pointent pas à quoi que ce soit. Les choses qu'ils pointent vers sont appelés pointees, et leur mise en place de une étape séparée. Oh, droite, droite. Je le savais. Les pointees sont séparés. Er, alors comment voulez-vous allouez un pointée? -OK. Eh bien, ce code alloue un nouveau pointée entier, et cette partie sont présentées x pour pointer vers elle. Hé, qui semble mieux. Donc, pour lui faire faire quelque chose. -OK. Je vais déréférencer le pointeur x à enregistrer le numéro 42 dans son pointée. Pour cette astuce, je vais avoir besoin de mon Baguette magique de déréférencement. -Votre baguette magique de déréférencement? That-- c'est très bien. -C'est Ce que le code ressemble. Je viens de mettre en place le nombre, et [POP] Hé, regardez. Là, il va. -So Faire un déréférencement x suit la flèche pour accéder à son pointée. Dans ce cas, un magasin 42 là-dedans. Hey essayez de l'utiliser pour stocker le nombre 13 à l'autre pointeur, y. -OK. Je vais aller sur ici pour y, et obtenir le numéro 13 mise en place. Et puis, prendre la baguette de Déréférencement et juste [BUZZ] Oh! Oh, hey! Cela n'a pas fonctionné. Dis, Binky, je ne pense pas que le déréférencement y est une bonne idée, parce que vous savez, mise en place du pointée est une étape séparée. Et je ne pense pas que nous ayons jamais fait. Point -Bonne. Ouais. Nous avons réparti le pointeur y, mais nous jamais mis pour pointer vers un pointée. -Très Attentif. Hé, vous êtes à la recherche bien là, Binky. Pouvez-vous résoudre ce problème afin que les points y à la même pointée comme x? -sure. Je vais utiliser ma baguette magique Affectation de pointeur. -Est Qui va être un problème comme avant? -No. Cela ne touche pas les pointees. Il change juste un pointeur vers pointer vers la même chose que l'autre. Oh, je vois. Maintenant y pointe vers le même endroit que x. Donc attendre. Maintenant, y est fixé. Il dispose d'un pointée. Ainsi, vous pouvez essayer la baguette de Déréférencement de nouveau d'envoyer le 13 plus. -Euh, OK. Ici, il va. [POP] Hé, regardez ça. Maintenant déréférencement travaux sur y. Et parce que les pointeurs partagent que l'on pointée, ils voient tous deux le 13. Ouais. Partage, peu importe. Donc, allons-nous changer de place maintenant? Oh, regarde. Nous n'avons plus de temps. -But-- -Just Rappeler les trois règles de pointeur. Number One, la structure de base c'est que vous avez un pointeur, et il fait plus à un pointée. Mais le pointeur et pointée sont séparés, et l'erreur commune est de mettre en place un pointeur, mais oublier de lui donner un pointée. Numéro deux, déréférencement commence au niveau du pointeur et suit sa flèche sur pour accéder à son pointée. Comme nous le savons tous, ce ne fonctionne que s'il existe un pointée, le type de revient à la règle numéro un. Numéro trois, pointeur affectation prend un pointeur et modifie pour pointer vers l' même pointée comme un autre pointeur. Donc, après la cession, les deux pointeurs va pointer vers le même pointée. Parfois, c'est ce qu'on appelle le partage. Et c'est tout ce qu'il ya à faire, vraiment. Bye-bye maintenant. [FIN LECTURE VIDÉO] DAVID J. Malan: C'est tout pour CS50. Nous nous reverrons la semaine prochaine.