[Powered by Google Translate] [Semaine 4, suite]
[David J. Malan - Université de Harvard]
[C'est CS50. - CS50.TV]
>> C'est CS50, et c'est la fin de la semaine 4.
Donc, quelques bonnes nouvelles et de mauvaises nouvelles.
Aucune conférence le lundi, pas de problème réglé la semaine prochaine. [Applaudissements des étudiants]
Vous n'allez pas aimer où cela se passe.
Mais nous avons ce lieu mercredi prochain,
et il ya aussi par le programme 1 conférence vendredi prochain vendredi pour que nous puissions rester sur la bonne voie.
Mais tout sera filmé comme d'habitude, donc ne vous inquiétez pas.
>> Et en ce qui concerne quiz 0 que nous allons faire vers fin de la semaine
est poster sur cs50.net page d'accueil du cours d'explication
de ce genre d'attentes, vous devriez avoir quand il s'agit de le premier quiz.
En général, il sera à choix multiple, vrai ou faux, réponse courte, courtes problèmes de codage.
Vous n'allez pas attendre pour mettre en œuvre l'équivalent
d'un problème que vous pouvez voir sur un ensemble de processeurs, pour lequel vous avez un ordinateur
et un débogueur et autres, mais il y aura de petits problèmes de codage.
>> Et en effet, le meilleur guide pour avoir une idée de ce quiz sont comme CS50
est d'aller à cs50.net, cliquez sur le lien Quiz,
et vous pouvez voir les dernières années la valeur de quiz.
Il faut juste réaliser que le programme n'a pas toujours été le même au fil des ans.
Parfois, nous ajoutons parfois des soustractions,
donc si vous voyez quelque sujet sur un de ces vieux jeux-questionnaires
que vous n'avez aucune idée de ce qu'il parle, c'est soit que nous ne couvrez
ou que nous n'avons pas le couvrir.
Mais sous la forme d'avis, ce dimanche, le lundi et le mardi
ainsi que d'un cours à l'échelle session d'examen dans la nuit de dimanche -
heure et le lieu seront annoncés sur le site Internet du cours -
vous avez tous l'occasion d'examiner avec les boursiers d'enseignement du cours de
le matériel pour cette année, à la fois en coupe et en classe entière,
et ceux qui seront filmés comme d'habitude aussi.
>> Très bien. Alors sans plus tarder, un commentaire sur pass / fail et ajouter / supprimer.
Vous pouvez avoir vu mes notes hier soir, et c'est vraiment juste une assurance supplémentaire
que si vous êtes parmi ceux qui sont particulièrement moins à l'aise ou quelque part entre
et vous vous sentez un peu en dessus de votre tête,
rends compte que c'est en effet tout à fait normal, et il ya une structure large soutien en place,
dont les heures de bureau sont désireux d'améliorer d'autant plus pour ma dernière nuit courriel,
et de réaliser aussi que comme une option réussite / échec pour une classe comme ceci
est vraiment conçu comme un mécanisme pour prendre le bord d'un cours comme celui-ci,
de sorte que de nouveau si vous passez les 10, 15, 20 heures
juste essayer d'obtenir quelque pset à travailler et vous savez que vous êtes à 90-95% de la façon dont il
mais vous ne pouvez pas trouver un bug damn, dans une réussite / échec c'est une sorte de bien.
>> L'idée est que, avec ce mécanisme, vous pouvez alors aller vous concentrer sur vos psets autres
dormir ou quoi que ce soit que vous voulez mettre l'accent.
Alors rendez compte que vous avez jusqu'à mardi prochain - techniquement le 5 lundi,
mais c'est un jour férié, donc mardi prochain - pour passer de réussite / échec-versa ou vice graduées.
Et si vous êtes vraiment au bord du précipice et que vous envisagez d'abandonner tout à fait,
s'il vous plaît me rattraper après la conférence ou envoyez-moi une note.
Nous aimerions au moins le chat avant de vous dire adieu.
Très bien. Nous avons donc commencé à prendre les roues de formation la dernière fois.
En particulier, nous nous sommes concentrés sur la chaîne.
String est quelque chose qui est déclarée dans la bibliothèque CS50,
spécifiquement dans ce fichier appelé cs50.h que nous allons commencer à regarder cette semaine et la suivante.
Mais la chaîne est vraiment juste une simplification de quelque chose
c'est un peu plus arcanely décrit comme char *.
Char nous connaissons. C'est juste un seul caractère.
Mais * à compter du lundi notée quoi? >> [L'élève] Un pointeur.
Un pointeur. Et qu'est-ce qu'un pointeur? >> [L'élève] Une adresse.
>> C'est comme une adresse, un lieu de mémoire.
Qu'est-ce qu'une adresse ou le lieu ou la mémoire?
Encore une fois, nous avons tous des ordinateurs portables avec un concert ou 2 gigaoctets de RAM probablement ces jours-ci,
et cela signifie que vous avez un milliard ou 2 milliards d'octets d'une valeur de mémoire.
Et il ne compte pas vraiment ce que cela donne comme physiquement,
mais prendre sur la foi que vous pouvez numéroter tous les octets individuels que votre propre ordinateur portable a -
c'est l'octet 0, c'est l'octet 1, c'est l'octet 2 milliards de dollars -
et c'est exactement ce que fait un ordinateur.
Lorsque vous allouer de l'espace pour un seul caractère, par exemple,
il a évidemment de vivre quelque part dans la mémoire de votre ordinateur,
et c'est peut-être à l'octet numéro 12345,
et c'est quelque part ici dans la mémoire de votre ordinateur.
Et puis l'adresse de ce caractère est 12345.
>> Maintenant, à la semaine 0 et jusqu'à maintenant, nous n'avons pas vraiment pris en charge
où les choses en mémoire sont stockées parce que nous avons l'habitude d'utiliser des symboles,
les variables et les tableaux pour obtenir réellement à nos données.
Mais à partir de lundi et d'autant plus aujourd'hui, vous allez maintenant avoir
toutes les capacités expressives avec plus d'écrire des programmes
pour vraiment gérer la mémoire de l'ordinateur comme bon vous semble,
à des fins bonnes et mauvaises,
insectes étant un résultat très fréquent à ce stade de l'apprentissage de ce genre de choses.
Mais qu'est-ce que cela signifie vraiment d'être un char *?
Allons de l'avant vers - et nous y reviendrons Binky comme promis aujourd'hui.
Allons-y d'un exemple simple ici.
Permettez-moi de sauver ce fichier comme compare.c, et laissez-moi juste un peu de code modèle ici
donc inclure stdio.h, permettez-moi de me donner incluent cs50.h. Je vais faire un zoom avant là-haut.
Permettez-moi de commencer à écrire int main, main (void), et maintenant je veux faire quelque chose comme ceci:
printf ("Donnez-moi une chaîne:") et puis je vais utiliser la chaîne s se GetString
pour obtenir une chaîne de l'utilisateur, alors je vais demander à l'utilisateur pour un autre.
(«Donne-moi une autre chaîne:") et je vais les poser à GetString pour l'obtenir.
Je vais l'appeler parce que t t vient après s et s est un joli nom pour une chaîne si elle est assez générique.
Donc GetString, et maintenant je veux juste faire un test de cohérence et je vais dire
if (s == t) alors je vais juste dire à l'utilisateur printf ("Vous avez tapé la même chose \ n");
sinon je vais imprimer quelque chose comme ("Vous avez saisi quelque chose de différent! \ n")
ou quelle que soit la peine sera. Donc, quelque chose comme ça.
Puis, comme d'habitude, je vais retourner 0, ce qui signifie tout simplement que rien n'est arrivé,
et je vais aller de l'avant et de compiler et exécuter ce programme.
>> Mais lundi, nous avons couru ce programme,
et effectivement a dit que BONJOUR BONJOUR n'est pas et n'est pas ADIEU AU REVOIR.
Le comportement que nous avons vu était un peu plus comme ça.
Laissez-moi aller dans mon répertoire source, effectuez un zoom avant ici, et faisons-faire comparer.
Compilé bien. Permettez-moi de courir comparer. Donnez-moi une corde: BONJOUR.
Donnez-moi une autre chaîne: BONJOUR.
Vous avez tapé quelque chose de différent!
Eh bien, laissez-moi essayer quelque chose de simple comme 50, 50. Vous avez tapé quelque chose de différent!
Salut, salut. Il apparaît donc clairement, quelque chose qui se passe ici.
Mais ce qui était l'explication de pourquoi?
Apparemment, la ligne 12 est complètement dysfonctionnel.
Quel est le problème fondamental? Ouais. >> [L'élève] C'est en comparant les adresses.
Oui, exactement. Il s'agit en fait de comparer les adresses
dans lequel BONJOUR BONJOUR et sont stockés.
Ce n'est pas de comparer les lettres BONJOUR, encore et encore,
parce que ce qui s'est réellement passé, tout ce temps, nous avons utilisé GetString -
Ce tableau est à nouveau la mémoire de notre ordinateur,
et disons que j'appelle GetString après avoir déclaré une variable s.
Qu'est-ce que ma mémoire ressembler?
Nous allons arbitrairement que l ressemble à ceci. Il s'agit d'un carré.
Et à peu près n'importe quel moment j'ai dessiné un morceau de la mémoire sur l'écran
si c'est 32 bits Je dessine des carrés comme celui-ci car en effet dans l'appareil,
un pointeur, d'une adresse, est de 32 bits. C'est la même chose comme un int.
Cela peut varier en fonction sur le système informatique.
Ceux d'entre vous qui sont vaguement familier avec le fait que votre Mac ou votre PC est de 64 bits,
qui désigne en fait que votre ordinateur utilise des pointeurs 64 bits,
Adresses 64 bits, et parmi les bons côtés de ce que sont vos ordinateurs
RAM peut avoir beaucoup plus que jadis.
Longue histoire courte, retour dans la journée quand les ordinateurs utilisés uniquement 32 bits
pour représenter les adresses, le plus grand nombre d'octets que vous pourrait représenter
Dans cette affaire, si vous avez 32 bits?
Donc, 4 milliards, à droite, parce que 2 à la 32 est de 4 milliards d'euros.
Ce nombre a été récurrents dans le cours.
>> Donc, si vous avez seulement 32 bits, le nombre le plus élevé vous pouvez compter pour à peu près 4 milliards.
Mais c'était une limitation fondamentale des ordinateurs jusqu'à il ya quelques années
parce que si vous ne pouvez compter jusqu'à 4 milliards de dollars
ce n'est pas grave si vous achetez 8 Go de RAM ou même 5 giga-octets de RAM;
vous ne pouvez pas compter que haute, il était donc inutile.
Vous pouvez uniquement accéder les 3 ou 4 premiers gigaoctets de mémoire de votre ordinateur.
C'est moins un problème maintenant, et vous pouvez acheter MacBook Pro et Dells
avec 8 Go de RAM ou même plus ces jours-ci.
Mais si je allouer tout simplement à ce programme un pointeur, un pointeur appelé s,
il pourrait ressembler à ceci sur l'écran car en effet nous avons besoin de peler cette couche.
Je garde chaîne de soi, mais à partir de lundi, la chaîne est vraiment char *,
l'adresse d'un personnage.
Prenons donc cette roue d'entraînement hors même si nous allons continuer à utiliser GetString pour l'instant.
J'ai donc déclaré l'art, et c'est un morceau de mémoire, 32 bits.
Ce qui est ici en mémoire par défaut? >> [Réponse de l'élève inaudible]
Qu'est-ce que c'est? >> [L'élève] Garbage. Garbage >>. Exactement.
Si vous le programmeur ne pas mettre une valeur dans une variable, qui sait ce que c'est?
Parfois, vous avez de la chance et il est 0, ce qui est une sorte de gentil, propre valeur par défaut,
mais comme nous l'avons vu lundi, il est parfois complètement absurde,
certains très gros chiffre positif ou négatif qui est venu d'où?
Ouais. >> [L'élève] La fonction auparavant. Ouais >>.
>> Souvent, la fonction qui m'a appelé avant car rappelez-vous,
que vous appelez des fonctions de la mémoire, qu'ils occupent un espace de plus en plus de bas en haut,
et dès que la fonction retourne, que la mémoire se réutilisées
par le gars à côté qui est appelée, qui utilise votre même tranche de mémoire.
Et si vous avez des ordures gauche là-bas, les valeurs précédentes,
on pourrait confondre s comme ayant une certaine valeur, alors qu'en réalité nous n'avons pas mis quelque chose là-bas.
Donc, notre mémoire à ce stade ressemble à ceci.
Maintenant, sur le côté droit de la ligne 7 que nous appelons GetString,
que nous avons fait depuis des semaines, mais ce qui est GetString vraiment?
GetString rédigé par le personnel CS50 est un peu intelligente
en ce que, dès que l'utilisateur commence à taper les touches et frappe sur Entrée,
GetString chiffres sur le nombre de frappes ont fait le succès utilisateur,
combien de caractères dois-je allouer de RAM pour.
Et où que la RAM vient, qui sait?
C'est quelque part dans 2 gigaoctets de votre ordinateur ou autres joyeusetés de la mémoire.
Mais supposons que l'ordinateur trouve un espace pour le mot BONJOUR ici.
Le mot que j'ai tapé est H-E-L-L-O.
Et si nous tirons cela comme une séquence de caractères, on pourrait en tirer comme ça.
Mais je dois faire 1 chose supplémentaire. Ce qui appartient à la fin de n'importe quelle chaîne en C?
Le caractère nul, que nous écrivons \ 0.
C'est techniquement le chiffre 0, mais la barre oblique inverse rend d'autant plus claire
ce qui est littéralement le nombre 0, le nombre entier 0;
il ne s'agit pas, par exemple, entre guillemets, 0 que vous pouvez taper au clavier.
Il s'agit donc d'BONJOUR.
>> Et qu'est-ce que nous disons, lundi, que comme une fonction GetString
est en fait le retour de toutes ces semaines?
Ce n'est pas de retourner une chaîne en soi, car qui n'a pas vraiment avoir un sens
parce que les chaînes n'existent pas. Ils sont en quelque sorte d'une fabrication dans la bibliothèque CS50.
Ce qui est vraiment une chaîne, plus techniquement? >> [L'élève] C'est le premier caractère.
Exactement. C'est tout simplement l'adresse du premier caractère que l'utilisateur a tapé po
Donc, si mon mot BONJOUR il finit à 123 numéro de l'octet, puis à l'octet numéro 124,
125, 126, et ainsi de suite, si je viens nombre de 0 octets mes sur place,
ce qui compte vraiment est de retour GetString est littéralement le numéro 123.
Alors, que se mettre dans s est le numéro 123, pas la lettre H, et non pas le mot BONJOUR,
tout simplement l'adresse à laquelle je peux trouver la première lettre du BONJOUR.
Mais cela ne semble pas suffisant. Je vous ai demandé pour une chaîne, pas un personnage.
Alors, comment pouvons-nous ou que l'ordinateur sait que ELLO sorte de venir avec le H?
Quel est le type d'accord que nous avons? Ouais.
[L'élève] Il se tient disant de trouver quelques autres personnages. >> Exactement.
>> Il ya cette convention humain-ordinateur de sorte que lorsque vous traitez avec des cordes,
autrement connu maintenant comme des étoiles de type char, il vous suffit de comprendre
où la fin de chaque chaîne dans la vie est vraiment juste par itération sur elle avec une boucle for,
une boucle while, que ce soit, de sorte que lorsque vous trouvez la fin de la chaîne
maintenant vous pouvez en déduire que, oh, le mot entier était BONJOUR.
Ceux d'entre vous ayant une expérience préalable de la programmation en Java savez peut-être
vous pouvez simplement appeler. longueur et dans d'autres langues, vous pouvez appeler la longueur ou similaire.
C'est parce que dans beaucoup de langues, spécialement choses appelées langages orientés objet,
la longueur de ce genre est d'encapsuler à l'intérieur de la pièce de données elles-mêmes,
Tout comme nous encapsulées ID et les noms et les maisons à l'intérieur d'un étudiant lundi.
Mais C est beaucoup plus faible. Il n'y a pas d'objets ou de classes, si vous avez entendu ces termes auparavant.
Tout ce que vous avez vraiment adresses mémoire.
Il s'agit donc en quelque sorte la manière démodée de représenter des structures de données intéressantes.
Vous avez une valeur de départ, comme l'adresse du premier caractère
et puis juste une convention arbitraire que tout le monde s'accorde à suivre.
Alors, comment est la longueur de chaîne en œuvre, at-on proposer?
Strlen, strlen, que certains d'entre vous ont utilisé à quelques reprises. C'est assez simple, non?
C'est comme si 2 lignes de code.
C'est à peu près une boucle pour en quelque sorte, peut-être avec une variable locale supplémentaire.
Mais strlen vient de prendre un pointeur et puis commencer à chercher \ 0.
>> Et dès qu'il le trouve, il peut renvoyer le nombre total d'étapes qu'il a prises dans cette chaîne.
Nous pouvons donc en déduire ce qui se passe à côté.
Supposons alors je déclare t comme je l'ai fait dans la ligne 10.
Il s'agit d'une valeur ordures. Qui sait d'abord?
Mais sur le côté droit de la ligne de 10 Je vous appelle à nouveau GetString.
Qui sait où cela finit?
Nous allons arbitrairement que le système d'exploitation trouvé de place pour elle en venant ici.
Il se trouve que par hasard taper H-E-L-L-O à nouveau,
et ainsi nous pouvons tirer le même genre de photo.
Mais le fait que j'ai redessiné cette image est délibéré
parce que c'est une. différente BONJOUR que celui-ci
Alors, voici ce qui pourrait être l'emplacement 456, c'est 457, et ainsi de suite.
Alors, que se mettre là où le point d'interrogation était une fois?
Dans ce cas 456.
Nous détectons ces nombres arbitrairement parce que vraiment compter d'aujourd'hui
nous n'allons pas nous préoccuper du bien de ce que l'adresse de quelque chose est.
Tout ce que nous importe est que l'on peut trouver l'adresse d'un élément de données comme BONJOUR.
>> Alors, vraiment ce que la plupart des gens en informatique quand on parle des adresses mémoire
et de parler de pointeurs spécifiquement,
plutôt que de déterminer la peine sur 123 - qui se soucie où ce genre de choses est en fait,
nous savons juste qu'il est à une adresse numérique -
nous simplifions le monde et vous dire que s est pointée à ce personnage
et t est orientée vers ce caractère.
Et le fait que c'est une flèche est tout à fait intentionnelle
parce que littéralement maintenant l'art est dirigée vers H et t est dirigée vers l'autre H
car à la fin de la journée, il n'a pas d'importance ce que l'adresse est,
mais il est important que nous ayons la capacité d'exprimer cette adresse avec un morceau de code.
Nous n'avons pas vraiment manipulé ces adresses pour l'instant
alors nous verrons où nous pouvons intervenir et de régler des choses avec des pointeurs,
mais pour l'instant la ligne 12 littéralement quelles sont les valeurs que nous comparant
selon cette histoire à la ligne 12?
Nous disons est de 123 à 456 égale égale? Et ce n'est certainement pas le cas.
Et même conceptuellement, ce pointeur n'est certainement pas la même chose que ce
parce que vous avez appelé GetString deux fois, et GetString ne cherche pas à être super intelligent,
il ne cherche pas à réaliser, oh, vous avez tapé BONJOUR il ya 5 minutes;
permettez-moi de vous donner le pointeur de même que je vous ai donné plus tôt,
il alloue simplement un nouveau morceau de la mémoire à chaque fois que vous l'appelez.
>> Alors, comment pouvons-nous résoudre ce problème?
Si je veux plus haut niveau pour comparer les chaînes BONJOUR BONJOUR et -
Je ne se soucient pas des pointeurs - comment puis-je faire pour répondre à la question,
l'utilisateur ne tapez la même chose? Ce qui est nécessaire ici? Ouais.
[L'élève] Utiliser une fonction. >> Je peux utiliser une fonction hors de la boîte.
Je peux utiliser une fonction appelée strcmp, s-t-r-c-m-p,
juste la version abrégée de dire comparaison de chaîne.
Et si nous entrons dans, par exemple, comparer les 2, qui est l'un des documents d'aujourd'hui,
Je fais exactement cela.
J'ai gardé tout le reste la même chose de la ligne 1 à 26 ou plus,
et maintenant constater cette partie a changé un peu.
Ignorons ligne 28 pour un moment et se concentrer uniquement sur celui-ci.
Qu'avons-nous dit lundi que str comparaison fait?
Il gère le processus de prise de 2 pointeurs, s et t dans ce cas,
sorte de quasi-mettre le doigt sur ces 2 lettres,
et ce qu'il doit faire quelque chose comme une boucle while ou une boucle for,
et il dit sont-ils les mêmes? Si c'est le cas, il déplace les doigts ou les pointeurs vers l'avant.
S'agit-il de la même chose, ces mêmes l', ceux-ci, de même
ces mêmes l', ces mêmes l'? Et ooh, je suis à la fin de la chaîne à la fois s et t.
Je n'ai pas trouvé de contradictions. Oui, ces chaînes sont identiques.
Et qu'est-ce que str comparer le rendement si 2 chaînes sont identiques, apparemment? Zéro.
Donc 0 est bon dans ce cas parce que si elle renvoie -1 ou +1,
cela signifie que s arrive juste à venir avant ou après alphabétique t t.
Et pourquoi cela serait-il utile d'avoir une fonction qui vous indique quelle corde vient avant
ou après dans un dictionnaire?
[L'élève] Recherche. >> Recherche et tri.
>> Ainsi, vous pouvez faire des choses comme binaire de recherche ou de tri bulle ou le tri par fusion
où il faut comparer des choses.
Jusqu'à présent, nous avons sorte de couper quelques virages et ne parlait que le tri
dans le cadre de chiffres parce que c'est agréable et facile de parler,
mais vous pouvez certainement comparer des chaînes, la pomme et la banane,
parce que si la pomme est connu pour se présenter devant la banane, de même,
pouvez vous déplacer autour de chaînes dans la mémoire comme Rob a fait avec tri par fusion dans la vidéo
et nous avons fait ici sur scène avec tri par sélection, le tri par insertion et tri à bulles.
Alors, où pouvons-nous aller? Essayons ceci.
Disons sorte de leçon oublier que pendant un moment et essayez-le maintenant et copier 1.c faire ce qui suit.
Dans la ligne 21 que je dis quelque chose d'impression,
alors je me fais une chaîne de l'utilisateur,
alors je vérifie cela.
Nous n'avons pas vraiment eu cette habitude encore, mais nous allons maintenant le faire.
Nous allons réellement décoller cette couche. C'est vraiment char *. Ce mec est vraiment char *.
Alors qu'est-ce que cela signifie d'être de vérifier si s == NULL?
Il s'avère que lorsque vous appelez une fonction comme GetString
ou plus généralement il suffit de demander un ordinateur pour vous donner un peu de mémoire,
quelque chose pourrait mal tourner.
Vous pourriez être fou et demander à l'ordinateur d'un téraoctet de mémoire
en demandant des milliards d'octets de mémoire qui vient n'existent pas dans l'ordinateur,
mais les fonctions GetString et d'autres besoin d'un moyen de crier après vous
si vous avez demandé trop.
Et la façon dont cela est GetString si vous avez demandé plus de mémoire
que ce qui est disponible dans l'ordinateur, même si c'est super, super faible probabilité
car aucun d'entre nous vont taper un billion de caractères, puis appuyez sur Entrée,
mais faible probabilité que cela puisse être, je veux toujours vérifier juste au cas,
et la valeur particulière que les rendements GetString, réponse, et d'autres fonctions
si quelque chose s'est mal passé est NULL dans tous les bouchons.
>> Et qu'est-ce que NULL? NULL se trouve juste à représenter un pointeur. C'est l'adresse 0 de la mémoire.
Le monde a décidé de façon arbitraire, si ce n'est la mémoire de mon ordinateur - vous savez quoi? -
nous allons voler à seulement 1 octet de mémoire à chaque ordinateur, et c'est l'emplacement 0.
Nous allons lui donner un surnom NULL, et nous allons promettre
que nous ne pourrons jamais réellement mis données réelles il
parce que nous devons arbitrairement une valeur spéciale, 0, NULL aka,
afin que nous puissions crier après les utilisateurs, si quelque chose va mal.
Sinon, vous pourriez ne sais pas 0 signifie mettre quelque chose ici
ou faut-il dire quelque chose s'est mal passé?
Nous devons tous convenir que cela ne signifie rien NULL est renvoyé,
aucune adresse réelle a été retourné.
Maintenant, ici, je ne fais que mon adoptant la convention de l'homme que je retourne 1 de principal
si quelque chose se passe mal.
C'est parce que la convention retour principal est de retourner 0 si bonne,
1 ou une autre valeur si mauvais.
Mais GetString et toute fonction qui traite des rendements mémoire NULL si quelque chose va mal.
>> D'accord. Donc, malheureusement, ligne 27, super simple soit-il, ne tient absolument pas copier la chaîne.
Pourquoi? Nous pouvons voir cela comme suit.
Je réclame en ligne 27 pour faire une copie de l'article et de l'appeler t.
Donc, je ne demande pas à l'utilisateur pour 2 cordes cette fois-ci, je dis juste que la valeur de l'art
devrait être mis en t ainsi.
Alors maintenant, juste pour montrer comment cela est cassé, dans la ligne 29 en avant ce que je fais?
D'abord je vérifie si la longueur de t est supérieure à 0.
Il ya une chaîne de là. L'utilisateur a tapé quelque chose po
Quelle est la ligne 32 fait, apparemment?
[Réponse de l'élève inaudible] droit >>. Vous pouvez sorte de le déduire de ce que j'ai dit qu'il fait.
Mais techniquement, ce qui est ce que ça fait? t [0] représente quoi?
[L'élève] Le caractère 0e. >> [Malan] Le caractère 0e.
Ou, plus humain, le premier caractère de t, quelle qu'elle soit, peut-être H dans ce cas.
Et toupper fait ce qu'il dit. Il capitalise le caractère zéro de t et il le change.
Donc, cela signifie prendre le caractère zéro de t, faire en majuscules,
et remettez-le à cet endroit même.
Donc, si je tape bonjour en minuscules, ce qui devrait changer le h minuscule pour un grand H.
Mais le problème est que dans les lignes 35 et 36 ce que je m'apprête à faire est d'imprimer pour nous s et t.
Et quel est votre intuition?
Que vais-je réellement aller voir si j'ai tapé dans bonjour en minuscules?
Qu'est-ce qui va se faire imprimer? >> [Réponse de l'élève inaudible] >> Qu'est-ce que c'est?
[L'élève] Big H et le reste de petite taille. Le grand H >> et le reste petite pour laquelle, s ou t?
[L'élève] Les deux. Les deux >>. Exactement. Alors voyons voir ce qui se passe ici.
>> Permettez-moi aller de l'avant et de compiler ce. C'est copy1, alors assurez-copy1. Très bien.
Effectuer un zoom avant Laisse-moi aller de l'avant et de fonctionner copy1, Entrée, Dis quelque chose: bonjour en minuscules.
Il capitalisé la copie, mais il a apparemment capitalisé l'original ainsi,
parce que ce qui se passe aujourd'hui dans cette histoire?
Dans la ligne 27 je n'ai pas vraiment semble être la copie la chaîne,
mais même si vous avez pu intuitivement espérer que ce soit le cas,
si vous pensez à cette image, ce qui est vraiment ce que j'ai fait?
La moitié de l'image est la même.
Donc, nous allons revenir à temps pour que t n'existe pas encore dans l'histoire.
S peut exister dans l'histoire, mais nous allons en minuscules bonjour pour le moment.
Permettez-moi de corriger ce que j'ai réellement tapé po
Dans ce cas là, nous avons h-e-l-l-o.
Nous allons dessiner comme une séquence de caractères, mettre mes lignes de séparation ici et mon \ 0.
C'est donc là que nous sommes dès que la ligne 1 à 24-ish, plus ou moins, ont exécuté.
Telle est l'image de ma mémoire.
Quand j'arrive à la ligne 27, ce qui se passe?
Tout comme avant, je reçois un pointeur, ce que je vais dessiner comme cette place.
C'est ce qu'on appelle t. Et ce qui est sa valeur par défaut? Qui sait? Certains valeur des ordures.
>> Donc, je vais abstraite qui loin comme un point d'interrogation.
Et dès que le côté droit de la ligne 27 exécute, que dois-je mettre à l'intérieur de la t?
La même chose qui se trouve dans l'art.
Donc, si nous pendant un moment retirer cette abstraction de la flèche et nous disons:
oh, c'est l'adresse de chargement de mémoire 123, quand vous dites t devient s, point-virgule,
vous êtes littéralement mettre 123 ici.
Maintenant, si nous sorte de simplifier notre monde nouveau avec des photos,
ce que vous avez vraiment fait est simplement ajouté une autre flèche à votre monde
qui est orienté de t à la même chaîne exacte.
Ainsi, lorsque dans la ligne 31 et 32, je fait aller sur le changement t [0],
ce qui est t [0] apparemment synonyme de maintenant? s [0]
Donc, c'est tout ce qui se passe.
Et même si ce genre de sent un niveau un peu faible et mystérieux
et ce genre d'envie peut-être intuitivement cela aurait juste travaillé -
J'ai fait des copies de choses avant et juste que cela fonctionne -
si vous avez réellement penser à ce qui est vraiment une chaîne, c'est un char *.
Eh bien, qu'est-ce que c'est? C'est l'adresse d'un personnage.
Alors peut-être qu'il est plus logique que lorsque vous essayez de faire quelque chose
Super apparemment simple comme ça, tout ce que vous faites, c'est de copier une adresse mémoire.
Vous n'êtes pas en train de faire quelque chose avec la chaîne elle-même.
Donc, même si vous n'avez aucune idée comment vous pourriez résoudre ce problème dans le code,
haut niveau, conceptuellement, que devons-nous faire pour rendre ta copie conforme de s, apparemment?
Ouais. >> [L'élève] Donnez-lui un nouvel emplacement? >> Exactement.
>> Nous devons donner à t de nouveaux locaux.
Nous devons en quelque sorte créer un monde dans lequel nous obtenons un nouveau morceau de la mémoire,
qui vient par souci de clarté, je vais dessiner juste en dessous de celui-ci, mais il n'a pas besoin d'être là.
Mais il doit être de la même taille, donc je vais dessiner ces lignes verticales dans le même endroit.
C'est très bien si ce n'est tous les déchets initialement. Qui sait ce qu'il y avait?
Mais l'étape 1 va être me donner autant de mémoire que j'ai besoin
pour s'adapter à une copie de bonjour, puis déterminer comment copier le h ici, l'e ici,
L ici et ainsi de suite.
Mais cela devrait déjà se sentir un peu évident, même si certains détails sont encore abstraite.
Pour copier cette chaîne là-dedans, c'est juste une boucle for ou une boucle while
ou quelque chose avec laquelle vous êtes devenu d'autant plus familier.
Donc, nous allons essayer. Laissez-moi aller dans copy2.c.
En copy2.c nous avons presque le même programme, sauf pour la ligne 27.
Il semble un peu complexe, mais si nous le décomposer pièce par pièce,
la partie gauche est la même.
Char * t crée cette chose en mémoire, mais avec un point d'interrogation
car nous n'avons aucune idée de ce qui est là par défaut.
Sur le côté droit, nous sommes en train d'introduire une nouvelle fonction, malloc,
allouer de la mémoire, donne-moi la mémoire,
et il faut apparemment le nombre d'arguments, combien de choses à l'intérieur des parenthèses?
J'ai entendu des murmures de 1 et 2, mais il est à seulement 1.
Il n'ya pas de virgule, ce qui signifie qu'il est juste 1 chose à l'intérieur des parenthèses.
Même s'il ya d'autres parenthèses, permettez-moi de souligner
ce qui est à l'intérieur des parenthèses ultrapériphériques, et c'est cette expression:
(Strlen (s) + 1) * sizeof (char).
Donc, si nous avons effectivement réfléchir à cela, cela veut dire me donner la longueur de l'art.
Pourquoi suis-je, si, en ajoutant 1 sur la longueur? >> [Réponse de l'élève inaudible]
Exactement. Nous avons besoin d'espace pour ce type à la queue, le sixième caractère qui n'a aucune signification en anglais
mais il possède signification spéciale programmatique.
>> Nous avons donc besoin d'un + 1 pour cette raison strlen renvoie l'attente humaine de longueur,
bonjour ou 5, il ne vous donne pas le caractère nul supplémentaire.
J'ai donc ajouter manuellement avec + 1.
Et puis ceci, * taille (char), nous n'avons pas vu cela auparavant.
Ce n'est pas techniquement une fonction.
Il s'agit d'un mot clé spécial qui vous indique juste ce qui est de la taille d'un certain type de données sur un ordinateur
car, en réalité, certains d'entre nous ont des ordinateurs 32 bits.
J'ai un ordinateur assez vieux à la maison, et il utilise seulement 32 bits pour représenter les pointeurs.
Et si j'ai fait la taille d'un type de données, il peut être de 32 bits.
Mais si j'utilise mon nouvel ordinateur de fantaisie, je pourrais obtenir en retour une valeur de 64 bits
quelque chose comme une adresse.
Donc dans ce cas, juste pour être sûr super, nous n'allons pas à quelque chose de dur comme le code -
eh bien, quelle est la taille d'un char d'après ce que nous avons dit jusqu'ici?
Nous avons à peu près dit verbalement que c'est 1 octet, et c'est à peu près vrai dans l'ensemble.
Mais encore une fois, les hypothèses ont tendance à être mauvais.
Ils conduisent à des logiciels défectueux si les gens utilisent votre logiciel de façons que vous n'aviez pas l'intention.
, Donc nous abstraire cet écart et un peu plus générique dire
J'ai besoin de ces morceaux beaucoup de mémoire
et chaque bloc de mémoire doit être équivalente à la taille d'un caractère,
qui est en fait égal à 1 dans ce cas, mais c'est une façon plus générique de l'écrire.
Donc, si le mot est bonjour, combien d'octets ne semble affecter à malloc bonjour?
[L'élève] Six. Six >>. Exactement autant que nous avons des points d'interrogation sur l'écran.
Et puis prendre un guess maintenant basé sur votre compréhension de GetString
qu'est-ce que malloc probablement revenir? >> [L'élève] Une adresse.
Une adresse de quoi? Du premier segment de mémoire.
>> Nous n'avons aucune idée de ce qui est là parce que d'autres fonctions
aurait pu utiliser cette mémoire précédemment.
Mais malloc, comme GetString, renvoie l'adresse du premier octet de la mémoire
qu'il a mis de côté pour vous.
Cependant, ce qu'il ne fait pas faire est de remplir ce vide avec un caractère nul barre oblique inverse
car il s'avère que vous pouvez utiliser malloc pour allouer quoi que ce soit: ints, des chaînes, des tableaux,
flotteurs, des structures étudiants.
Vous pouvez utiliser malloc complètement générique.
Il ne se soucie pas ou faut savoir ce que vous allouez de la mémoire pour.
Il serait donc présomptueux de malloc pour mettre un 0 \
à la fin de chaque bloc de mémoire c'est vous donner
parce que ce \ 0 chose est juste une convention pour les chaînes.
Il n'est pas utilisé pour les entiers, il n'est pas utilisé pour les flotteurs, il n'est pas utilisé pour les étudiants.
Et si la chasse aux sorcières avec malloc est que la charge est entièrement de vous le programmeur
de se rappeler combien d'octets que vous avez alloué et ne jamais utiliser une boucle for
ou une boucle while et aller au-delà des limites de la portion de mémoire que vous avez reçu.
En d'autres termes, dès que vous allouer de la mémoire,
vous ne pouvez pas demander au système d'exploitation, oh, au fait, la taille d'un morceau de mémoire était-ce?
C'est entièrement à vous de vous rappeler si vous avez besoin de cette valeur.
>> Voyons donc comment je procède à utiliser cette mémoire.
Dans la ligne 28 et 29 pourquoi je fais ça?
Tout test de cohérence totale.
Juste au cas où quelque chose s'est mal passé, je demande une certaine quantité folle de mémoire
ou j'ai tant de choses en cours d'exécution sur l'ordinateur qu'il n'y a tout simplement pas assez de mémoire,
quelque chose comme ça, je veux au moins pour vérifier nulle.
En réalité, la plupart des ordinateurs vous donnera l'illusion que chaque programme
pouvez utiliser l'intégralité de la RAM,
mais tout de même, si l'utilisateur tape une chaîne de fou longtemps peut-être parce que c'est un mauvais garçon
et ils sont en train d'essayer de planter votre programme ou pirater l',
vous voulez vérifier au moins la valeur de retour de malloc et si elle est égale à zéro.
Et si c'est le cas, nous allons tout simplement arrêter maintenant parce que je ne sais pas ce qu'il faut faire dans ce cas.
Comment puis-je copier la chaîne? Il ya quelques façons de le faire.
Il ya str copier des fonctions en C, mais c'est super simple pour nous de faire la vieille manière.
>> Je voudrais d'abord comprendre ce que la longueur de s est.
J'aurais pu mettre cela dans la boucle mais je l'ai mis ici pour plus de clarté.
Donc n stocke désormais la longueur de la chaîne d'origine, qui est apparemment 5.
Ensuite, dans ma boucle pour itérer Je suis de 0 sur un maximum de n,
et à chaque itération, je suis en train de s [i] à l'intérieur du t [i].
C'est donc ce que j'ai laissé entendre avec mes 2 doigts pointant vers les cordes avant.
Comme cette boucle for comme ça, je vais être en copiant h ici,
e dans ici, dans l ici parce que c'est d, c'est t.
Et puis enfin, dans la ligne 35 pour laquelle je fais cela?
J'ai besoin de m'assurer que je suis la fin de la chaîne de caractères t.
Et je l'ai fait de cette façon d'être super explicite.
Mais proposer quelqu'un, si vous le pouviez, une façon différente de le faire.
Je n'ai pas vraiment besoin de la ligne 35. Il ya une autre façon de le faire.
Ouais. >> [Réponse de l'élève inaudible] >> Dites-le plus fort.
[L'élève] Inférieur ou égal à. >> Exactement.
Nous pourrions simplement dire inférieur ou égal à n, qui en général a été mauvaise
parce que presque toujours quand on va à une indemnité égale à la chose que nous comptons
nous aller 1 peu trop loin.
Mais rappelez-vous, combien d'octets ne nous attribuons?
Nous avons alloué strlen de s, donc 5 + 1 pour un total de 6.
Donc dans ce cas nous pourrions faire quelque chose comme ceci
afin que nous vous copiez pas seulement le bonjour, mais aussi le 0 \ à la fin.
Sinon, nous pourrions utiliser une fonction appelée str copie, strcpy,
mais ce ne serait pas amusant à peu près autant.
Mais c'est tout ce qu'il fait sous le capot.
Puis enfin, nous faisons la même chose qu'avant.
Je capitaliser t puis-je prétendre que l'original ressemble à ceci et la copie ressemble à ça.
Essayons donc maintenant. Laissez-moi aller ici. Assurez-copy2. Nous allons effectuer un zoom avant et exécutez copy2.
Je vais taper en minuscules bonjour, et en fait je reçois minuscules bonjour comme l'original
mais le capital Bonjour pour la copie.
Mais je ne suis pas fait pour l'instant. J'ai besoin de faire 1 dernière chose ici.
46 et 47 est clairement libérer de la mémoire, mais qu'est-ce que cela signifie réellement?
Que fais-je, pensez-vous, en appelant la ligne 46 et la ligne 47?
Quel effet cela at-il? Ouais.
[Réponse de l'élève inaudible] >> Exactement.
>> Vous êtes tout simplement dire le système d'exploitation, hey, merci pour cette mémoire.
Vous pouvez maintenant l'utiliser pour quelqu'un d'autre.
Et voici un exemple parfait de valeurs parasites.
Je viens d'utiliser cette mémoire pour écrire le mot bonjour en 2 places,
ici, ici, ici et ici.
C'est donc h-e-l-l-o-\ 0.
Mais alors j'appelle la ligne 46 et la ligne 47, et vous savez ce qui se passe là-bas en termes de la photo?
En fait, attendez, ce tableau est l'ancien.
Une fois que nous rendre la copie, ce gars-là est effectivement pointant ici,
nous allons donc supprimer les numéros et juste abstraction que nos flèches à nouveau.
Qu'est-ce qui se passe dans cette image quand je l'appelle gratuitement?
[Réponse de l'élève inaudible] >> Pas même.
Si j'appelle gratuitement sur s et t - genre de question piège - cette image ne change pas du tout
parce que l'appel et l'appel s t indique simplement le système d'exploitation,
hey, vous pouvez utiliser cette mémoire encore, mais il ne change pas ce à null
ou des caractères spéciaux, il ne change pas cela,
il ne modifie pas l'atome d'hydrogène ou le courrier ou la L ou L, ou le o soit en place pour autre chose.
Pour ce qui est de l'image, dès que vous appelez gratuitement, rien ne change.
Et c'est là que réside l'origine des valeurs ordures parce que si je puis, plus tard dans ce programme
demander au système d'exploitation pour plus de mémoire avec malloc ou GetString ou quelque chose comme ça
et le système d'exploitation dit, bien sûr, j'ai 12 octets de mémoire juste libérés,
les utiliser, qu'allez-vous être remis?
Vous allez être remis un morceau de mémoire que nous aurions normalement attirer l'
avec des points d'interrogation, mais quels sont ces points d'interrogation?
Ils se trouvent h-e-l-l-o, h-e-l-l-o.
Ce sont nos valeurs ordures nouvelles dès que vous libérer de la mémoire.
>> Il ya une implication réelle ici aussi.
Cela arrive à faire avec de la RAM, mais vos ordinateurs
effectivement faire la même chose avec le disque.
Nous en reparlerons en particulier avec un ensemble de problèmes futurs qui se concentre sur la médecine légale.
Mais qu'est-ce qui se passe réellement, si vous avez un fichier sensible financière sur votre bureau
ou un sommaire JPEG et que vous glissez-le dans votre poubelle,
ce qui arrive lorsque vous le faites glisser dans la poubelle ou le bac de recyclage?
Tu savais ce que je parlais. [Rires]
Qu'est-ce qui se passe quand vous avez tiré cette preuve dans votre corbeille ou corbeille?
[Réponse de l'élève inaudible]
Eh bien, si prudent. Qu'est-ce qui se passe quand tu fais ça?
La réponse courte est rien, non?
Sketchy fichier ou sensibles est toujours assis là, quelque part sur votre disque dur.
La plupart d'entre nous ont au moins appris à la dure que vous avez besoin de vider votre corbeille
ou votre corbeille pour supprimer réellement les fichiers.
Et en effet, lorsque vous faites un clic droit ou Ctrl clic sur votre poubelle
ou choisissez Fichier, Vider la Corbeille ou tout autre
et vous vider la poubelle ou corbeille, ce qui se passe ensuite à cette image?
Plus rien. Donc, rien ne se passe réellement sur le disque.
>> Et si nous temporairement digression et à écrire - je vais juste utiliser le verso de cette.
Alors maintenant, l'histoire change de RAM, ce qui est l'endroit où les programmes existent
pendant que vous les faire fonctionner, sur le disque, ce qui est l'endroit où elles sont stockées à long terme
même lorsque l'alimentation est coupée, pour l'instant - et nous reviendrons sur ce point dans l'avenir -
nous allons juste faire semblant que cela représente l'intérieur du disque dur de votre ordinateur
parce que dans la journée, ils l'habitude d'être des disques circulaires, un peu comme les disquettes.
Donc, si vous avez un fichier Excel sensible, il pourrait prendre jusqu'à ce morceau de mémoire
sur le disque de votre ordinateur, et je ne fais que tirer la même 1s et 0s arbitraire.
Lorsque vous faites glisser le fichier comme ça à votre poubelle ou corbeille,
littéralement rien ne se passe parce que Apple et Microsoft ont tout simplement décidé
la poubelle et corbeille est vraiment juste un espace réservé temporaire.
Peut-être que finalement le système d'exploitation le vider pour vous, mais en général, il ne fait rien,
au moins jusqu'à ce que vous êtes vraiment en manque d'espace.
>> Cependant, quand vous allez vider la corbeille ou corbeille vide,
De même, rien ne se passe à ce tableau.
Tout ce qui arrive est ailleurs sur votre ordinateur, il ya une sorte de table.
C'est un peu comme une petite feuille de triche qui dit que, disons, resume.doc,
de sorte que votre CV dans un fichier Microsoft Word habitude de vivre à l'emplacement 123 sur votre disque dur,
pas en mémoire et non dans la mémoire RAM, mais sur votre disque dur,
et vos sommaires vie JPEG à 456, et de votre fichier Excel vit à 789 ou ailleurs.
Lorsque vous supprimez des fichiers en fait vider la corbeille ou corbeille,
cette image ne change pas. Le 0 et de 1 sur votre disque dur ne vont nulle part.
Mais ce tableau, cette petite base de données de toutes sortes, change.
Lorsque vous supprimez votre CV, c'est comme si le fichier est supprimé dans un certain sens,
mais tout ce que l'ordinateur ne soit oublié où vit cette chose sur votre disque dur.
Le 0 et de 1 qui composent votre curriculum vitae ou l'autre de ces autres fichiers sont encore intacts.
>> Donc, si vous l'avez fait par hasard, il ya toujours une probabilité non nulle
que vous pouvez récupérer vos données à l'aide de Norton Utilities ou d'un logiciel commercial
dont le but dans la vie est de trouver des 0 et des 1 qui ont été en quelque sorte orphelins,
oubliés ici, mais laissé ici, afin que vous puissiez récupérer vos données.
Ou enquêteurs judiciaires avec la police ou le FBI aurait fait prendre un disque dur
et effectivement rechercher des modèles de 0 et de 1 qui ressemblent à des fichiers JPEG, la forme de fichiers Excel,
et récupérer de cette façon, même si l'ordinateur les a oubliés là.
Donc la seule façon vraiment supprimer les données, comme nous le verrons à l'avenir,
est de frotter ou essuyer le fichier ou le disque dur par -
Vous ne pouvez pas vraiment vous débarrasser des 0 et des 1
parce que sinon, vous commencez avec un disque dur de gigaoctet
et vous vous retrouver avec un disque dur si vous mégaoctet constamment été la suppression,
littéralement, 0 et de 1.
Alors, que feriez-vous si vous avez vraiment voulu effacer vos traces
et le problème fondamental est qu'il ya toujours 0 et de 1 sur le disque?
Je vois quelqu'un gesticulant que vous briser physiquement le périphérique. Ça va marcher.
[Rires] Mais si c'est le genre d'une solution coûteuse, ce qui serait plus raisonnable?
Ouais. >> [L'élève] les écraser. >> Les écraser avec quoi? >> [Étudiant] D'autres données.
D'autres données. Vous pouvez simplement remplacer votre disque avec des 0 ou 1 s ou des 0, des 1.
>> Et c'est effectivement ce que certains des logiciels de fait.
Vous pouvez acheter un logiciel ou même obtenir le logiciel libre,
et même intégré à Mac OS de nos jours, un peu moins dans Windows,
est la capacité à effacer en toute sécurité.
En fait, si vous voulez tout home run aujourd'hui, si vous avez un Mac et ce faire,
si vous avez des trucs dans votre poubelle, vous pouvez faire sécurisé Vider la corbeille,
qui fait exactement cela.
Plutôt que d'effacer des fichiers ici seulement, il n'efface pas le ici 0 et de 1,
au contraire, cela ne modifie que tous, par exemple, de 0 et de dot, dot, dot.
Ainsi, l'un de vos psets futures seront réellement au dessein de récupérer des données -
photos que nous avons prises des gens, les lieux et les choses sur le campus
pour laquelle nous allons faire une image médico-légal de la carte mémoire d'un appareil photo numérique,
qui est la même idée - et vous aurez à relever le défi de trouver réellement
les modèles qui représentent des fichiers JPEG sur votre disque dur,
ressemble beaucoup à celle ancien élève dont le courriel que j'ai lu il ya quelques semaines a fait
pour récupérer des photos de sa sœur.
Pourquoi ne pas prendre une pause de 5 minutes, et nous allons regrouper avec plus de mémoire.
Donc, c'est là que les choses deviennent un peu hallucinant, mais c'est une étape très puissant
pour comprendre ce d'autant plus.
Voici un programme appelé pointers.c.
Il est l'un des exemples de code actuel.
Notez que dans les premières lignes, 19 à 22, tout ce que nous faisons, c'est quelque chose comme GetString
et en retournant une adresse, le stocker à l'art.
Désormais, pour pset voire 3 si vous voulez, mais pset 4 et sur
où vous pouvez commencer à prendre ces roues d'entraînement au large de vous-même,
il n'ya aucune raison de prétendre que les chaînes n'existent plus.
Il est certainement correct de simplement commencer à dire char *.
>> Soit dit en passant, dans les références en ligne et dans les livres que vous pouvez souvent voir l'étoile à côté de la variable.
Vous pourriez même voir des espaces autour des deux côtés de celui-ci.
Tous ceux qui sont fonctionnellement correcte.
Pour le moment, cependant, nous allons standardiser sur cette approche pour faire super clair
que char *, c'est comme dire pointeur de caractère.
C'est le type de données.
Et puis le nom de la variable est dans cette affaire.
Donc, nous avons obtenu une chaîne et nous avons appelé cela s.
Et puis ici remarquerez que je fais en fait un peu de ruse.
C'est ce qu'on appelle l'arithmétique des pointeurs, qui est une sorte de super simple.
Cela signifie simplement ajouter et soustraire des nombres à des pointeurs.
Mais cela fonctionne réellement.
Ce programme imprime apparemment 1 la chaîne de caractère de chaque ligne de sorte que le résultat final -
Juste pour que nous puissions gâcher où cela se passe, assurez-pointeurs, pointeurs de fonctionner, laissez-moi un zoom avant
Maintenant, permettez-moi de saisir quelque chose comme BONJOUR et tapez Entrée
et elle imprime 1 caractère par ligne.
Jusqu'à il ya une seconde, nous l'avons fait avec la notation crochet.
Nous aurions une boucle for et que nous ferions printf s [i] et nous aimerions le faire encore et encore et encore
avec un n antislash à la fin de chaque ligne.
Mais ce programme est différent. Ce programme utilise, littéralement, de l'arithmétique.
Alors qu'est-ce qui se passe ici?
Tout d'abord, avant cette boucle s'exécute même, quoi, juste pour être clair, c'est en fait d?
S est? >> [L'élève] Une adresse. >> Une adresse.
>> Et c'est l'adresse de, dans le cas de bonjour, le premier caractère de ce mot, qui est h.
Donc s est, dans cet exemple particulier, l'adresse de h.
Alors qu'est-ce que cela signifie pour le faire s + i?
Eh bien, je commence à 0 dans cette boucle for. Nous avons fait de nombreuses fois que.
Je va aller jusqu'à la longueur de la chaîne, apparemment.
Ainsi, à la première itération de cette boucle, i est évidemment 0.
Donc, cette expression veut dire s + i - plutôt, s +0--ce que c'est évidemment tout s.
Alors, quelle est * s ici?
Maintenant, nous utilisons la star d'une manière légèrement différente.
Permettez-moi aller de l'avant et de se débarrasser de t parce que nous en avons fini parle t et les copies de l'art.
Maintenant, nous voulons juste raconter une histoire mettant en scène l'art.
Et si en ce moment, après avoir type string, notre monde semble tout à fait comme avant
avec seulement s mémoriser l'adresse de h et de façon plus générale montrant la chaîne bonjour.
Si je fais maintenant une ligne comme * (s + i), nous allons essayer cela.
So * (s + i). Permettez-moi de simplifier ce parce que c'est 0, c'est donc * (s +0).
Eh bien, attendez une minute. Simplifier davantage. Il s'agit d'* (s).
Eh bien, maintenant, les parenthèses sont un peu stupide, alors maintenant nous allons juste faire * s.
Ainsi, dans la première itération de cette boucle, cette ligne qui est mis en évidence, 26,
est à peu près équivalent à l'impression de ce.
Quel est le type de données * s?
Dans ce contexte, parce que l'étoile se trouve être à côté de la s lui-même,
mais plus précisément, parce que nous ne sommes plus déclarant que l'art,
nous ne créons pas une variable plus, il n'y a aucune mention de char * en ligne 26,
il n'y a aucune mention de la chaîne de mot-clé, nous utilisons juste une variable appelée s,
il s'avère maintenant l'étoile a légèrement différente et, certes, confondant sens.
* S ici signifie aller à l'adresse de l'art et d'imprimer tout ce qui est là-bas.
Donc s est ici, s * est - un peu comme Chutes and Ladders, suivez la flèche - ici.
Il s'agit donc d'* s.
>> Alors, quelle est imprimé sur la première itération de cette boucle dans la ligne 26?
J'imprime% c, qui est l'espace réservé pour un caractère,
puis un \ n pour une nouvelle ligne. * (S + i) où i est 0 est exactement cela.
Alors, que dois-je placer caractères dans des c%? H.
Dans la prochaine itération de la boucle - vous pouvez probablement voir où cela va -
la prochaine itération i est évidemment 1, alors cela signifie s +1,
et puis maintenant je n'ai pas besoin des parenthèses parce que maintenant l'étoile doit dire
aller à l'adresse mémoire s +1.
Quel est l? Faisons reculer dans le temps et dire cette flèche est maintenant en train de faire pas-nous pas de faveurs.
Soit c'est plus précisément dire que ce n'est stockage du numéro 123
parce que le début de cette chaîne bonjour, ceci est l'adresse 123, c'est 124, et ainsi de suite.
Ainsi, sur la seconde itération quand je dis que s +1, c'est comme dire 123 +1,
autrement connu comme 124, donc ce caractère est imprimé sur la deuxième itération?
E à 124 adresses mémoire.
Puis à nouveau +, 125, 126, 127, et cette boucle s'arrête heureusement, avant d'arriver ici
parce que je suis en utilisant strlen pour s'assurer que je ne compte pas trop élevé.
Donc, c'est elle aussi.
Encore une fois, c'est comme si nous l'avions fait il ya une semaine.
Permettez-moi de l'écrire sur la ligne ci-dessous, même si nous ne voulons pas faire les deux.
Ceci est identique aujourd'hui à ce sujet.
>> Ainsi, même si s est une chaîne, comme nous l'avons été de l'appeler pendant des semaines, s est vraiment un char *.
Donc, si nous voulons être anale super, c'est vraiment bon d'écrire le caractère spécifique
à l'emplacement vec l'aide de ces adresses numériques et cet opérateur étoile,
mais franchement, c'est juste tellement plus propre. Donc, ce n'est pas mauvais.
Pas de raison de cesser de faire ici la ligne 27, mais 26 est fonctionnellement le même,
et il est fonctionnellement le même exactement pour les raisons que nous avons discuté jusqu'à présent.
Et enfin, 29 est pratique juste bon.
Appel sans s signifie que vous êtes maintenant redonner la mémoire que vous avez donné GetString
car encore une fois, comme je l'ai mentionné lundi GetString pendant des semaines
a été l'introduction d'un bug dans votre code.
Votre code pendant des semaines a eu des fuites de mémoire
par lequel vous avez été demander GetString pour la mémoire, mais vous n'avez jamais été le rendre.
Et qui a été délibérément choisie par nous pédagogique
parce que c'est tout simplement trop de choses à penser dès le début.
Mais maintenant, nous avons besoin de plus de symétrie.
Si vous demandez à l'ordinateur pour la mémoire, comme c'est le cas pour GetString,
comme c'est le cas apparemment pour malloc,
vous devez maintenant pset 4 et suivants aussi libérer la mémoire tels.
Remarquez que ce n'est pas à dire n int.
Vous n'avez pas besoin de libérer ce parce que vous n'avez pas appelé GetString
et vous n'avez pas appeler malloc.
>> Et même si vous avez appelé getInt que nous finirons par voir,
GetInt ne pas allouer de la mémoire pour vous parce que vous pouvez réellement faire circuler entiers
et les flotteurs et les caractères juste la façon dont nous avons fait pendant des semaines.
Cordes, cependant, sont spéciaux parce que vraiment ils sont la concaténation des caractères multiples.
Donc, ils sont juste différents de caractères et des flotteurs et ints, etc.
Mais nous y reviendrons qu'avant longtemps.
Toutes les questions, alors sur ce début de pointeurs? Ouais.
[Question étudiant inaudible]
Ah, très bonne question.
Une des rares choses que C ne fait pour vous, ce qui est pratique,
est elle figure pour vous ce qui est de la taille du type de données
puis fait ce genre de multiplication pour vous.
Ce n'est pas pertinent dans le cas des chars, car presque toujours un char est de 1 octet,
si cela marche.
Mais pour les besoins de la discussion, si vous étiez réellement l'impression entiers
et que vous essayez d'imprimer sur une valeur qui s était pointé à un nombre entier,
vous serait même pas besoin de faire + 4 * i juste parce que un int est de 4 octets.
L'arithmétique des pointeurs signifie que le compilateur C et faire tout ce qui calculs pour vous.
Tout ce que vous devez prendre en compte est le comptage dans une sorte de sens humain. Ouais.
[L'élève] Si vous déclarez une chaîne à l'intérieur d'une boucle for, avez-vous pour le libérer plus tard?
Bonne question.
>> Si vous avez déclaré une chaîne à l'intérieur de la boucle for, avez-vous besoin pour le libérer plus tard?
Vous avez seulement besoin de libérer la mémoire que vous allouez à GetString ou avec malloc.
Donc, si vous venez de dire quelque chose comme - permettez-moi de mettre des accolades maintenant si tout le code est lié.
Si vous avez fait quelque chose, mais buggily, comme ça, char * t = s,
vous n'avez pas besoin de t libres parce que t ne comportait aucune mention de malloc ou GetString.
Si par contre vous avez fait ceci, GetString, alors oui, vous aurez besoin de t libres.
Et en fait, votre seule chance de le faire est maintenant à l'intérieur de cette boucle, pour la même question du champ d'application
que nous avons discuté dans le passé.
Sinon, vous seriez l'allocation de mémoire, l'allocation de mémoire, l'allocation de mémoire,
et à la fin du programme parce que vous êtes à l'extérieur de la boucle,
t n'existe pas, mais vous n'avez jamais dit que le système d'exploitation
que vous n'avez pas besoin de cette mémoire plus.
Et avant longtemps, car pset 4 ou 5 nous vous doter d'un programme appelé Valgrind,
qui est dans le même esprit de GDB en ce qu'elle a de peu d'une interface obscure,
mais son but dans la vie est de vous aider.
Et Valgrind est un programme qui sera à l'avenir une recherche dans vos programmes
à la recherche de fuites de mémoire, qu'il s'agisse de GetString ou malloc,
que nous allons commencer à utiliser d'autant plus que nous cessons d'utiliser la bibliothèque CS50 autant.
Nous avons maintenant enfin en quelque sorte le vocabulaire et le type de modèle mental en théorie
permettant de résoudre ce programme cassé.
>> Donc, dans ce programme cassé, swap fonctionne à l'intérieur de swap,
mais il n'a jamais vraiment travaillé en principal parce principale adoptée en x et y, rappel,
et ceux qui ont passé par les valeurs, pour ainsi dire.
Des copies de leur furent données à échanger.
À la fin de swap, a et b ont effectivement été échangés,
mais bien sûr, x et y, comme nous en avons discuté, lundi, n'avait pas été.
Je propose donc ici en vert que ce soit réellement la solution ici.
Et en fait, je vais passer mes étoiles que ce soit cohérent
même si, encore une fois, fonctionnellement ce n'est pas grave.
Dans les semaines à venir, nous allons vous expliquer quand et pourquoi c'est important.
Alors maintenant en vert est une solution.
Franchement, on dirait un tas désordonné parce que j'ai toutes ces étoiles.
Permettez-moi de souligner une chose.
La ligne supérieure là où il est dit int * a * b et int
est fondamentalement fait la même chose comme il l'a toujours.
Il est déclaré 2 arguments ou paramètres d'échanger,
dont le premier est un pointeur int appelé,
dont le second est un pointeur int appelé b.
La seule chose qui est nouveau à ce stade, c'est le fait qu'il y est une star là-bas.
>> Qu'est-ce que ça veut dire? A n'est pas un int, b n'est pas un entier.
A est l'adresse d'un int et b est l'adresse d'un int différent.
Ici-bas, c'est là que je l'avoue C devient confus.
Maintenant, nous utilisons une étoile, mais il a un sens différent dans ce contexte.
Parce que nous ne sommes pas déclarer des pointeurs que nous sommes ici,
nous sommes ici déréférencement choses.
Donc, techniquement, la star dans ce contexte, de la première ligne, deuxième, et troisième à l'intérieur de swap
est l'opérateur de déréférencement, ce qui signifie tout simplement aller là-bas.
Ainsi, tout comme mon doigt puis sur la flèche vers h,
* Un moyen aller à cette adresse et me trouver l'int qui est là.
* Moyen b allez à l'adresse et me faire passer ce qui est là.
Donc, nous allons redessiner l'image du lundi utilise maintenant un empilage de cadres,
l'une de fond qui va être principale,
l'une supérieure, qui sera d'échange,
afin que notre monde ressemble, tout comme lundi, comme ça.
Voici un morceau de mémoire principale va utiliser.
>> Rappelons, du lundi que le programme vient d'avoir 2 variables,
celui qui est appelé x et un y appelle, et j'avais mis les numéros 1 et 2 là.
Maintenant, quand je l'appelle comme je le faisais échanger le lundi,
précédemment lorsque j'ai utilisé la version rouge de ce programme, qui ressemble à ceci,
J'ai 2 paramètres, a et b, et qu'est-ce que nous écrivons ici et ici?
Juste 1 et 2, littéralement copie de x et y.
Aujourd'hui, nous changer cela.
Aujourd'hui, au lieu de passer en entiers a et b, nous allons passer à 2 adresses.
Ces adresses se produire pour pointer vers entiers, mais ces adresses ne sont pas eux-mêmes des ints.
Ils sont des adresses. C'est comme une adresse postale à la place.
Alors maintenant, nous devons juste me donner un peu plus détaillée sur l'écran.
C'est la mémoire de mon ordinateur comme ça a été toute la journée.
Maintenant, nous avons besoin de régime arbitraire de numérotation.
Alors disons simplement que, par hasard, que c'est l'adresse mémoire 123, 124.
Disons simplement que c'est 125, c'est 126, et ainsi de suite, mais c'est totalement arbitraire.
Nous avons juste besoin d'un peu schéma de numérotation dans ma mémoire.
Alors maintenant, quand j'ai effectivement passer en x et y, je ne vais pas passer en x et y;
Je vais passer l'adresse postale, pour ainsi dire, de x et de y
de sorte que ce qui est stocké ici et ici n'est pas 1 et 2,
mais si vous pouvez voir mon petit texte, ce qui est transmis ici et là?
[Réponse de l'élève inaudible] >> Exactement. 123 se mettre ici et 124 se mettre ici.
>> Maintenant, parce que j'ai utilisé l'étoile de cette manière toute première ligne ici au sommet,
mon programme sait juste que 123 et 124, même si elles sont évidemment entiers
que tout être humain a pu remarquer, elles doivent être interprétées comme des adresses, des adresses numériques.
Ils ne sont pas en elles-mêmes des ints, ils sont adresses,
et c'est parce que j'ai mis explicitement les étoiles là-bas.
Alors maintenant, dans ma première ligne, deuxième et troisième code réel ce qui se passe ici?
Tirons le reste de l'image.
Tmp est juste comme il était le lundi. Rien de spécial à propos de tmp.
Il est à seulement de 32 bits de la variable locale, et à l'intérieur de ce que je suis apparemment stocker la valeur de * a.
Maintenant, si je viens de dire tmp = a, qu'aurais-je mettre ici? >> [L'élève] 123.
123. Mais ce n'est pas ce que je fais.
Je dis tmp = * a. Moyens étoile y aller.
Voici donc un, 123. Comment puis-je y aller? Faire comme il ya une flèche.
Eh bien, ça y est, 1. Donc, ce qui est stocké dans tmp, apparemment? Juste 1.
Donc, en d'autres termes, tmp est * A, * un moyen aller à l'adresse qui se trouve actuellement dans une,
qui est apparemment 123.
>> Ok, nous sommes ici à l'emplacement 123, je vois le nombre 1,
donc je vais mettre le numéro 1 là-bas.
Maintenant, qu'est-ce que je fais dans la ligne 2, * a = b *?
Celui-ci est un peu plus compliquée parce que maintenant ce qui est un? Il est 123.
So * a est où? Là où j'étais avant. Alors, allez-y. D'accord.
Maintenant, enfin, et puis finalement cela va commencer à faire sens, nous l'espérons,
* B signifie ce qui est en b? 124. Donc j'ai besoin d'aller là-bas, qui est de 2.
Que dois-je mettre où?
2 passe ici parce que dans * b * va dans un. Donc, je vais le faire.
Et vous pouvez déjà voir, peut-être, que nous sommes beaucoup plus proche
pour résoudre ce stupide, simple problème correctement pour la première fois
parce que maintenant nous avons encore un souvenir de ce qui était x,
nous avons 2 exemplaires, il est vrai, de y,
mais la ligne 3 indique maintenant * b.
Alors, voici b. * B moyens d'y aller. Alors, où est l'emplacement 124?
C'est apparemment ici. Alors, que dois-je mettre ici? De toute évidence, tmp.
Alors maintenant, je fais ça. J'ai donc 1 ici et 2 ici.
Et maintenant, qu'en est-il de tout cela, le 123, le 124 et le 1?
Dès le retour de swap, cette mémoire est aussi bonne que perdu
parce que dès le retour de swap, le système d'exploitation
est libre d'utiliser cette mémoire à nouveau à l'avenir.
Que la mémoire principale à la partie inférieure de cette pile dite colle autour.
>> Et donc nous avons enfin maintenant une version de travail.
Laissez-moi aller dans swap.c, et remarquez ce qui suit.
Au début du programme, j'ai changé mon prototype être int * a * b et int.
Donc, la seule chose que j'ai changé pour passer de rouge, ce qui était mauvais, au vert, ce qui est bon,
est j'ai ajouté ces étoiles d'aujourd'hui.
Mais ici, en soi, échanger j'ai dû copier, coller ce qui était juste sur la diapositive.
J'ai ici une étoile, étoile ici - qui correspond au prototype -
et puis toutes ces choses maintenant, sauf pour les étoiles tmp
parce que l'utilisation d'une variable temporaire, il n'y a rien de nouveau là-bas.
J'ai juste besoin de stockage temporaire pour un int.
Donc, nous n'avons pas besoin d'une étoile là-bas.
Nous avons juste besoin de l'étoile afin que nous puissions traverser cette sorte de limite arbitraire
entre ces 2 images dans la mémoire de mon ordinateur.
Mais une dernière chose doit changer, et vous pourriez l'avoir entrevu déjà.
Quelle autre ligne est évidemment différent maintenant? >> [L'élève] et x.
>> Ouais, donc 25 est la dernière ligne de code que j'ai besoin de changer pour que cela fonctionne.
Il ya une semaine et même le lundi de la ligne 25 ressemblait à ceci, échanger x et y,
et cela a été juste de rompre parce que si vous dites swap (x, y)
vous donnez des copies de x et y pour permuter, puis il a fait sa chose,
mais vous n'êtes jamais réellement changer x et y lui-même.
Donc, même si vous n'avez jamais vu ce personnage avant avec l'esperluette dans le code,
il suffit de prendre une supposition. Qu'est-ce que l'esperluette faire, apparemment?
[L'élève] Prend l'adresse. Prend >> l'adresse.
Ainsi, l'esperluette est dit de me donner l'adresse de x.
Qui sait où il est? Il se trouve que 123. Je ne m'inquiète pas. Juste me donner l'adresse de x.
Et y signifie me donner l'adresse de y.
Et à ce point de l'histoire est parfaitement cohérente avec l'image que nous a il ya un instant.
>> Donc, je vais vous avouer pointeurs, certainement pour moi quand j'ai commencé à apprendre ce,
étaient certainement l'une des choses les plus difficiles pour envelopper mon esprit autour.
Mais se rendre compte, d'autant plus que nous avons continuer à jouer avec ce genre de choses,
si vous le décomposer à ces sortes de super simple intellectuellement inintéressantes problèmes
de transférer des numéros autour, la réponse à beaucoup de confusion avec des pointeurs
peut vraiment être tirées de ces mécanismes très simples.
Voici une adresse. Allez-y avec la star.
Ou à l'inverse, voici une esperluette. Pensez à ce que l'adresse est en réalité.
Très bien.
Alors, où est l'ensemble de ce mémoire vient-il?
Nous avons tiré cette image d'un couple de fois, et je garde prometteuse nous allons y revenir,
mais ici, c'est la représentation de la mémoire de votre ordinateur
qui est un peu plus marqué que notre tableau est ici.
Le segment de texte en haut représente ce qui concerne votre programme?
[Réponse de l'élève inaudible] >> Désolé? Dis-le encore.
[L'élève] Le programme proprement dit. >> Le programme proprement dit.
>> Ainsi, le Clang 0 et de 1 que vous avez compilé après l'écriture de code C, puis en exécutant
et générant des bouts 0s et 1s se caché là dans la mémoire
parce que quand vous double-cliquez sur une icône sur votre Mac ou votre PC
ou exécutez une commande comme mario à l'invite, votre 0s et 1s à partir du disque
être chargés dans la mémoire afin que l'ordinateur puisse les manipuler
et de les exécuter plus rapidement.
Ainsi, les données initialisées et non initialisées de données, nous ne pourrons pas parler beaucoup de celles-ci,
mais ce ne sont que des variables globales.
Initialisé les variables globales signifie que vous avez données à valeurs;
initialisé les variables globales qui signifie que vous n'avez pas encore donnent des valeurs de.
Et puis il ya ces variables d'environnement que je vais onde complètement ma main à,
mais ils sont là et que les choses magasins comme votre nom d'utilisateur
et autres sortes de détails de niveau inférieur.
Mais les plus juteux morceaux de la présentation de votre mémoire est cette chose appelée la pile et le tas.
La pile à nouveau, pour être clair, c'est la mémoire qui est utilisée chaque fois que les fonctions sont appelées,
quand il ya des variables locales
et quand il ya des paramètres étant passé autour.
Tout cela se passe dans la pile.
Le tas que nous n'avons pas encore parlé, mais essayer de deviner qui utilise le tas.
Juste un morceau de mémoire différente.
Il arrive à faire ici au sommet, mais c'est une convention arbitraire picturale.
Qui a apparemment eu recours à la mémoire du tas pendant des semaines?
C'est techniquement vous, mais indirectement. >> [L'élève] GetString.
GetString et malloc. Alors, voici la différence fondamentale.
>> Vous savez pour les dernières semaines que si vous avez besoin de mémoire, juste déclarer une variable.
Si vous avez besoin de beaucoup de mémoire, déclarer un tableau à l'intérieur même de votre fonction.
Mais le problème que nous avons gardé en face, c'est que si vous déclarez des variables locales à l'intérieur des fonctions,
dès que la fonction retourne, ce qui arrive à la mémoire et ces variables?
Juste une sorte de que ce n'est plus le vôtre, non? Il disparaît juste une sorte de vue conceptuel.
Il est encore physiquement là, évidemment, mais ce n'est plus votre droit d'utiliser.
C'est évidemment un problème si vous voulez écrire des fonctions dans la vie
qui fait allouer de la mémoire et ne lui donnez pas immédiatement.
Affaire au point: le but GetString dans la vie est d'avoir aucune idée à l'avance
la taille d'une chaîne, je vais taper sur le clavier,
mais ça doit être en mesure d'allouer de la mémoire pour contenir David ou bonjour
ou un essai entier que l'utilisateur pourrait avoir tapé po
Donc GetString a été en utilisant malloc.
Malloc doit donc être en utilisant non pas la pile;
au lieu qu'il utilise ce qu'on appelle le tas.
Il n'y a rien de différent de la mémoire. Ce n'est pas plus rapide ou plus lent ou quelque chose comme ça.
C'est juste physiquement dans un endroit différent.
>> Mais la règle est que la mémoire qui est allouée sur le tas
ne seront jamais enlevés de chez vous jusqu'à ce que vous appelez - faire une supposition - libre.
En revanche, toute la mémoire que vous demandez sur la pile d'un peu déclaration d'un tableau
ou déclarer une variable comme nous l'avons fait pendant des semaines,
que par défaut se retrouve sur la pile.
Et cela fonctionne très bien 90% du temps, mais en ces occasions rares
où vous voulez allouer de la mémoire et de le garder autour,
alors vous devez utiliser une fonction comme malloc.
Ou nous avons utilisé une fonction comme GetString, qui à son tour utilise malloc.
Nous allons voir où cela pourrait briser et ensuite prendre un coup d'oeil à Binky.
Nous y reviendrons que dans le futur.
Voici un programme super simple que dans les 2 premières lignes fait quoi?
En anglais, qu'est-ce que ces 2 premières lignes de code à l'intérieur du principal?
[Réponse de l'élève inaudible]
Attention. Il ne me donne pas l'adresse de x ou y.
[L'élève] Donne des pointeurs vers des entiers. Bon >>. Donnez-moi 2 pointeurs en nombres entiers.
En d'autres termes, donnez-moi 2 morceaux de mémoire que je garde de dessin aujourd'hui,
même si je l'ai effacé aujourd'hui, sous forme de carrés.
Donnez-moi 2 morceaux de mémoire, on appelle x, on appelle y -
plus tôt je les ai appelés s et t - et quel est le type de ce morceau de mémoire?
Il va stocker une adresse.
Il est de type int *.
>> Donc, l'adresse d'un int finira par vivre en x,
l'adresse d'un int finira par vivre en y,
mais d'abord, ce qui est à l'intérieur de x et y? Qui sait? Des valeurs parasites.
Il n'a rien à voir avec des pointeurs.
Si nous n'avons pas mis quelque chose, qui sait ce qui est réellement là-bas?
Maintenant, x. Qu'est-ce qui se passe ici? Ceci est légitime maintenant parce que x est un pointeur. C'est un int *.
Cela signifie donc que je peux mettre dans x l'adresse d'un bloc de mémoire.
Qu'est-ce que malloc retourne? Parfait, il renvoie les adresses,
l'adresse du premier octet dans un bloc de mémoire entier.
Combien d'octets est apparemment cette allocation, par exemple, dans l'appareil?
Quelle est la taille d'un int? 4.
Si vous repensez à la semaine 1, ce n'est pas super important de toujours se rappeler que,
mais dans ce cas, il est utile de savoir, 4 octets.
Donc, ce n'est allocation sur les 4 tas octets
et il renvoie l'adresse de la première à me arbitrairement.
Maintenant, ce que l'on fait x?
Un * x = 42 fait quoi?
Si à ce moment de l'histoire que nous avons x, qui ressemble à ceci avec une certaine valeur ordures,
c'est maintenant avec une certaine valeur y ordures, maintenant dans la ligne 3, j'ai attribué 4 octets.
Cette image ressemble essentiellement à cela.
Ou plus précisément, si cela est arbitraire adresse 123, c'est ce que notre histoire ressemble maintenant.
* X = 42: et maintenant? Cela signifie aller à l'adresse 123 et mettre le numéro 42 là-bas.
Je n'ai pas besoin de porter ces lignes parce que nous ne faisons pas de chaînes.
>> Je viens de l'écrire comme ça, et pour le simple plaisir de démonstration,
42 comme type int occupe beaucoup d'espace, 4 octets.
Donc, c'est ce qui s'est passé là-bas, mais il ya un problème maintenant.
* Y = 13. Qu'est-ce qui va se passer ici?
Le problème est y * dans notre monde simplifié signifie simplement aller à l'adresse en y.
Ce qui est dans y? C'est une valeur ordures.
Donc, supposons que cette valeur est 5551212 ordures, quelque chose de fou comme ça.
* Moyens y aller pour répondre 5551212.
C'est comme ici. Il n'existe pas, par exemple.
Donc * y obtient 13 signifie que je suis en train de retirer 13 ici. Il n'existe pas.
J'ai dépassé le segment du tableau. Que dois-je faire?
Cette faute de segmentation message énigmatique parce que je suis en train de mettre en mémoire
une valeur telle que 13 à un endroit qui n'existe pas.
Le reste du programme pourrait fonctionner bien, mais jusque-là elle n'existe pas.
Donc, nous allons essayer de raconter cette histoire.
Nous y reviendrons une fois que nous avons parlé hex.
Revenons à cela et conclure avec cette chose appelée Binky,
qui rappel est un professeur de Stanford assis à la maison à jouer avec pâte à modeler,
pour raconter l'histoire d'exactement le même programme.
C'est juste environ 3 minutes. Ici, nous avons Binky.
[Locuteur masculin en vidéo] Hey Binky, réveillez-vous. Il est temps pour le plaisir pointeur.
[Binky] Qu'est-ce que c'est? Renseignez-vous sur les pointeurs? Oh, ma bonne femme!
[Locuteur masculin] Eh bien, pour commencer, je pense que nous allons avoir besoin de quelques pointeurs couple.
>> [Binky] D'accord. Ce code attribue 2 pointeurs qui peuvent pointer sur des nombres entiers.
[Locuteur masculin] D'accord. Eh bien, je vois les 2 pointeurs, mais ils ne semblent pas être dirigée vers n'importe quoi.
[Binky] C'est exact. Initialement, les pointeurs ne pointent pas vers quoi que ce soit.
Les choses vers lesquels ils pointent sont appelés pointees, et leur mise en place est une étape distincte.
[Locuteur masculin] Oh, oui, oui. Je le savais. Les pointees sont séparés.
Euh, alors comment voulez-vous allouer une pointee?
[Binky] D'accord. Ce code attribue une nouvelle pointee entier, et cette partie fixe x pour pointer vers elle.
[Locuteur masculin] Hé, regarde mieux.
Donc, en faire quelque chose. >> [Binky] D'accord.
Je vais déréférencer le pointeur x pour enregistrer le numéro 42 dans son pointee.
Pour cette astuce je vais avoir besoin de mon coup de baguette magique de déréférencement.
[Locuteur masculin] Votre baguette magique de déréférencement? C'est très bien.
[Binky] C'est ce que le code ressemble. Je vais mettre en place le nombre et la ... [Claquement]
[Locuteur masculin] Hé, regardez, là, il va.
Donc, faire un déréférencement x suit la flèche pour accéder à son pointee,
dans ce cas, pour stocker 42 à l'intérieur.
Hé, essayez de l'utiliser pour stocker le numéro 13 à l'autre pointeur, y.
[Binky] D'accord. Je vais aller là-bas pour y et obtenir le numéro 13 mis en place
et ensuite prendre la baguette de déréférencement et juste ... [Bourdonnement] Whoa!
[Locuteur masculin] Oh hey, ça n'a pas marché.
>> Dites, Binky, je ne pense pas que le déréférencement y est une bonne idée
parce que la mise en place de la pointee est une étape distincte
et je ne pense pas que nous ayons jamais fait.
[Binky] Hmm, bon point.
[Locuteur masculin] Ouais. Nous avons réparti la y pointeur, mais nous n'avons jamais défini pour pointer vers un pointee.
[Binky] Hmm, très attentif.
[Locuteur masculin] Hey, tu as l'air là-bas, Binky.
Pouvez-vous résoudre ce problème afin que les points y à la pointee même que x? >> [Binky] Bien sûr.
Je vais utiliser ma baguette magique d'affectation du pointeur.
[Locuteur masculin] Est-ce que cela va être un problème comme avant?
[Binky] Non, cela ne touche pas les pointees.
Il change juste un pointeur pour pointer vers la même chose que l'autre. [Claquement]
[Locuteur masculin] Oh, je vois. Maintenant points y à la même place que x.
Donc attendre. Maintenant y est fixé. Il a une pointee.
Ainsi, vous pouvez essayer la baguette de déréférencer à nouveau d'envoyer le plus de 13.
[Binky] Euh, d'accord. Va ici. [Claquement]
[Locuteur masculin] Hé, regardez ça. Maintenant déréférencement travaux sur y.
Et parce que les pointeurs sont le partage que l'on pointee, ils ont tous deux voir le 13.
[Binky] Ouais, le partage. Peu importe.
>> Donc, allons-nous changer de place maintenant?
[Locuteur masculin] Oh, regardez, nous n'avons plus de temps. >> [Binky] Mais -
[Locuteur masculin] Rappelez-vous les 3 règles du pointeur.
Numéro 1, la structure de base est que vous avez un pointeur et pointe vers un pointee.
Mais le pointeur et pointee sont séparés, et l'erreur commune est de mettre en place un pointeur
mais oublier de lui donner un pointee.
Numéro 2, déréférencement curseur se met au niveau du pointeur et suit sa flèche au-dessus
pour accéder à son pointee.
Comme nous le savons tous, cela ne fonctionne que s'il ya un pointee,
quel type de revient à la règle numéro 1.
Numéro 3, l'affectation du pointeur prend un pointeur et change
pour pointer vers le pointee identique à un autre pointeur.
Donc, après la cession, les 2 pointeurs pointera vers le même pointee.
Parfois, c'est ce qu'on appelle le partage.
>> Et c'est tout ce qu'il ya à faire vraiment. Bye-bye maintenant.
C'est Binky. C'est CS50. Nous vous verrons la semaine prochaine. [Applaudissements]
>> [CS50.TV]