>> DAVID MALAN: Bonjour, et bienvenue à CS50.
Donc, c'est la fin de la quatrième semaine.
Juste une annonce en premier.
Ainsi, le soi-disant cinquième lundi est à venir lundi prochain.
C'est l'occasion de changer d' SAT / UNSAT à un grade de lettre ou de
note par lettre SAT / UNSAT.
Fâcheusement, ce processus exige un signature, parce que vous avez à remplir
sur un de ces insertion / extraction formes roses.
>> Parce que techniquement, le SAT / UNSAT La version et la version de lettre de qualité
avoir les numéros de catalogue distinctes.
Mais pas une grosse affaire.
Il suffit de venir à moi ou à Rob ou à Lauren en tout point.
Ou envoyez-nous si vous n'avez pas le genre de documents dont vous avez besoin aujourd'hui, et nous
ne manquera pas de vous aider à prendre soin de cela avant lundi.
>> Très bien, alors aujourd'hui -
en fait, il ya un peu d'écho.
Pouvons-nous ton me baisser un peu?
OK.
Donc, aujourd'hui, nous introduisons un sujet connue sous le nom pointeurs.
Et je dois admettre que c'est l'un des des sujets plus complexes que nous avons tendance à
couvrir dans cette classe, ou vraiment tout cours d'introduction qui utilise C.
>> Mais prenez-en ma parole, en particulier Si votre esprit se sent un peu plus courbé
aujourd'hui et dans les semaines à venir.
Ce n'est pas représentatif de vous faire pire à ce qu'il signifie simplement que
c'est un sujet particulièrement sophistiqué que je le promets, quelques semaines
par conséquent, vous semblera trop frappante simple rétrospectivement.
>> Je me souviens encore à ce jour.
J'étais assis dans Elliott Dining Hall, assis à côté de mon TF Nishat Mehta,
qui était un résident de la maison Elliott.
Et pour une raison quelconque, cette sujet clique simplement.
C'est-à-dire que moi aussi je luttais avec elle pendant un certain laps de temps, mais je
Je ferai mon meilleur pour aider à éviter une telle lutte avec un sujet qui finalement
est assez puissant.
>> En fait, l'un des sujets dont nous discuterons dans les semaines à venir, c'est que
de sécurité, et comment vous pouvez réellement exploiter les machines de façon
qui n'étaient pas prévus.
Et ces exploitations sont généralement le résultat de bugs, des erreurs que nous
les gens font en ne comprenant pas certains de l'implémentation sous-jacente
détails via les programmes qui sont faits.
>> Maintenant, pour faire ce semble d'autant plus facile à utiliser amical, j'ai pensé que je jouerais à 10
deuxième aperçu d'un peu de pâte à modeler Figure nommé Binky qui a été porté à
vie par un de nos amis à Stanford, professeur Nick Parlante.
Alors, permettez-moi de vous donner cette teaser de Binky ici.
>> [LECTURE VIDEO]
>> -Hey, Binky.
Réveillez-vous.
Il est temps pour le plaisir du pointeur.
>> -Qu'est-ce que c'est?
Renseignez-vous sur les pointeurs?
Oh, goodie.
>> [FIN LECTURE VIDÉO]
>> DAVID MALAN: C'est Stanford l'informatique.
Donc, plus sur cela pour venir.
>> [Applaudissements]
>> DAVID MALAN: Désolé, Nick.
>> Alors rappeler que la dernière fois que nous avons fini sur ce cliffhanger vraiment passionnant
par laquelle cette fonction n'a tout simplement pas fonctionner.
Au moins intuitivement, il s'est senti comme cela devrait fonctionner.
Échangeant simplement les valeurs de deux nombres entiers.
Mais rappeler que lorsque nous avons imprimé l' valeurs d'origine dans principale, et une
deux, ils étaient encore un et deux pas et deux et un.
>> Permettez-moi donc réellement commute au cours de l'appareil.
Et j'ai écrit un morceau de code squelettique avancer ici, où je prétends que x
sera 1, y sera 2.
J'ai ensuite imprimer les deux de leur valeurs avec impression f.
>> J'ai ensuite prétends ici que nous allons échanger.
J'ai laissé une tache blanche ici pour nous remplir aujourd'hui dans un instant.
Ensuite, je vais prétendre que l' deux variables ont été échangés.
Alors je vais imprimer les sortir de nouveau.
Et donc j'espère, je devrais voir 1, 2.
2, 1.
C'est la super simple objectif en ce moment.
>> Alors, comment allons-nous échanger deux variables?
Eh bien, si je propose ici que ces coupes peut représenter la mémoire dans un ordinateur.
Ce n'est que quelques bouchées, ce est encore quelques bouchées.
Aurions-nous pu un volontaire venu sur place et nous mélanger certaines boissons, si familier?
Venez sur place.
Quel est votre nom?
>> JESS: Jess.
>> DAVID MALAN: Jess?
Allez-vous, Jess.
Si vous n'avez pas l'esprit, nous devons mettre l' Verre Google sur vous afin que nous puissions
immortaliser cela.
OK, verre.
Enregistrer une vidéo.
Et OK, nous sommes bien d' aller avec Jess ici.
Très bien.
Enchanté de faire votre connaissance.
>> Donc ce que je voudrais que vous faites ici - si vous pouviez, assez rapidement -
nous verse juste un demi-verre d'orange jus et un demi-verre de lait,
représenter efficacement les numéros 1 dans une tasse et 2 dans l'autre coupelle.
>> Cela va être une bonne séquence.
>> JESS: Désolé.
>> DAVID MALAN: Non, non.
C'est OK.
Nice.
Très bien, alors nous avons quatre octets la valeur de jus d'orange.
Nous l'appelions la valeur 1.
Maintenant encore quatre octets d'une valeur de lait.
L'appellerons la valeur 2.
Donc x et y, respectivement.
>> Bon, maintenant si la tâche à accomplir - pour vous, Jess, en face de tous
de vos camarades de classe -
c'est-à permuter les valeurs de x et y tels que nous voulons que le jus d'orange dans le
autre tasse et le lait dans cette coupe, comment Seriez-vous - avant de le faire réellement
elle - s'y prendre?
>> OK, sage décision.
Donc, vous avez besoin d'un peu plus de mémoire.
Donc, nous allons allouer une temporaire tasse, si vous voulez.
Et maintenant procéder à échanger x et y.
>> Excellente.
Donc, très bien fait.
Merci beaucoup, Jess.
Voici.
Un petit souvenir.
>> OK, donc évidemment, super idée simple.
Complètement intuitive que nous avons besoin d'un peu plus d'espace de stockage - sous cette forme,
une tasse - si nous voulons réellement échanger ces deux variables.
Donc, nous allons faire exactement cela.
Jusqu'à ici, entre où je prétends que je suis allez faire un certain échange, je vais
aller de l'avant et de déclarer température.
Et je vais mettre cela égale à, disons, x.
>> Alors je vais changer la valeur de x comme Jess a fait ici avec l'
lait et jus d'orange pour être égal à y.
Et je vais changer y être égal de ne pas x, parce que maintenant nous serions
coincé dans un cercle, mais plutôt Temp.
Où puis-je temporairement - ou où Jess mettre temporairement le jus d'orange
avant de démolir que tasse avec le lait.
>> Alors laissez-moi aller de l'avant maintenant et faire cela.
C'est ce qu'on appelle noswap.c.
Et maintenant, permettez-moi de ne cours aucun swap.
Et en effet, je vois, si j'augmente la fenêtre un peu, que
x est 1, y est égal à 2.
Et alors x est 2, y est égal à 1.
>> Mais rappelons que le lundi, nous avons fait des choses un peu différemment par lequel je
plutôt mis en place une fonction d'assistance, si vous voulez, qui était en fait vide.
Je l'ai appelé swap.
Je lui ai donné deux paramètres, et j'ai appelé les a et je les ai appelés b.
>> Franchement, je pouvais les appeler x et y.
Rien n'empêche moi de le faire.
Mais je dirais que c'est alors un peu ambigu.
Parce que le rappel de lundi que nous ont affirmé que ces paramètres étaient
des copies des valeurs transmises po
Donc ça salit avec votre esprit, je pense, si vous utilisez
exactement les mêmes variables.
>> Je vais donc plutôt les appeler un et b, juste pour plus de clarté.
Mais nous pourrions appeler plus tout ce que nous voulons.
Et je vais copier et coller efficacement ce code de là-haut
vers le bas dans ici.
Parce que je viens de voir que cela fonctionne.
C'est donc en assez bonne forme.
Et je vais changer mon x à un, ma x à un, mon y à b et b à mon y.
>> Donc, en d'autres termes, même logique exact.
Exactement la même chose que Jess a fait.
Et puis la seule chose que j'ai à faire jusqu'à ici, bien sûr, est désormais invoquer cette
fonction, ou appeler cette fonction.
Je vais donc appeler cette fonction avec deux entrées, x et y, et appuyez sur Enregistrer.
>> D'accord, donc fondamentalement la même chose.
En fait, j'ai probablement fait le programme inutilement complexe par
écrire une fonction qui vient de prendre quelque six lignes de code alors que je
précédemment avaient mis en œuvre ce en seulement trois.
>> Alors laissez-moi aller de l'avant maintenant et refais cela, ne font aucune swap.
D'accord, j'ai merdé ici.
Ce doit être une erreur que vous pourriez voir de plus en plus souvent que votre
programmes deviennent plus complexes.
Mais il ya une solution facile.
Permettez-moi de revenir en arrière ici.
>> Et quelle est la première erreur que je vois?
Déclaration implicite.
Qu'est-ce que cela indique en général?
Oh, j'ai oublié le prototype.
J'ai oublié d'enseigner le compilateur qui échangent va exister même s'il
n'existe pas au tout début du programme.
Alors je vais juste dire nulle, swap, int, int a b, point-virgule.
>> Donc, je ne vais pas réimplémenter.
Mais maintenant, il correspond à ce qui est ici-bas.
Et remarquez, l'absence d'un point-virgule ici, ce qui n'est pas nécessaire lorsque
la mise en œuvre.
>> Permettez-moi donc refais cela, assurez-pas swap.
Bien meilleure forme.
Exécuter sans swap.
Et bon sang.
Maintenant, nous sommes de retour là où nous étions le lundi, où la chose n'a pas swap.
>> Et quelle est l'explication intuitive pour expliquer pourquoi c'est le cas?
Ouais?
>> ETUDIANT: [inaudible].
>> DAVID MALAN: Exactement.
Donc a et b sont des copies de x et y.
Et en fait, chaque fois que vous avez été appel d'une fonction jusque-là que
passe des variables comme ints -
juste comme swap attend ici -
Vous avez été le passage dans les copies.
>> Maintenant, ce qui signifie qu'il faut un peu de temps, d'une fraction de seconde, par l'
ordinateur pour copier les bits de l'un variable dans les bits de l'autre.
Mais ce n'est pas une grosse affaire.
Mais ils sont tout de même une copie.
>> Et maintenant, dans le cadre du swap, Je suis en fait avec succès
changeant a et b.
En fait, nous allons faire un rapide bilan de santé.
Imprimer une f% i, nouvelle ligne.
Et la fiche de laisser passer un.
Maintenant, nous allons faire la même chose avec b.
Et nous allons faire la même chose ici.
>> Et maintenant, permettez-moi de copier ces mêmes lignes encore une fois au fond de la fonction
après mes trois lignes d'intéressant auraient exécuté, et
imprimer A et B encore une fois.
Alors maintenant, nous allons faire ceci, faire aucun swap.
Permettez-moi de la fenêtre du terminal un peu plus grand, de sorte que nous pouvons voir
plus de lui à la fois.
>> Et lancez pas de swap.
x est 1, y est égal à 2. a est 1, b est égal à 2.
Et puis, un est 2, b est 1.
Donc, il travaille, tout comme Jess fait ici à l'intérieur de swap.
Mais bien sûr, il est sans effet sur les variables principale.
>> Donc, nous avons vu un truc qui nous pourrait résoudre ce problème, non?
Lorsque vous êtes confronté à cette portée question, vous pouvez simplement botté et faire x
et y quel type de variables à la place?
>> Vous pourriez faire global.
Mettez-les au tout début du fichier comme nous l'avons fait, même dans le jeu de 15.
Nous utilisons une variable globale.
Mais dans le cadre du jeu à 15, il est raisonnable d'avoir une approche globale
variable représentant le conseil, parce que la totalité de l'ensemble est 15.c
sur la mise en œuvre de ce match.
C'est ce que le fichier existe à faire.
>> Mais dans ce cas là, je suis appeler un swap de fonction.
Je veux échanger deux variables.
Et il devrait commencer à se sentir tout simplement bâclée si la solution à tous nos
problèmes lorsque nous nous heurtons à portée questions est de rendre la planète.
Parce que très rapidement notre programme est va devenir tout un gâchis.
Et nous l'avons fait très peu à la suite dans 15.c.
>> Mais il s'avère qu'il ya une meilleure façon tout à fait.
Permettez-moi de réellement revenir en arrière et supprimer les imprimer f est, juste pour simplifier ce code.
Et permettez-moi de proposer que ce, en effet, est mauvais.
Mais si j'ajoute place dans certains astérisques et les étoiles, je peux transformer ce lieu
fonction dans celle qui est en réalité opérationnelle.
>> Alors permettez-moi de revenir ici et j'avoue dire astérisques est toujours difficile,
donc je dirai étoiles.
Je vais Fess jusqu'à celle-ci.
Très bien.
Et maintenant, que vais-je faire à la place?
>> Alors tout d'abord, je vais préciser qu'au lieu de passer un int en
la fonction de permutation, je suis plutôt d'aller dire int étoile.
Maintenant, qu'est-ce que l'étoile indique?
C'est cette notion d'un pointeur qui Binky, le personnage de pâte à modeler, était
se référant à l'heure.
>> Donc, si nous disons int étoiles, le sens de ce qui est maintenant un ne va pas être
passée par sa valeur.
Ça ne va pas être copié po
Au contraire, l'adresse d'un est va être passé po
>> Donc, rappeler que l'intérieur de votre ordinateur est tout un tas de mémoire, sinon
connu sous le nom de RAM.
Et que la RAM est juste un tas d'octets.
Donc, si votre Mac ou votre PC dispose d' deux gigaoctets, vous avez 2
milliard d'octets de mémoire.
>> Maintenant, nous allons simplement supposer que juste à garder les choses bien et ordonnée, nous
attribuer une adresse -
un certain nombre -
pour chaque octet de RAM dans votre ordinateur.
Le premier octet de ces 2 milliards sont en nombre égal à zéro.
Le prochain est l'octet numéro un, numéro deux, tout le chemin sur place, dot dot
point, à environ 2 milliards d'euros.
>> Ainsi, vous pouvez nombre d'octets de mémoire dans votre ordinateur.
Supposons donc que c'est ce que nous entendons par une adresse.
Alors quand je vois int star, ce qui se passe à passer des contrats de swap est maintenant le
l'adresse d'un.
Pas sa valeur, mais quelle que soit sa postal adresse est, pour ainsi dire -
son emplacement dans la mémoire RAM.
>> Et de même pour b, je vais pour dire la même chose.
Int, étoile, b.
En aparté, techniquement l'étoile pourrait aller dans d'autres endroits.
Mais nous allons standardiser sur l'étoile étant juste à côté du type de données.
>> Donc échange de signature signifie maintenant, donnez-moi l'adresse d'un int, et appel
qui adresse un.
Et donnez-moi une autre adresse d'un INT et appelez cette adresse b.
>> Mais maintenant mon code ici doit changer.
Parce que si je déclare int température -
qui est toujours de type int -
mais je stocke dans un, Quelle valeur?
Pour être clair, je mets un avec un le code tel qu'il est rédigé en ce moment?
>> Je suis en train de l'emplacement dans un fichier.
Mais je ne me soucie pas de l' lieu maintenant, non?
Temp existe seulement troisième cup 'Jess existé, dans quel but?
Pour stocker une valeur.
Lait ou de jus d'orange.
Pas de stocker effectivement l'adresse de l'une de ces choses, qui se sent un
peu absurde dans ce réel contexte mondial de toute façon.
>> Alors, vraiment, ce que je veux mettre en température n'est pas l'adresse d'un, mais l'
contenu d'un.
Donc, si a est un nombre comme 123, c'est l'octet 123e mémoire qu'une paix juste
se trouve être occupante, que la valeur en arrive à être occupante.
>> Si je veux aller à cette adresse, Je dois dire une étoile.
De même, si je devais changer ce qui est à l'adresse d'un, je change
ce pour démarrer un.
Si je veux conserver dans ce qui est à l' l'emplacement d'un avec ce qui est à l'emplacement
à b, b étoile étoile.
>> Donc en bref, même si ce n'est pas assez sombrer dans encore - et je ne m'attends pas
qu'il serait si vite -
se rendre compte que tout ce que je fais est le préfixe ces étoiles à mes variables,
Disant ne pas saisir les valeurs.
Ne pas modifier les valeurs.
Mais plutôt, allez à ces adresses et obtenir la valeur.
Aller à cette adresse et le changement la valeur de y.
>> Alors maintenant, permettez-moi de revenir en arrière jusqu'au sommet, juste de fixer cette ligne ici, pour
modifier le prototype de match.
Mais je dois maintenant faire autre chose.
Intuitivement, si j'ai changé les types des arguments qui échangent attend,
Que dois-je changer dans mon code?
>> Quand j'appelle swap.
Parce que maintenant, ce matin Je passe à échanger encore?
La valeur x et la valeur de y, ou le lait et les jus d'orange.
Mais je ne veux pas faire ça.
Je veux au lieu de passer en quoi?
L'emplacement de x et l'emplacement de y.
Quelles sont leurs adresses postales, pour ainsi dire.
>> Donc, pour ce faire, il ya une esperluette.
Ampersand genre de sons comme adresse.
si n, esperluette, l'adresse de x, et l'adresse de y.
Donc c'est délibéré que nous utilisons esperluette lors de l'appel de la fonction,
et les étoiles lors de la déclaration et lorsque réalisation de la fonction.
>> Et il suffit de penser que l'esperluette adresse de l'opérateur, et l'étoile que l'
y aller opérateur -
ou, plus correctement, l' opérateur de déréférencement.
C'est donc tout un tas de mots juste pour dire que maintenant, je l'espère, le swap va
comme correctes.
>> Permettez-moi d'aller de l'avant et faire -
nous allons effectivement renommer le fichier, de peur ce programme encore être appelé sans swap.
Je prétends que nous appelons swap.c maintenant.
Donc, assurez, swap.
Dot, slash, swap.
>> Et maintenant, en effet, x = 1, y est 2.
Et puis, x 2, y en a un.
Eh bien nous allons voir si nous ne pouvons pas faire cela une peu différemment de ce qui est
passe ici.
Tout d'abord, permettez-moi de zoom avant sur notre dessin écran ici.
Et permettez-moi de proposer un instant - et chaque fois que je dessine ici seront miroir
là-haut - permettez-moi de proposer que voici tout un tas de mémoire, ou
RAM, à l'intérieur de mon ordinateur.
>> Et ce sera le numéro de morsure, disons, 1.
Ce sera le numéro 2 octets.
Et je vais faire tout un tas d'autres, et puis un tas de dot dot points à
indiquent qu'il ya 2 milliards de ces choses.
4, 5, et ainsi de suite.
>> Donc, il ya les cinq premiers octets de la mémoire de mon ordinateur.
Tout va bien?
Très peu de 2 milliards d'euros.
Mais maintenant, je vais proposer ce qui suit.
Je vais proposer que x va mémoriser le numéro 1, et y va
à stocker le numéro 2.
Et permettez-moi d'aller de l'avant maintenant et représente ces valeurs comme suit.
>> Faisons-le comme suit.
Donnez-moi juste une seconde.
Une seconde.
OK.
Je veux faire un peu -
Faisons-le à nouveau.
Sinon, je vais et en utilisant le mêmes numéros, sans le vouloir,
plusieurs fois.
>> Il suffit donc de sorte que nous avons des numéros différents parler, appelons cet octet
numéro 123, 124, 125, 126, et dot dot dot.
Et permettez-moi de prétendre maintenant que je vais mettre la valeur 1 ici, et la valeur 2
ici, autrement connu comme x et y.
Donc, il se trouve que c'est x, c'est y.
>> Et juste par hasard aléatoire, le l'ordinateur, le système d'exploitation,
arrivé à mettre x à l'endroit numéro 123.
Et y a fini à l'emplacement 124 -
bon sang.
J'aurais résolu ce.
Oh man, ce que je veux vraiment faire ça?
Oui, je veux résoudre ce problème et b appropriée à ce sujet aujourd'hui.
Désolé, novice en la matière.
>> 127, 131, et je ne voulais pas être cette complexe, mais pourquoi n'ai-je changer le
nombre là-bas?
Parce que je veux que les ints à en fait de quatre octets.
Donc, nous allons être super anal à ce sujet.
Alors que si 1 arrive à être abordée 123, le 2 va être à l'adresse
127 parce que c'est seulement 4 adieux loin.
Voilà tout.
Et nous oublions tous les autres adresses dans le monde.
>> Alors x est à l'emplacement 123, y est à l'emplacement 127.
Et maintenant, que dois-je réellement envie de faire?
Quand j'appelle virtuelle maintenant, ce qui est passe réellement?
Eh bien, quand je l'appelle swap, je suis de passage dans l'adresse de l'adresse x et de y.
Ainsi, par exemple, si ces deux morceaux de papier représentent maintenant les deux
arguments a et b de swap, que suis-je allez écrire sur le premier d'entre eux,
que je vais appeler appeler une?
>> Exactement, 123.
Donc, ce que je prétends est un.
C'est le paramètre a.
Je mets l'adresse de x à y.
>> Qu'est-ce que c'est?
>> Non, non.
C'est OK.
Toujours bon, toujours bon.
Il s'agit donc d'un.
Et maintenant sur le deuxième morceau de papier, cela va être b, et ce que je
va être écrit sur ce morceau de papier?
127.
>> Donc, la seule chose qui a changé depuis notre précédent récit de cette histoire est,
plutôt que littéralement 1 et 2, je suis va passer à 123 et 127.
Et je vais maintenant mettre ces intérieur de cette boîte, d'accord?
Alors que la boîte noire représente désormais la fonction de permutation.
>> Pendant ce temps, nous allons avoir maintenant quelqu'un mettre en œuvre la fonction de permutation.
Est-ce que quelqu'un ici faire du bénévolat?
Venez sur place.
Quel est votre nom?
Charlie.
Très bien, Charlie.
Venez sur place.
>> Alors, Charlie va jouer le rôle de notre boîte noire.
Et Charlie, ce que je voudrais que vous fassiez maintenant, c'est la mise en œuvre échange de manière
que, compte tenu de ces deux adresses, vous étiez réellement allez
pour modifier les valeurs.
Et je vais chuchoter dans votre oreille comment faire fonctionner la TV ici.
>> Alors allez-y, et vous êtes la boîte noire.
Atteindre là-dedans.
Quelles sont les valeurs que vous voyez un, et Quelles sont les valeurs voyez-vous pour b?
>> CHARLIE: une de 123 et b est de 127.
>> DAVID MALAN: OK, exactement.
Maintenant s'y arrêter pour un instant.
La première chose que vous allez faire maintenant, selon le code - qui
Je vais maintenant tirer sur l'écran -
va être d'allouer un peu peu de mémoire appelée température.
Donc, je vais aller de l'avant et vous donner cette mémoire.
>> Donc cela va être une troisième variable que vous avez accès à
vous avez appelé Temp.
Et qu'est-ce que vous allez écrire sur la pièce temp de papier?
>> CHARLIE: pointeurs, non?
>> DAVID MALAN: OK, eh bien pas nécessairement pointeurs.
Ainsi, la ligne de code que j'ai mis en évidence sur le côté droit,
nous allons commencer par là.
Il dit une étoile.
Ainsi, un stocke actuellement le numéro 123.
Et intuitivement, ce n'a étoiles 123 signifie?
>> Mais précisément, si a est 123, étoile a veut dire quoi?
La valeur d'un.
Ou de façon plus décontractée, allez-y.
Alors permettez-moi de proposer que, tenant la une dans votre main, aller de l'avant et à traiter que
comme si c'est une carte.
Et marchez-vous sur l'ordinateur de mémoire, et nous trouver ce qui est
à l'emplacement 123.
Exactement.
>> Ainsi, nous voyons à l'emplacement 123 C'est ce que, évidemment?
OK, donc quelle valeur êtes-vous va mettre en température?
Exactement.
Alors n'hésitez plus et le faire.
Et notez le numéro 1 sur le morceau de papier qui est actuellement intitulé température.
>> Et maintenant, la prochaine étape qui vous allez mettre en œuvre
va être quoi.
De plus, sur le côté droit de l' ligne de code suivante est la star b. b, de
Bien sûr, stocke une adresse.
Qui traite 127.
Star B signifie que, parlant avec désinvolture?
>> Aller à cet endroit.
Alors allez-y et nous trouver ce qui est à l'emplacement 127.
OK.
Bien sûr, à l'emplacement 127, est toujours la valeur 2.
Alors, qu'allez-vous maintenant au magasin tout ce qui est à l'emplacement d'une?
Alors star moyens vont à l'emplacement d'un.
Quel est le lieu d'un?
>> Exactement.
Alors maintenant, si vous voulez changer ce qui est à cet endroit -
Je vais aller de l'avant et lance la gomme sont ici.
Et maintenant le remettre sur la brosse.
Quel numéro vas-tu écrire dans cette boîte vide maintenant?
>> Exactement.
Donc, cette ligne de code, pour être clair - et encore moi de m'arrêter ce que Charlie fait et
souligner ici, ce qu'il vient de faire est écrire dans cette boîte à l'emplacement 123
la valeur qui était précédemment en b.
Et donc nous avons maintenant mis en place en effet cette deuxième ligne de code.
>> Maintenant, malheureusement, il ya encore une ligne restante.
Maintenant ce qui est en temp, littéralement?
C'est évidemment le numéro un.
Ce n'est pas une adresse.
C'est juste un nombre, une sorte de une variable à partir de la première semaine.
>> Et maintenant, quand vous dites étoiles B, ce qui signifie Allez à l'adresse B, qui est de
Bien sûr ici.
Donc, une fois que vous y arrivez -
Je vais aller de l'avant et d'effacer ce qui est réellement là - et ce sont vous
vais écrire maintenant à l'emplacement 127?
>> CHARLIE: Temp, qui en est un.
>> DAVID MALAN: Temp, qui en est un.
Et ce qui arrive à température à la fin?
Eh bien, nous ne savons pas vraiment.
Nous ne m'inquiète pas vraiment.
Chaque fois que nous avons mis en place une fonction Jusqu'à présent, toutes les variables locales vous ont
sont en effet local.
Et ils disparaissent tout simplement.
Ils sont récupérés par l'exploitation système par la suite.
>> Donc, le fait que température a encore le valeur 1 est en quelque sorte fondamentalement
sans intérêt pour nous.
Très bien, alors une salve d'applaudissements si nous pouvions pour Charlie.
Très bien fait.
>> Bon, alors quoi de plus fait cela signifie que nous pouvons faire?
Ainsi, il s'avère que nous avons été dire quelques mensonges
depuis un certain temps.
En effet, il s'avère que d'une chaîne, tout ce temps, n'est pas vraiment une
séquence de caractères en soi.
Il genre, c'est que intuitivement.
>> Mais techniquement parlant, est une chaîne type de données que nous avons déclaré à l'intérieur de
la bibliothèque CS50 de simplifier le monde pendant les premières semaines de cours.
Qu'est-ce qu'une chaîne est vraiment, c'est l'adresse d'un caractère quelque part dans la mémoire RAM.
Une chaîne est vraiment un numéro, comme 123 ou 127, qui arrive à délimiter
où une chaîne commence à la mémoire de votre ordinateur.
>> Mais il ne représente pas le Chaîne, en soi, lui-même.
Et nous pouvons voir cela comme suit.
Permettez-moi d'aller de l'avant et d'ouvrir un code qui est parmi
Les exemples de code source d'aujourd'hui.
Et je vais aller de l'avant et d'ouvrir jusqu'à, disons, comparez-0.c.
Il s'agit d'un programme bogué qui va être mis en œuvre comme suit.
>> Première.
Je vais dire quelque chose.
Ensuite, je vais aller de l'avant et obtenir une chaîne de caractères à partir de l'utilisateur
en ce que la ligne suivante.
Ensuite, je vais le dire encore.
Alors je vais prendre un autre Chaîne de l'utilisateur.
>> Et remarquez, je montre l'un des chaînes dans une variable appelée S, et
l'autre de ces cordes dans une variable appelée t.
Et maintenant, je vais demander, très raisonnablement que, si s est égal à égal t,
les chaînes de caractères sont les mêmes.
Vous tapez la même chose.
Sinon, les chaînes sont pas la même chose.
>> Après tout, si nous saisir deux ints, deux chars, deux chars, deux doubles, chacune des
les types de données dont nous avons parlé à ce jour pour les comparer -
rappelons-nous dit très clairement il ya un certain temps que vous ne faites pas cela, car une
seul signe égal est bien sûr l'opérateur d'affectation.
Ce serait donc une erreur.
>> Nous utilisons le signe égal égal, qui compare en effet
choses pour une véritable égalité.
Mais je prétends que c'est buggy.
Si je vais de l'avant et faire comparer à zéro, et puis ne point slash comparer zéro.
Et je tape dans, disons, bonjour.
Et puis, disons bonjour à nouveau.
Littéralement la même chose, l'ordinateur Allégations relatives J'ai tapé des choses différentes.
>> Maintenant, j'ai peut-être une erreur de frappe quelque chose.
Je tape mon nom cette fois.
Je veux dire, bonjour.
Bonjour.
C'est différent à chaque fois.
>> Eh bien, pourquoi est-ce?
Qu'est-ce qui se passe réellement sous le capot?
Eh bien, qu'est-ce qui se passe vraiment en dessous le capot est la chaîne puis
J'ai tapé la première fois, par exemple, est le mot bonjour, bien sûr.
Mais si nous représentons cette sous le capot, rappelons qu'un
chaîne est dans un tableau.
Et nous avons dit autant dans le passé.
>> Donc, si je dessine ce tableau comme celui-ci, je suis va représenter quelque chose d'assez
similaire à ce que nous avons fait il ya un moment.
Et il ya effectivement quelque chose spécial ici, aussi.
Qu'avons-nous déterminons était à la fin de chaque chaîne de caractères?
Ouais, c'est zéro barre oblique inverse, qui est juste la manière de représenter,
littéralement, 00000000.
Huit bits à 0 dans une rangée.
>> Je ne sais pas, franchement, ce qui est après cela.
C'est juste une bande de plus de RAM à l'intérieur de mon ordinateur.
Mais c'est un tableau.
Nous avons parlé de tableaux avant.
Et nous parlons généralement sur les tableaux comme lieu de zéro,
puis un, puis deux.
Mais ce n'est que pour plus de commodité.
Et c'est tout à fait relative.
>> Lorsque vous êtes en train de faire mémoire de l'ordinateur, c'est bien sûr tout
2 milliards d'octets certains impairs, potentiellement.
Alors, vraiment sous le capot, tout ce temps, oui.
Cela pourrait très bien être zéro de support.
Mais si vous creusez plus profond sous le capot, c'est vraiment
adresse, numéro 123.
C'est l'adresse 124.
C'est l'adresse 125.
>> Et je n'ai pas bousiller ce moment.
Ce sont maintenant une bytes à part pour quelle raison?
Quelle est la taille d'un chevalier?
Un char est juste un octet.
Un int est généralement de quatre octets.
C'est pour ça que je l'ai fait 123, 127, 131 et ainsi de suite.
Maintenant, je peux garder le calcul simple et juste faire plus 1.
Et c'est maintenant ce qui se passe réellement le dessous de la hotte.
>> Ainsi, lorsque vous déclarez quelque chose comme ça, string s, c'est en fait -
il s'avère -
étoiles caractères.
Star, bien sûr, signifie adresse, pointeur aka.
Donc, c'est l'adresse de quelque chose.
Qu'est-ce que l'adresse?
>> Eh bien -
Je suis le seul qui peut voir le très point important que je fais, ou de penser
Je fais.
Alors string -
Le plus triste est que j'ai un moniteur là où je
aurait vu cela.
>> Très bien, alors chaîne s est ce J'ai déclaré précédemment.
Mais il s'avère, grâce à un peu magie dans la bibliothèque CS50, tout cela
chaîne d'heure a littéralement étoiles caractères été.
L'étoile signifie à nouveau pointeur ou adresse.
Le fait que ça flanquant la caractère mot signifie que c'est le
adresse d'un personnage.
>> Donc, si obtenir chaîne est appelé, et je tape en H-E-L-L-O, proposer maintenant ce faire a
chaîne littéralement rentrait tous cette fois, même si nous avons plutôt
simpliste du monde?
Ce qui ne se fait string retourner sa valeur de retour?
>> 123 dans ce cas, par exemple.
Nous avons déjà dit que se string retourne simplement une chaîne, une séquence de
caractères.
Mais c'est un peu un mensonge.
La façon dont se string fonctionne vraiment sous le capot est elle obtient un
Chaîne de l'utilisateur.
Il fait flac les caractères il ou elle types de mémoire.
Il met un zéro de barre oblique inverse à la fin ceux de séquence de caractères.
>> Mais alors qu'est-get ne string littéralement retourner?
Il retourne littéralement l'adresse de l' premiers octets de la mémoire vive que
a utilisé pour cette force.
Et il s'avère que, tout en renvoyant une adresse unique de l'
premier caractère de la chaîne, qui est suffisant pour trouver la totalité de
la chaîne.
>> En d'autres termes, obtenir chaîne n'a pas pour revenir 123 et 124 et 125.
Il n'a pas à me donner une longue la liste de tous les octets qui
ma chaîne utilise.
Parce que l'un, ils sont tous dos à dos.
Et de deux, basé sur la première adresse, je peut comprendre où la chaîne se termine.
Comment?
>> Le caractère nul spéciale, l' backslasher zéro à la fin.
Donc, en d'autres termes, si vous passez autour -
à l'intérieur de variables -
l'adresse d'un char, et vous assumez que, à la fin d'une chaîne de caractères, une
séquence de caractères que nous, les humains penser à cordes, si vous supposez que
à la fin d'une telle chaîne, il ya un zéro barre oblique inverse, vous êtes d'or.
Parce que vous pouvez toujours trouver la fin d'une chaîne.
>> Maintenant, ce qui est vraiment d'aller ensuite dans ce programme?
Pourquoi est ce programme, compare-0.c, poussette?
Qu'est-ce qui est réellement en comparaison?
Ouais?
>> ETUDIANT: [inaudible].
>> DAVID MALAN: Exactement.
C'est en comparant les locations des cordes.
Donc, si l'utilisateur a tapé dans bonjour une fois, comme je l'ai fait, la mémoire pourrait finir
ressemblant à ceci.
Si l'utilisateur tape ensuite dans Bonjour à nouveau, mais en appelant obtenir à nouveau string, c est
pas particulièrement intelligent, sauf si vous enseignez qu'il soit intelligent en écrivant du code.
>> C -
et plus généralement les ordinateurs -
si vous tapez le mot bonjour à nouveau, vous savez ce que vous allez obtenir.
Vous allez juste pour obtenir un second réseau de mémoire, oui, arrive-être
stocker H-E-L-L-S, etc.
>> Il va chercher la même chose pour nous, les humains, mais cette adresse
pourrait ne pas être 123.
Il pourrait bien arriver que l' système d'exploitation offre quelques uns d'
espace par exemple à l'emplacement -
disons quelque chose d'arbitraire, comme cela est l'emplacement 200.
Et ce n'est emplacement 201.
Et ce n'est emplacement 202.
Nous n'avons aucune idée où c'est va être en mémoire.
>> Mais ce que cela signifie, c'est que ce qui est va être stocké en fin de compte à s?
Le nombre 123.
Qu'est-ce qui se passe pour être stocké dans t, Dans cet exemple arbitraire?
Le nombre 200.
Et tout cela signifie alors est évidemment, 123 n'est pas égale à 200.
Et si cette situation si jamais évalue à true.
Parce chaîne get utilise différents morceaux de mémoire à chaque fois.
>> Maintenant, nous pouvons voir ce message Dans un autre exemple.
Permettez-moi d'aller de l'avant et d'ouvrir la copie 0.c.
Je prétends que cet exemple va essayer - mais ne parviennent pas - de copier deux chaînes
comme suit.
>> Je vais dire quelque chose à l'utilisateur.
Je suis alors allez obtenir un chaîne et appeler s.
Et maintenant, je fais ce test ici.
Nous en avons parlé un retour de tout.
Mais quand Might Get chaîne return null, un autre caractère spécial ou spéciaux
symbole nous a laissés dire.
Si c'est de mémoire.
>> Par exemple, si l'utilisateur est vraiment être difficile et types atroce
nombre de caractères à l' clavier et touche Entrée.
Si ce nombre de caractères ne peuvent tout simplement pas tenir en mémoire vive pour une folle
raison, bien obtenir chaîne peut très bien retourner null.
>> Ou si votre programme lui-même fait beaucoup d'autres choses et il ya juste
pas assez de mémoire pour la chaîne get Pour réussir, il pourrait finir
par retourner null.
Mais soyons plus précis pour ce que c'est.
Quel est le type de données est vraiment?
Étoiles Char.
>> Ainsi, il s'avère maintenant que nous pouvons éplucher sauvegarder la couche null.
Il s'avère que, nulle est - oui, évidemment un symbole spécial.
Mais quel est-il vraiment?
Vraiment, null est juste un symbole qui nous les humains utilisent pour représenter zéro aussi.
>> Ainsi, les auteurs de C et des ordinateurs plus généralement, a décidé il ya quelques années
que, vous savez quoi.
Pourquoi ne pas nous assurons qu'aucun utilisateur donnée n'est jamais, jamais, jamais
stockée à zéro au revoir?
En fait, même dans mon exemple arbitraire avant, je n'ai pas commencer la numérotation de la
octets à zéro.
J'ai commencé à un.
Parce que je savais que les gens dans le monde ont décidé de réserver le zéro
octet dans la mémoire vive de quelqu'un comme quelque chose de spécial.
>> La raison étant, quand vous voulez signal que quelque chose a mal tourné
en ce qui concerne les adresses, vous revenez null - autrement connu comme zéro -
et parce que vous savez qu'il n'y a pas légitimer données à l'adresse zéro, clairement
ce qui signifie qu'une erreur.
Et c'est pourquoi nous avons, par convention, vérifions pour nulle et retour quelque chose
comme l'un de ces cas.
>> Donc, si nous défiler vers le bas maintenant, ce n'est que puis la vérification d'erreur, juste au cas où
quelque chose se passait mal avec [? Bail?]
tout à fait et quitter le programme par un retour hâtif.
Cette ligne maintenant pourrait être réécrit celui-ci, ce qui signifie quoi?
Sur le côté gauche, donne-moi un autre pointeur sur un caractère, et l'appeler t.
Que vais-je stocker à l'intérieur de t, basée sur cette seule ligne de code?
>> Je stocker un emplacement.
Plus précisément l'emplacement C'était en s.
Donc, si l'utilisateur a tapé dans bonjour, et qui arrive en premier bonjour à finir
ici, le nombre 123 est va revenir à obtenir
String et être stockées -
comme nous le disions plus tôt -
à s.
>> Lorsque je déclare un autre pointeur vers un chevalier et appeler t, ce qui est le numéro
va littéralement se retrouver dans t en fonction de l'histoire?
Donc 123.
>> Donc, techniquement désormais à la fois s et t pointent à l'exact
mêmes morceaux de mémoire.
Donc, remarque ce que je vais faire maintenant pour prouver que ce programme est bogué.
>> D'abord, je vais demander, avec une f d'impression, en capitalisant
la copie de la chaîne.
Alors je vais faire un peu Vérification des erreurs.
Je vais m'en assurer.
Faisons en sorte que la chaîne t est à moins supérieur à zéro dans la longueur,
il ya donc un certain caractère il à réellement tirer profit.
>> Et puis, vous pouvez vous rappeler ce des exemples précédents.
2 supérieure - qui est en le fichier ctype.h.
T support zéro me donne le zéro caractère de la chaîne t.
Et 2 supérieure de cette même valeur, de Bien sûr, le convertit en majuscules.
>> Alors, intuitivement, cette ligne a souligné de code est en capitalisant la première
lettre t.
Mais ce n'est pas capitaliser, intuitivement, la première lettre de l'art.
Mais si vous songez à venir, que suis-je sur le point de voir quand je lance ce programme
et imprimer à la fois de l'original, s, et la copie dite, t?
>> Ils vont réellement être la même.
Et pourquoi vont-ils être les mêmes?
Ils sont tous deux pointant vers exactement la même chose.
Donc, nous allons le faire.
>> Faire une copie zéro.
Il compile OK.
Permettez-moi de courir copie zéro.
Permettez-moi de taper quelque chose comme bonjour dans tout en minuscules puis appuyez sur Entrée.
Et il affirme que tant le s initial et la copie sont en effet identiques.
>> Alors qu'est-ce qui s'est réellement passé ici?
Permettez-moi de redessiner cette image juste pour raconter l'histoire d'une
manière légèrement différente.
Qu'est-ce qui se passe vraiment en dessous de la hotte lorsque je déclare quelque chose comme
chevalier Commençons ou une chaîne s, Je reçois un pointeur -
qui se trouve être de quatre octets dans l'appareil CS50
et dans un grand nombre d'ordinateurs.
Et je vais appeler cet art.
Et cela a actuellement une valeur inconnue.
>> Lorsque vous déclarez une variable, sauf si vous vous mettez une valeur là-bas, qui
sait ce qui est là.
Il pourrait y avoir une séquence aléatoire de les bits de l'exécution précédente.
Alors, quand j'ai, dans ma ligne de code reçois chaîne, puis stocker le retour
valeur en s obtenir chaîne en quelque sorte -
et nous finirons par peler comment obtenir travaux à cordes, en quelque sorte alloue une
tableau qui ressemble probablement un peu comme ça.
H-E-L-L-O, barre oblique inverse zéro.
>> Supposons que c'est l'adresse 123 tout d'abord la cohérence.
Donc obtenir des rendements de chaîne, dans le ligne en surbrillance là, elle renvoie la
Numéro nous l'avons dit, 123.
Donc ce qui se passe vraiment à l'intérieur de s ici?
>> Eh bien, ce qui se passe vraiment à l'intérieur de S est 123.
Mais franchement, je suis un peu confondu par l'ensemble de ces adresses,
tous ces chiffres arbitraires.
123, 124, 127.
Donc, nous allons réellement simplifier le monde un peu.
>> Lorsque nous parlons de pointeurs, franchement, nous, les humains, qui est le diable se soucie où
les choses sont en mémoire?
C'est complètement arbitraire.
Ça va dépendre de la façon quantité de RAM que l'utilisateur possède.
Ça va dépendre du moment de la journée vous exécutez le programme, peut-être, et
quelle entrée l'utilisateur vous donne.
Nous sommes s'attarder sur des détails sans importance.
>> Donc le résumé de let loin et dire que, lorsque vous exécutez une ligne de code comme celui-ci,
omble étoile s obtient le retour valeur de chaîne GET.
Pourquoi n'avons-nous pas plutôt juste attirons ce que nous continuer à appeler un pointeur comme s'il s'agissait d'
pointant à quelque chose?
Donc je prétends maintenant que s up il existe un pointeur -
sous le capot, c'est une adresse.
Mais c'est juste pointant vers le premier octet dans l'
chaîne qui a été retourné.
>> Si je reviens maintenant au code ici, ce qui se passe sur cette ligne?
Eh bien, dans cette ligne en surbrillance maintenant, Je déclarant apparemment un autre
variable appelée t.
Mais c'est aussi un pointeur, donc je vais pour dessiner comme, en théorie, exactement
même boîte de taille.
Et je vais l'appeler t.
>> Et maintenant, si nous revenons à nouveau le code, quand je stocke s à l'intérieur de t,
ce que je suis techniquement mettre à l'intérieur de la t?
Eh bien, techniquement, cette était le numéro 123.
Alors, vraiment, je devrais écrire le numéro 123 là-bas.
Mais prenons le plus haut niveau.
t, si elle est juste un pointeur, intuitivement, c'est exactement cela.
C'est tout ce qui est en cours stocké à l'intérieur.
>> Alors maintenant, dans les dernières lignes intéressantes du code, quand je vais en fait sur
capitalisant le caractère zéro en t, ce qui se passe?
Eh bien, t support zéro est désormais pointé à ce personnage, sans doute?
>> Il pointe vers h.
Parce t support de zéro -
Rappel, c'est l'ancienne syntaxe. t support zéro signifie simplement que si t est une chaîne, t
support de zéro signifie obtenir le zéro caractère en ce que la force.
Alors qu'est-ce que cela signifie vraiment est d'aller à ce tableau -
et oui, cela pourrait être 123, cela pourrait être 124.
Mais tout est relatif, rappelez-vous.
Chaque fois parler d'un tableau, nous avons l'avantage de parler
les indices relatifs.
>> Et maintenant, nous pouvons simplement supposer que t est zéro support h.
Donc, si j'appelle 2 supérieure sur elle, ce que c'est faire est vraiment capitaliser
l'h minuscule à majuscule H. Mais bien sûr, ce qui est s?
C'est pointant vers la même chaîne sacrément.
>> Donc, c'est tout ce qui se passe dans ce code jusqu'ici.
Alors, quelle est alors la conséquence?
Comment pouvons-nous résoudre ces deux problèmes?
Comment nous comparons-nous à cordes réelles?
>> Eh bien, intuitivement, comment vous allez sur la comparaison de deux
cordes pour une véritable égalité?
>> Qu'est-ce que cela signifie si deux chaînes sont égales?
Ce n'est manifestement pas que leurs adresses sont égale à la mémoire, parce que c'est un faible
détail d'implémentation de niveau.
Tous les caractères sont les mêmes.
Alors permettez-moi de proposer, et permettez-moi de vous présenter en version un compare.c
ici, donc comparer-1.c.
>> Permettez-moi de proposer que nous obtenons toujours une pointeur appelé s, et le magasin en lui l'
valeur de ficelle obtenir le retour.
Faisons la même chose avec t.
Donc, aucun du code est différent.
Je vais ajouter un peu plus de contrôle d'erreur maintenant.
Alors, maintenant que nous sommes en quelque sorte éplucher ces couches dans CS50 de ce qu'est une chaîne
en fait, c'est que nous devons être plus anal À propos de nous assurer que nous n'avons pas abuser
valeurs invalides comme nulle.
>> Alors je vais juste vérifier.
Si s n'est pas égal nulle et T ne égal nulle, cela signifie que nous sommes OK.
Faites chaîne n'a pas bousiller obtenir l'une de ces chaînes.
Et vous pouvez peut-être deviner maintenant, qu'est-ce ne STR CMP vraisemblablement faire?
Comparaison de chaîne.
>> Donc, si vous avez programme en java avant, c'est comme la méthode égaux dans la
classe de chaînes.
Mais pour ceux d'entre vous qui n'ont pas programmé,
c'est juste une fonction c.
Il arrive à entrer dans un fichier appelé .
C'est là où elle est déclarée.
>> Et comparaison de chaîne -
En fait, j'ai oublié son utilisation, mais qu'à cela ne tienne.
Rappelez-vous que nous pouvons faire homme, remuer comparer.
Et cela va faire apparaître le Manuel du programmeur Linux.
Et c'est, franchement, un peu énigmatique.
Mais je vois ici que, yep.
Je dois comprendre .
>> Et il est dit ici sous la description, "l' fonction de comparaison de chaîne compare
les deux chaînes S1 et S2. "et S1 et S2 sont apparemment les deux
arguments passés po
Je ne me souviens pas vraiment ce const est, mais maintenant Avis -
et vous avez peut-être déjà vu cette lorsque vous avez utilisez les pages de manuel si vous
tout avoir -
cette étoile char est tout simplement synonyme avec de la ficelle.
>> Donc, il compare les deux chaînes, S1 et S2, et il renvoie un nombre entier inférieur
supérieur ou égal à ou plus grand que zéro si S1 se trouve, respectivement, pour être
inférieur ou correspondre, ou être supérieur à S2.
C'est juste une façon très complexe de dire cette chaîne comparer les rendements
zéro si deux chaînes sont intuitivement identiques, caractère pour
au caractère près.
>> Elle retourne un nombre négatif si s, par ordre alphabétique, est censé
à venir avant de t.
Ou renvoie un nombre positif si s est censé venir après t
par ordre alphabétique.
Donc, avec cette simple fonction, pourrait vous, par exemple, trier une
tas de mots?
>> Ainsi, dans cette nouvelle version, je vais à aller de l'avant et faire compare1.
Dot slash comparer un.
Je vais taper dans Bonjour tout en minuscules.
Je vais taper dans bonjour en minuscules nouveau.
Et heureusement maintenant il se rend compte J'ai tapé la même chose.
>> En attendant, si je tape dans bonjour en bas BONJOUR cas et en majuscules et
les comparer, j'ai tapé des choses différentes.
Parce que non seulement les adresses différent, mais nous comparons
différents personnages encore et encore.
>> Eh bien, allons-y et fixer une autre problème maintenant.
Permettez-moi de m'ouvrir la version d'un exemplaire, qui porte maintenant
cette question comme suit.
Et celui-ci va chercher un peu plus complexe.
Mais si vous pensez à ce problème, nous nécessité de résoudre, j'espère que ce sera
effacer dans un moment maintenant.
>> Donc, cette première ligne, char début t, en termes simples quelqu'un pourrait proposer
ce qui signifie ici que cette ligne?
Char étoile t, ce que c'est que faire?
>> Bon.
Créer un pointeur vers une certaine place dans la mémoire.
Et permettez-moi de le peaufiner un peu.
Déclarez une variable qui stockera l' Adresse de certains caractères dans la mémoire, juste
d'être un peu plus propre.
>> OK, donc maintenant sur le côté droit, j'ai jamais vu une de ces fonctions
avant, malloc.
Mais que pourrait-il signifier?
Allocation de mémoire.
Allocation mémoire.
>> Ainsi, il s'avère, jusqu'à maintenant, nous n'ont pas vraiment eu un puissant moyen d'
demandant au système d'exploitation, donnez-moi un peu de mémoire.
Au contraire, nous avons maintenant une fonction appelée malloc qui fait exactement cela.
Même si c'est un peu un distraction en ce moment, notez que dans
entre les deux parenthèses est juste va être un numéro.
Lorsque j'ai tapé en question marques peuvent être un nombre.
>> Et ce nombre signifie, donnez-moi 10 octets.
Donnez-moi 20 octets.
Donnez-moi 100 octets.
Et malloc fera de son mieux pour demander au système d'exploitation -
Linux, dans ce cas -
hey, sont leurs 100 octets de RAM disponible?
Si c'est le cas, retourner ces octets à moi par renvoyer l'adresse de laquelle de
ces octets peut-être?
Le tout premier.
>> Donc, ici aussi - et cela est prédominante en C, une fois que vous êtes
traiter avec des adresses?
Vous avez presque toujours affaire avec le première domicile, peu importe la taille
un morceau de mémoire que vous êtes restitué, pour ainsi dire.
>> Donc, nous allons plonger ici.
J'essaie de répartir comment nombre d'octets, exactement?
Eh bien.
Longueur de corde de s - LET'S faire un exemple concret.
Si s est bonjour, H-E-L-L-O, ce qui est le longueur de la chaîne s, évidemment?
Donc, c'est cinq.
Mais je fais un plus 1 à ce sujet, pourquoi?
Pourquoi je veux six octets au lieu de cinq?
Le caractère nul.
>> Je ne veux pas cesser cette caractère spécial nulle.
Parce que si je fais une copie de Bonjour et fais juste H-E-L-L-O, mais je ne mets pas
ce caractère spécial, l'ordinateur pourraient ne pas avoir, par hasard, une barre oblique inverse
zéro là pour moi.
Et si je suis à essayer de comprendre la longueur de la copie, je pourrais penser que
c'est 20 caractères de long, ou un million caractères si je viens jamais arriver
de frapper un zéro de barre oblique inverse.
>> Nous avons donc besoin de six octets pour stocker H-E-L-L-O, barre oblique inverse zéro.
Et puis, ce n'est que être super anal.
Supposons que j'oublie la taille d'un char est.
Nous continuons à dire que c'est un octet.
Et il est habituellement.
En théorie, il pourrait être quelque chose différent, sur un autre Mac ou un
PC différent.
>> Ainsi, il s'avère qu'il ya cet opérateur appelé sizeof que si vous lui passez le
nom d'un type de données - comme char, ou int, float ou -
il vous dira, dynamique, combien de octets un chevalier prend sur cette
notamment ordinateur.
>> Donc, c'est effectivement juste comme si on disait fois 1 ou
fois rien du tout.
Mais je le fais juste pour être super anal, que juste au cas où un caractère différent
sur votre ordinateur contre la mienne, de cette façon le calcul va toujours à vérifier.
>> Enfin, ici je vérifie pour null, ce qui est toujours bon - encore une fois,
chaque fois que nous avons affaire à des pointeurs.
Si malloc n'était pas en mesure de donner moi six adieux - ce qui est
peu probable, mais juste au cas où -
retourner un immédiatement.
Et maintenant, allez-y et copier la chaîne comme suit.
Et ce n'est syntaxe familière, mais dans un rôle différent.
>> Je vais aller de l'avant et obtenir la chaîne longueur de s et le stocker dans n.
Je suis ensuite aller à parcourir à partir de i égale zéro jusqu'à et y compris le N,
supérieure ou égale à.
Alors que à chaque itération, j'ai mis le ième caractère de s dans la ième
caractère de t.
>> Alors qu'est-ce qui se passe vraiment en dessous le capot ici?
Eh bien, si, par exemple, est s -
et j'ai tapé le mot H-E-L-L-O et il ya un zéro de barre oblique inverse.
Et encore, il s'agit de pointer ici.
Et voilà maintenant t.
>> Et cette pointe désormais à une copie de la mémoire, non?
Malloc m'a donné une toute morceau de mémoire.
Je ne sais pas ce qui est initialement dans aucun de ces endroits.
Donc, je vais penser à ceux-ci comme tout un tas de points d'interrogation.
>> Mais dès que je commence une boucle à partir de zéro le haut à travers la longueur de s, t
Support zéro et t étrier 1 -
et je mettrai cela maintenant sur la tête -
t support de zéro et de support de moyenne nulle que je vais être la copie
itérative h ici, E-L-L-O. De plus, parce que j'ai fait sur le signe plus
1, barre oblique inverse zéro.
>> Alors maintenant, dans le cas de comparaison-1.c, à la fin, si je imprimer les
capitalisation de t, nous devrions voir que s est inchangé.
Permettez-moi d'aller de l'avant maintenant et je fais cela.
Donc, assurez-copy1.
Dot slash copy1.
Je vais taper bonjour, Entrée.
Et maintenant le constater, seule la copie ont été capitalisés.
Parce que j'ai vraiment deux morceaux de mémoire.
>> Malheureusement, vous pouvez faire quelques jolies mauvaises et très dangereux choses ici.
Laisse-moi ôter jusqu'à un exemple ici maintenant, qui nous donne un exemple de quelques-uns
différentes lignes.
Il suffit donc intuitivement ici, la première ligne de code, int x étoiles, est de déclarer
une variable appelée x.
Et quel est le type de données de cette variable?
Quel est le type de données de cette variable?
Ce n'était pas le cliffhanger.
>> Le type de données est int étoile.
Alors qu'est-ce que ça veut dire? x volonté stocker l'adresse d'un int.
C'est aussi simple que cela.
Y va stocker l' adresse d'un int.
Qu'est-ce que la troisième ligne du Code fais là?
C'est allouer combien octets, le plus probable?
Four.
En raison de la taille d'un int est généralement quatre, malloc de quatre donne
me redonné l'adresse d'un morceau de la mémoire, le premier des octets dont est
stocké maintenant dans x.
>> Maintenant, nous passons un peu vite.
Étoile x veut dire quoi?
Cela signifie aller à cette adresse et mettre ce nombre là-bas?
Mettez le numéro 42 là-bas.
Étoile y signifie aller à ce qui est en y et mettre le numéro 13 là-bas.
>> Mais attendez une minute.
Ce qui est en Y à l'instant?
Quelle adresse est y stocker?
Nous ne savons pas, c'est ça?
Nous n'avons jamais une fois utiliser l'affectation opérateur impliquant y.
Alors, y déclaré sur la deuxième ligne de code est juste une valeur d'ordures, un grand
interrogation pour ainsi dire.
Il pourrait être dirigée au hasard à quoi que ce soit dans la mémoire, ce qui
est généralement mauvaise.
>> Donc, dès que nous avons atteint cette ligne là-bas, étoile y est égal à 13, quelque chose de mauvais,
quelque chose de très mauvais est sur le point arriver à Binky.
Donc, nous allons voir ce qui va se finir passe à Binky ici, dans cette minute
ou alors regarder.
>> [LECTURE VIDEO]
>> -Hey, Binky.
Réveillez-vous.
Il est temps pour le plaisir du pointeur.
>> -Qu'est-ce que c'est?
Renseignez-vous sur les pointeurs?
Oh, goodie.
>> -Eh bien, pour commencer, je suppose que nous sommes allez avoir besoin d'un couple de pointeurs.
>> -OK.
Ce code attribue deux pointeurs qui peut pointer vers entiers.
>> -OK, bien, je vois les deux pointeurs.
Mais ils ne semblent pas être pointant à quelque chose.
>> -C'est vrai.
Initialement, les pointeurs ne sont pas pointer vers quelque chose.
Les choses ils pointent sont appelés pointees, et leur mise en place est un
étape séparée.
>> -Oh, droite, droite.
Je le savais.
Les pointees sont séparés.
Alors, comment voulez vous allouez un pointée?
>> -OK.
Eh bien, ce code alloue une nouvelle entiers pointée, et cette partie fixe x
pour pointer vers elle.
>> -Hé, regarde mieux.
Donc, pour lui faire faire quelque chose.
>> -OK.
Je vais déréférencement du pointeur x pour stocker le nombre 42 dans sa pointée.
Pour cette astuce, je vais avoir besoin de ma magie baguette de déréférencement.
>> -Votre baguette magique de déréférencement?
Euh, c'est super.
>> -C'est ce que le code ressemble.
Je vais régler le nombre, et -
>> -Hé, regardez.
Là il va.
Ce faisant, le déréférencement de x suit la flèche pour accéder à son pointée.
Dans ce cas, pour stocker 42 là-dedans.
Hey, essayez de l'utiliser pour enregistrer le numéro 13 à travers l'autre pointeur, y.
>> -OK.
Je vais juste ici pour y et Obtenez le numéro 13 a mis en place.
Et puis prendre la baguette de déréférencement et juste -
whoa!
>> -Oh, hey.
Cela n'a pas fonctionné.
Dites, Binky, je ne pense pas que le déréférencement y est une bonne idée,
parce que la mise en place du pointée est une étape séparée.
Et je ne pense pas que nous ayons jamais fait.
>> -Hmm.
Bon point.
>> -Ouais, nous avons attribué le pointeur y.
Mais nous n'avons jamais mis à pointer vers un pointée.
>> -Hmm.
Très attentif.
>> -Hé, vous êtes à la recherche bon là, Binky.
Pouvez-vous résoudre ce problème afin que Y des points à la même pointée comme x?
>> -Bien sûr.
Je vais utiliser ma baguette magique de affectation pointeur.
>> -Est-ce que cela va être un problème comme avant?
>> -No.
Cela ne touche pas les pointees.
Il change juste un pointeur pour pointer à la même chose que l'autre.
>> -Oh, je vois.
Maintenant y pointe vers le même endroit que x.
Alors n'attendez.
Maintenant y est fixé.
Il a un pointée.
Ainsi, vous pouvez essayer la baguette de déréférencement nouveau
d'envoyer les 13 plus.
>> -OK.
Voilà.
>> -Hé, regardez ça.
Maintenant déréférencement œuvres y.
Et parce que les pointeurs se partagent que l'on pointée, ils
à la fois voir le 13.
>> -Ouais.
Partage.
Peu importe.
Alors, allons-nous changer de place maintenant?
>> -Oh, regardez.
Nous n'avons plus de temps.
>> -Mais -
>> Rappelez-vous que tous les trois règles de pointeur.
Tout d'abord, la structure de base c'est que vous avez un pointeur.
Et il pointe vers un pointée.
Mais le pointeur et pointée sont séparés.
Et l'erreur courante consiste à mettre en place un pointeur, mais à
oublier de donné un pointée.
>> Numéro deux, pointeur déréférencement commence au niveau du pointeur et suit son
flèche sur pour accéder à son pointée.
Comme nous le savons tous, cela ne fonctionne que s'il ya est un pointée, ce qui revient à
la règle numéro un.
>> Numéro trois, affectation du pointeur prend un pointeur et les changements qu'il pointe vers
Même pointée comme un autre pointeur.
Ainsi, après la cession, les deux pointeurs
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 MALAN: Donc plus sur les pointeurs, plus sur Binky semaine prochaine.
Nous vous verrons lundi.