[MUSICAL] ENCEINTE 1: Salut, tout le monde. Bienvenue à la section. Belle journée out-- qui est pourquoi, je suis Certes, il ya seulement quatre d'entre vous ici et pas notre pack d'habitude. Je l'ai été malade ce week-end. Donc, je ne dois Starburst pour vous les gars. Et je peux commencer la toux terriblement long de cette. Il suffit donc de porter avec moi. Je vais vraiment essayer et passer à travers cette première, si, avant, je dois une attaque de toux. Mais juste être facile sur moi un peu bit-- qui est tout ce que je demande. Donc, notre ordre du jour pour today-- juste un reminder-- votre test est la semaine prochaine. Je vous ai dit la semaine dernière il ne serait pas vous prendre au dépourvu. Donc, je vous rappelle encore une fois. De la semaine prochaine est votre quiz. À cette fin, la semaine prochaine de section sera beaucoup plus de-- Je vais essayer de travailler dans une certaine examen. Donc, si vous les gars pourrait aidez-moi en me faisant parvenir choses que vous êtes à l'aise avec, que vous êtes inquiet au sujet, les sujets que vous aimeriez pour me couvrir, ce serait génial. Donc, je peux essayer de travailler les dans notre section de la semaine prochaine ou vous envoyer du matériel supplémentaire ou préparation que vous ne pourriez pas obtenir ailleurs. Yeah! Plus de gens sont à venir! Je pensais, ai-je fait mal dernier semaine, que personne ne veut revenir? Je ai peur. Ainsi, les trois autres que nous allons passer en revue sont redirection, fichier I / O, et les pointeurs et la mémoire dynamique. Je suis sûr que vous êtes tous super excités à propos pointers-- sujet favori de tout le monde, si simple à comprendre. Je suis sûr que vous avez tous les gars, non? Alors commençons par le commencement, redirection-- ceci est fondamentalement juste un moyen à contrôler la façon dont vous entrée choses dans votre programme, comment vous les choses sortie de votre programme. Les principaux moyens que vous les gars ont été en interaction avec elle est juste tout au long de norme avec votre écran d'impression ici. Mais il ya des façons pipe-- comme nous le voyons ici est l'un de nos genre words-- de conduite que l'information ou que les données dans un fichier à partir d'un fichier. Il est juste des façons différentes de faire avancer les choses dans votre programme et de votre programme, au lieu de il suffit de les imprimer à cet écran ou en saisissant les choses à partir de la ligne de commande. Alors d'abord un peu supérieure à caret. Donc output-- il imprime seulement la sortie un fichier au lieu de l'écran. Donc, si vous aviez quelque chose qui a imprimé "Bonjour, monde!" à l'écran, si vous le mettez à la place à output.text, qui crée ce fichier appelé output.text. Et quand vous l'ouvrez, il va dire "Bonjour, monde!" là-dedans. Cela peut être super utile si vous avez une tonne d'erreurs en fait, comme nous le voyons dans celui-ci. Si vous faites deux caret, ça va imprimer les messages d'erreur. Donc, si vous rencontrez un problème avec compilation, il a beaucoup d'erreurs et vous enlisement en essayant pour faire défiler dans votre ligne de commande par tous les, vous pouvez juste les imprimer dans un fichier, ouvrir ce fichier pour que vous Vous pouvez faire défiler plus facilement. En fait, je l'habitude qu'un beaucoup quand je le débogage mes 181 psets pour l'apprentissage de la machine. Ainsi, il peut être super utile plus tard. Il est également utile si vous avez un programme qui est peut-être la génération d'une bibliothèque ou générer un certain ensemble de chaînes, et vous doivent être en mesure de voir que Ce sont eux générer correctement. Ceci est la façon de le faire. Donc, si vous les imprimer dans un fichier, vous peut plus facilement examiner eux, non? Plutôt que d'essayer de faire défiler à travers la ligne de commande. Et puis une chose à noter est que, avec juste la plus grande de caret, si vous écrivez à un fichier déjà exists-- donc comme si nous avons manqué ce premier temps, nous mettons à output.text, et puis nous avons eu un deuxième programme que ce que le programme imprimé deux et a fait un supérieur à output.text, elle remplace donc that-- remplacer ce qui était toujours en ce fichier pour commencer. Donc, si vous voulez ajouter dans un fichier, comme nous le voyons ici, vous venez de faire deux plus de signes. Et il ajoutera à elle. Il ne l'écrasera pas. Donc, si vous avez besoin d'exécuter plusieurs programmes et le type de garder trace de ce que sont tous les vous rendant dans un fichier, qui est une façon de le faire. Si vous ne vous souciez pas ce qu'il ya dans votre fichier et il est permis d'être écrasé, vous pouvez simplement utiliser un seul supérieur. Cela fait-il sens à tout le monde? PUBLIC: Comme point slash bonjour plus que le texte de points de sortie, comme deux fois, il va juste montrer seulement sur la production texte point un deuxième time-- ENCEINTE 1: Droit. Donc, il serait fondamentalement juste complètement remplacer ce qui était là pour commencer. Si ce fichier ici, la output.text déjà Il existe, en gros ce que vous appelez encore que d'une seule grande que vous pouvez juste y penser que comme il a remplacé le fichier. Comme lorsque vous enregistrez un document Word document et vous ne sauvegarder que, et vous gardez le même nom, et il écrase complètement it-- ceci est la même chose. Quelqu'un at-il des questions sur juste sortie dans un fichier? Impressionnant. Alors, évidemment, si vous inversez le direction de la flèche, il peut faire entrée. Alors, quand vous avez eu comme César ou Visioneer et vous avez eu à l'entrée de quelque chose, vous aviez un argument de ligne de commande en fait ce que l'entrée. Ceci est une autre façon de le faire. Ainsi, au lieu d'attendre pour une invite de commande, comme lorsque vous avez demandé pour votre message dans César ou Visioneer, si vous aviez un fichier texte qui a eu votre message, vous pouvez simplement taper dedans. Donc, si cela était comme point slash César 3 moins de texte d'entrée de flèche, qui est votre message, que irait très bien. Lorsque votre programme César fait demandé pour l'entrée de l'utilisateur, il aurait déjà parce que vous avez tapé dans ce fichier. Voilà une autre façon. Juste un revers de output-- il suffit de saisir vos données. Et puis le dernier est conduite. Donc plutôt cool de celui-ci. Parce qu'il vous permet de prendre la sortie d'un programme et le mettre comme entrée d'un autre programme. Je ne sais pas si l'un de vous joué avec le déchiffrer CS50 qui peut avoir vous donné, mais il serait vous permettent de prendre un certain échantillon déposer, tapez-le dans votre cryptage, puis à partir de là saisir que dans votre décryptage pour vous assurer qu'il est avéré que le même. Donc, il est un peu comme trois voies en boucle. Allez-y. PUBLIC: Si un programme a plusieurs entrées, est-il un moyen de dire ce qui entrée d'utiliser le fichier de texte ou la sortie pour? ENCEINTE 1: Il a de multiples entrées. Quel que soit le déposer votre input-- quand il est pour demander l'avis que la première fois, il est va assumer, je pense, il est aller au tuyau dans l'ensemble du dossier. Donc, si vous avez plusieurs entrées, vous êtes va être conduites dans plusieurs fichiers. Donc, si vous vous demandez messages trois fois dans votre code, vous allez être mise dans trois dossiers différents. Et il devient fou. Et vous ne devriez pas avoir à inquiéter à ce sujet en ce moment. Mais qui est l'idée. Donc oui, tuyau est juste sortie d'un programme utilise l'entrée dans l'autre. Tout le monde il bon? Laisser refroidir. Dáccord. Vous aurez probablement pas d'en faire trop avec elle. Mais vous devez comprendre façons dont vous pouvez l'utiliser. Et il ya des cas qui vous voudrez peut-être utiliser. Donc, je dépose / O- Je sais ce que vous êtes saying-- nous sommes habitués à la lecture de et par écrit à notre écran il, qui est la norme dans et hors norme. Et qui est ce que vous les gars ont été faire depuis le début de la classe ici. Mais vous pouvez également lire et écrire des fichiers, qui est de tous les fichiers I / O- si le fichier d'entrée, sortie est tout ce qu'elle représente. Donc, cela signifie essentiellement que vous pouvez stocker vos données. Quand vous venez d'imprimer à la écran, il est fondamentalement disparu, non? Dès que vous faites "Bonjour monde "et exécuter" Bonjour tout le monde " il affiche "Bonjour tout le monde" à l'écran. Mais vous ne pouvez pas vraiment faire quelque chose avec elle à partir de là. Si vous stockez dans un texte fichier, puis tout à coup vous avez ces données que vous êtes autorisé de manipuler ou de le mettre dans un fichier, ou le mettre dans un programme plus tard. L'une des raisons pourquoi nous le faisons est juste un moyen pour stocker des données pour une utilisation ultérieure. Je dois quelques étapes ici juste marcher dans la norme I / O. Dans la première étape, vous besoin de créer une référence le fichier avec tous bouchons fichier étoile. Cela crée un pointeur vers un fichier. Alors vous voulez ouvrir. Et vous dites, littéralement, juste fichier est égal à la fonction fopen. Et cela va revenir un pointeur vers le fichier que vous venez d'ouvrir. Je l'ai vu un couple de vous gars aux heures de bureau. Mais l'une des choses est pointeurs remember-- peut être une adresse ou nulle, non? Si jamais nous avons un cas où quelque chose peut retourner null, qu'est-ce que nous avons à faire avant que nous utilisons? Nous devons vérifier si il est nul ou pas, non? Parce que certains d'entre vous ont peut-être eu la question où tout objet a été d'être renvoyé en petits groupes était nulle. Vous avez essayé d'effectuer une fonction sur elle. Et votre site informatique défaut. Droit? Je parie que certains d'entre vous peut avoir eu ce problème. Donc, avec fopen, fopen sera soit renvoyer un pointeur vers le fichier, ou si quelque chose va mal, il va retourner null. Donc, vous devez toujours vérifier qu'il n'a pas retourné null avant d'essayer de faire autre chose. Cela ressemble à un paradigme norme que vous allez avoir besoin ici. Si jamais il ya une chance que quelque chose pourrait null, assurez-vous qu'il ne pas avant de poursuivre. Sinon, vous allez pour obtenir de belles fautes site. Et personne ne veut les traiter. Donc, comme nous le voyons ici, le premier argument est juste le chemin vers le fichier. Si ce fichier existe pas, il va créer ce fichier. Et il va juste être vide. Et puis le second argument est le mode que vous voulez. Voulons-nous de lire ce fichier? Voulez-vous écrire de lui? Voulez-vous ajouter? Donc en fait ce que je viens dit-- si existe pas le fichier et vous essayez de lire à partir de , il va lever une erreur. Si le fichier name-- comme si file.text existe pas encore et vous voulez écrire pour cela, il créera un fichier vide appelé file.text pour vous. Et si vous voulez ajouter, vous devriez faire la même chose. Est-ce logique? Si vous essayez de lire un fichier qui ne existe pas encore, il jettera une erreur. Sinon, il va créer le fichier pour faire ce que vous voulez il. Laisser refroidir. Maintenant, nous pouvons lire dans le fichier. Et cela est juste un peu d'aller à travers les différentes fonctions que nous avons pour le fichier I / O. Cette volonté être nécessaire dans l'ensemble de processeurs de cette semaine, si je me souviens bien. Oui, il sera absolument nécessaire dans l'ensemble de processeurs de cette semaine. Donc fgetc retourne le caractère suivant. fgets renvoie juste une ligne de texte. Il reviendra tout à une nouvelle ligne, et il se brisera. Donc fread lit un certain nombre d'octets et les place dans un tableau, qui est quelque chose que vous pourriez voulez faire avec re-size-- pourrait être utile. Combien de personnes ont lu la spécification pset, au fait? Dáccord. [Inaudible] ENCEINTE 1: OK. Bien. Certainement lire that-- il est un ensemble de processeurs plaisir. Vous arrivez à récupérer une mémoire supprimé card-- vraiment excitant quand cela fonctionne. Mais certainement, commencer à lire cela. Venez me parler si vous avez des questions à ce sujet. OK, donc comme je le disais, fread lit un certain nombre d'octets. Voilà un nombre arbitraire que vous allez définir. Et puis fseek seulement se déplace à une certaine position. Alors peut-être vous ne vous souciez pas sur les 10 octets suivants. Vous voulez juste pour avancer. Vous ne vous souciez pas de ceux-là. Vous voulez lire à partir de l'octet 11. fseek vous permet de faire cela. Donc, il vous permet d'être sélectif sur ce que vous lisez. Parce que fgetc, fgets, et fread lecture d'un certain endroit dans le fichier. Une façon de penser à ce sujet est si cette est notre fichier, lorsque vous ouvrez pour la première, vous avez cette position dans le fichier qui commence au début. Chaque fois que vous appelez fgetc, fgetf, ou fread, il va commencer à partir de cette position marqueur. Disons que vous voulez juste lire cette partie de la mémoire ici. Vous ne pouvez pas appeler juste. Vous devez chercher ici et puis lire à partir de là ou lire, obtient, ou getc, en fonction de ce que vous voulez. Donc chercher vous permet juste de sauter des parties de la mémoire. Et qui est la seule Ainsi, vous pouvez sauter les choses sans les lire dans votre tampon. Cela fait-il sens à tout le monde? De toute évidence, il ya une beaucoup de ici-- parallèle notre redirection sortie ou d'entrée, vous avez lire et à écrire. Donc fputc écrit juste un caractère dans le fichier. fputs écrit une ligne. Fprintf imprime une sortie formatée. Donc si vous avez des onglets, ou l'espace, ou autres joyeusetés. Et puis fwrite écrit quelques tableau d'octets dans un fichier. Voilà donc la même manière fwrite et fread sont analogues fgets opposites--, fputs, et puis beaucoup fputc et fgetc-- des fous, des choses rapides. Tout type de conserver cette handy-- vous aurez des moments différents où peut-être vous voulez juste un caractère à la fois. Peut-être que vous voulez une ligne entière. Avec votre dictionnaire pset-- qui est à deux psets, Je crois, nous vous donnons un ensemble dictionnaire dans un format de texte qui a chaque mot séparées par une ligne. Donc, si vous voulez lire en un mot à la fois, que pourriez-vous utiliser si vous lisez et ils sont tous séparés sur de nouvelles lignes, et vous voulez juste un mot à la fois? Public: fgets ENCEINTE 1: Droit. Fgets-- parce que renvoie tout ce qui est sur la même ligne. Et si chaque mot est son propre ligne, nous pouvons utiliser fgets. Laisser refroidir. Cela fait-il sens, tout le monde? Cool? Oui, nous allons arriver à la partie la plus amusante avec des pointeurs très bientôt, où vous arriver à faire un peu de maths. Et il va être génial. Dernière step-- fermer votre fichier. Avec tant de choses ici, l'un de nos paradigmes est si elle peut revenir null, null vérifier. Si vous ouvrez quelque chose, vous feriez mieux de la fermer. OK, si vous n'êtes pas terminé jusqu'à ce que vous êtes fait, sauf si vous avez fermé il. Un peu comme il est pas fini jusqu'à ce que la grosse dame chante. Voilà comme la fermeture de votre fichier. Comme il est dit ici, juste pour rappel, toujours ouvrez votre fichier avant que vous soyez lecture ou l'écriture il. Et toujours la fermer si vous avez ouvert. Bien? Laisser refroidir. Alors, voici un exemple. Donc tiny-- Je ne sais pas si vous les gars peuvent voir très bien. Si seulement nous pouvions augmenter la luminosité d'une certaine manière. Permettez-moi de réellement le faire si je le peux. OK, les gars vous ne pouvez pas vraiment voir que tout, pouvez-vous? OK, nous allons le faire, alors. [Inaudible] Je suppose que cela est beaucoup mieux à voir. Quelqu'un peut-il voir où mon souris a est la question? Ah, là, il est-- quelles luttes! Dáccord. Fondamentalement, les gars doivent avoir genre d'une idée de ce que cela fait. Il est pas parfait. Mais je préfère expliquer que passer plus de temps à essayer de le formater correctement. Fondamentalement, comme vous le voyez ici, nous commençons par ouvrir le fichier. Et nous avons une certaine fichier de base de données que nous sommes ouverture qui dit que ce sont nos étudiants. Et nous allons écrire. Alors bien sûr, null. Donc, nous devons vérifier pour nulle. Et puis si il est pas null, nous passons par. Et comme vous le voyez, nous sommes une boucle à travers ici. Il ya des étudiants. Les étudiants sont hachage définie comme trois. Et ce que nous faisons est que nous sommes imprimer le fichier, non? Alors qu'est-ce qu'on imprime sur notre fichier? PUBLIC: Les scores qui sont dans le tableau? ENCEINTE 1: Ouais. Les scores qui sont en la array-- exactement. Donc, nous ouvrons cette fichier de base de données, qui Je suppose, est une sorte de la base de notes. Et nous ne faisons que l'impression de la scores de chaque élève à ce fichier. Cool? Bon. Impressionnant. Dáccord. Revenons to-- PUBLIC: Je voudrais poser une question rapide. Est ce que le printf pas dans la boucle? Voilà juste dans la boucle si? ENCEINTE 1: Non, il est dans la boucle. Je ne peux pas voir ma souris très bien ici. Donc, je suis mal à format correctement. Ce support devrait avoir disparu. Il devrait être ici. Ceci est ce qui est dans votre boucle. Là. Maintenant, il est joli. Voilà donc comment il devrait être: sauf pour ce dernier support que je licenciés. Dáccord. Cela fait-il sens à tout le monde? Dáccord. Nous allons passer à autre chose à la prochaine chose alors-- qui, en fait, vous allez avoir besoin de voir le code. Donc je vais juste copier que sur le moment. Dáccord. Donc, je vais vous montrer les gars ce code. Et je veux que vous essayer de comprendre ce qu'il est censé faire. Donc, étant donné that-- prendre une minute ou deux. Essayez de comprendre ce qui se passe ici. Toutes les idées? Nous savons que nous avons au moins deux arguments dans la ligne de commande, pas vrai? Je suppose que l'un des qui va être que [inaudible] de notre programme est et puis quelque chose d'autre. Parce que si [inaudible] est moins de deux, nous crions après eux. Droit? Et de l'usage, il semble que ça va être une sorte de fichier. Nous sommes tous d'accord? Alors maintenant, quelle est la boucle faire? Qu'est-ce que ça va à travers? Public: Tous les fichiers. ENCEINTE 1: Exactement. Il va à travers tout le fichiers que nous avons entrée il. Ainsi, pour chaque fichier, il est ouvrir une chaîne de caractères il. Il est d'ouvrir ce fichier. Droit? Et il est lu de lui. Bien sûr, vérifier si elle est nulle. Et puis il a l'impression. Si elle est nulle, il est juste de nous dire que ce ne est pas un fichier qui existe. Parce que souvenez-vous, avec lire notre fichier doit exister. Droit? Avec écriture et append, vous pouvez vous en sortir avec elle. Mais en lecture, notre fichier doit exister. Et puis, si elle existe, que faisons-nous ici? Disons simplement Commencez ici. Qu'est-ce do-- ce premier caractère. Que faut-il faire? Il obtient un caractère, non? Quel est donc ce fait? Il devient le premier caractère. Tout le monde sait EOF? PUBLIC: Fin de fichier? ENCEINTE 1: Fin de file-- exactement. Donc, ça va passer par l'ensemble du dossier, non? Et puis il va mettre à jour par obtenir chaque caractère suivant. Droit? Et que fait-il? PUBLIC: Mettre que in-- ENCEINTE 1: gravures putchar à votre écran de veille. [Inaudible] le caractère. Et puis, quand il [inaudible] cette ferme le dossier. Public: Avez-vous pas besoin d'un [? d'autre? ?] ENCEINTE 1: Pas nécessairement. Je veux dire, il est une sorte de sous-entendu dans cette. Parce que cela renvoie, cependant, aussi longtemps que cela ne rattrape pas cela, vous êtes très bien. Je veux dire qu'il est probablement bon pratiquer à faire une autre. Mais une autre ne sont pas toujours nécessaire en particulier si vous avez quelque chose comme un retour, qui signifie que dans ce cas, si il attrape il, votre programme va se terminer et ce ne sera jamais arriver à cela. Il est plus dans le cas où vous êtes pas nécessairement quelque chose de retour. Parce que si cela n'a pas été tout retour, cela voudrait dire que si cela était vrai, le reste de ce serait encore fonctionner. Et dans ce cas, vous voudrait un faux. Si elle est de retour, et La fin de votre programme, un autre est pas nécessaire tout le temps, en fonction du contexte. Jacob, avez-vous une question? PUBLIC: Ouais. Il en va de fgetc obtenir le caractère suivant? Comment augmenter le caractère? ENCEINTE 1: Ouais. Donc fgetc obtient le caractère suivant. Vous pouvez penser comme C ++ dans un sens. PUBLIC: Alors quelle est EOF? ENCEINTE 1: EOF est la fin du fichier. Il est juste un marqueur qui vous permet de savoir que vous êtes à la fin de votre fichier. Donc, cela va imprimer à votre sortie standard. Et puis il va fermer le fichier quand il est fait. Et puis passons à le fichier suivant, non? Donc dans l'ensemble, qu'est-ce que le programme fait? [Inaudible] ENCEINTE 1: Ouais. Il se contente d'afficher tout ce qu'il ya. Donc CAT si vous les gars avez déjà utilisé et puis le nom de certains file-- Je ne sais pas si quelqu'un d'entre vous ont jamais fait sur votre terminal. Mais si jamais vous utilisez la commande CAT-- C-A-T-- et alors tout fichier vous avez there-- il l'imprime sur votre terminal, qui peut être super pratique pour certaines choses. Je l'utilise beaucoup. Cela fait-il sens à tout le monde? Cool? OK donc votre tâche maintenant-- soit par vous-même ou avec les gens autour vous-- est à juste écrire un programme simple qui va juste écrire "Bonjour, monde!" dans un fichier. [Inaudible] [Inaudible] ENCEINTE 1: je me suis dit, ne Je fais cette semaine mal passée? Je ne pensais pas qu'il était si mal que ça. Je suis heureux que vous soyez tous ici. Il me rend vraiment heureux. Je suis une fille de plaisirs simples. Je viens aime quand ma section assiste. Donc, je suis juste cela a commencé pour vous les gars pour que nous puissions code ensemble. Je ne veux pas mettre n'importe qui sur l'endroit, sauf si vous voulez être. PUBLIC: Pour le test, faire nous devons écrire un programme? ENCEINTE 1: Vous pouvez être invité à écrire des programmes simples à la main. Ouaip. AUDIENCE: Le quiz est la semaine prochaine, non? ENCEINTE 1: Le quiz est mercredi prochain. Cela signifie qu'il ya une belle [? CST?] classement parti après, qui signifie que vous obtiendrez vos scores retour que night-- à quelle heure? Qui sait? Mais ce sera cette nuit-là. Bien. Comment voulons-nous commencer ce? Je vais vous donner un début de hint-- avec cela. Public: Vous devez ouvrir un fichier. ENCEINTE 1: Ouais. Alors qu'est-ce que vous voulez appeler cela? Voulez-vous juste de l'appeler "fichier"? Faisons facile. Donc, ce qui est notre fopen-- test de sortie va être? Appelez-le «Bonjour». Et quel est notre mode actuel? Que faisons-nous à ce dossier? PUBLIC: Lire. Rédaction. ENCEINTE 1: Nous écrivons à elle. Belle. OK, donc nous avons maintenant ce fichier. Que devons-nous faire? PUBLIC: vérifier si elle est nulle. ENCEINTE 1: Vérifier si elle est null-- exactement. Voilà ce que je veux entendre. Cela devrait être automatique, en particulier à peu près à partir de ce moment-là. Si vous commencez segfaulting, vous avez probablement n'a pas vérifié pour nulle part. Neuf fois sur dix, qui est va être votre erreur. Donc, si vous pourriez obtenir dans le habitude, toujours vérifier si elle est nulle, votre vie va être agréable et easy-- ou plus facile. Afin de vérifier pour voir si elle est nulle. Donc, si il est pas nul, ce qui est ce que le coup est égal à désigne: pas null-- il est valable. Que voulons-nous faire? Nous voulons simplement imprimer à ce fichier, non? Alors qu'est-ce qu'on va utiliser? PUBLIC: fprintf ENCEINTE 1: Fprintf-- belle. Et fprintf prend deux arguments-- où il va et ce que nous voulons imprimé. Alors, quel est le premier? Où est-ce qu'il va? PUBLIC: Fichier. ENCEINTE 1: Il va déposer. Et que voulons-nous imprimé? "Bonjour, monde!" Bien. Nous avons une dernière chose-- un autre grand paradigme ici. PUBLIC: Fermer. ENCEINTE 1: Fermer. Là vous allez. Public: Est-ce qui se passe si le fichier est nulle? ENCEINTE 1: Non, cela est si elle est non nulle. PUBLIC: Oh, si elle est pas-- OK. Pour la fonction fopen et puis la deux arguments qui vont à l'intérieur, qu'est-ce que le premier argument signifie encore? ENCEINTE 1: L'argument est tout comme le nom du fichier que vous voulez aller. Donc, après ce court, vous le feriez avoir un fichier appelé "bonjour" qui avait "Bonjour, monde" en son sein. Ce est tout. Rien que le nom. Public: Et comme il est écrit, le fichier ne doit pas exister déjà. Est-ce que vous avez dit? ENCEINTE 1: Droit. Exactement. Si "Bonjour" comme un fichier ne sont pas encore réunies, il est va créer un fichier appelé Bonjour "et écrire pour vous. PUBLIC: Quand vous dites le programme écrit dans le fichier, Pourquoi écrivez-vous "fichier" au lieu de le nom du fichier et fprintf-- ENCEINTE 1: Parce que dans ce cas, nous avons que grand FILE-- tout en étoiles caps--, déposer. Donc, il est un pointeur vers le fichier que vous parlez. Ceci est la façon que nous nous référons seulement à elle. Donc dans ce cas, vous peut penser aha file--, nous pouvons utiliser this-- fichier ici se réfère à l'ouverture du "Bonjour" et de le laisser écrire. PUBLIC: Pourrions-nous mettre un "Bonjour" au lieu [? de juste?] -f fichier? ENCEINTE 1: Non, parce que "Bonjour" doit être ouvert et accessible en écriture. Déposer ici est comme un indicateur qui dit OK, nous avoir cette hello-- file-- que nous cherchons à. Il a été ouvert. Et nous allons écrire. Si vous utilisez juste "Bonjour", qui est encapsulé dedans. Cela va donc à paniquer. Je veux dire, vous pouvez l'ont nommé. Vous auriez pu faire fichier, étoiles, "Bonjour", est égale à celle. Mais toute la question est que vous besoin d'un pointeur fichier étoile afin pour pouvoir utiliser ces fonctions. Public: Pourriez-vous faire fichier, étoiles, fichier, "Bonjour" ou que vous avez à mettre déposer étoiles, fichier par elle? ENCEINTE 1: Vous pourriez faire fichier, étoile, "Bonjour." Vous pouvez changer cela en le nom que vous voulez. Il est tout à fait arbitraire ce qui appelle. Vous pouvez nommer n'importe quoi. Nommez-spaghetti volant, si vous voulez. Public: Qu'est-ce que le "w" entre guillemets pour? ENCEINTE 1: Le "w" est juste le mode. Nous avons donc écrit à ce fichier. Tout le monde bien? Effacer? Oui. Public: Alors, quand il écrit cette Fichier, où trouvons-nous alors ce fichier? ENCEINTE 1: Ce sera dans le même répertoire que vous êtes actuellement. Si vous êtes dans pset trois et vous exécutez ce, au sein de votre pset trois dossier va être ce fichier appelé "Bonjour." Cool? Tout le monde bien? Je me sens comme vous êtes tous obtenir, ce qui est excellent. Dáccord. Donc, retour à ma diapositive show-- Je l'aime quand les choses fonctionnent. OK, pointers-- vous les gars sont excités? Les pointeurs sont grand. Ils prennent un peu pour envelopper votre tête autour. Ceci est ma deuxième année pointeurs d'enseignement. Et je pense que je l'ai finalement obtenu. Donc, si vous avez du mal, il est OK. Comme je le disais avant, dessiner des images aide beaucoup de choses dans CS, autant que je pense que les gens ont tendance de penser oh, nous sommes à un ordinateur. Nous devrions simplement le code. No-- dessin photos va vraiment vous aider. Et je vous encourage vraiment à puiser dans votre côté école maternelle et de faire ressortir les crayons ou marqueurs et tirage au sort. Parce que cela va vous aider. Et si vous me voyez pendant les heures de bureau, je seront porter autour des piles de papier avec des stylos dessin choses. Donc, en particulier avec pointers-- dessiner. Et je suis sûr que nous allons en fait être tirer quelques photos ici aussi. Alors vous les gars ont tous eu à voir Binky, cette chose de pâte à modeler cool. Et nous pensons qu'il est vraiment drôle quand il explose en un tas de morceaux. Il est certain soulagement comique pour la classe. C [inaudible] ce grand capacité pour être en mesure de contrôler la mémoire. Et il est l'une des choses qui comptent vraiment rend un tel langage puissant. Mais avec une grande puissance vient grande responsabilité. Et des choses folles peuvent arriver si vous ne faites pas attention. Ainsi, lorsque vous utilisez pointeurs, vous voulez faire que vous comprenez vraiment exactement ce que vous faites. Espérons que le prochain peu de temps vous aidera à comprendre vraiment pointeurs, comment les utiliser, et la façon de les manipuler. Donc memory-- Je suis sûr que nous avons vu ce schéma avant. Donc, ceci est un simple schéma de comment les choses pourraient être stockés mémoire. Donc, vous avez essentiellement ces d'énormes ensembles de blocs d'un octet est ce que nous avons ici-- légère incrémente de un à chaque fois. Ceci est en hexadécimal [inaudible] donc blocs de huit bits. Et chaque bloc est associé avec une certaine adresse hexadécimale. Donc si jamais vous voyez le 0x, qui est juste notation de qu'il est une adresse hexadécimale. Vous pouvez supposer que cela signifie Une adresse dans la mémoire. Nous parlons des adresses mémoire chaque fois que vous voyez hexadécimal. Nous avons ints sont des variables, flotteurs sont des variables qui stockent. Donc ints ints de magasins. Magasin flotteurs flotteurs. Donc, nous avons aussi des pointeurs que les adresses de mémoire de stockage. Voilà une sorte de cartographie. Les pointeurs sont exclusivement pour des adresses de mémoire. Voilà donc comme le type là-bas. Votre appareil est en 32 bits, ce qui signifie que votre adresse de mémoire est de quatre octets. Ainsi, tout pointeur que vous avez va également être de quatre octets. Ou bien si elle est de quatre octets, la mémoire est de quatre octets. Pointeurs mémoire de stockage. Par conséquent, ils sont quatre octets. Cool-- veux juste que renforcer. Vous devriez obtenir cette BD maintenant. Je ne sais pas combien d'entre vous sont fans xkcd, mais je aiment xkcd. Ce est super. Bien. Créant ainsi pointers-- comme je le disais, il est à peu près comme tout le reste. Vous avez un type. Vous avez un nom. Droit? Voilà ce que nous avons là. [? Hex?] Étoiles signifie qu'il est un pointeur, et puis tout ce que vous voulez l'appeler. Ainsi, le type représente ce que vous pouvez stocker. Bien? De la même manière que si nous faisons ints, nous savons que nous stocker un int il. Avec un pointeur, il détient une adresse mémoire. Mais ce que cela signifie est that-- voici où un dessin va être utile. Donc dans ce cas, nous avons certains value-- disons quatre. Quatre est à une adresse. D'accord? Cela signifie ici une première qu'il est un 2x pointeur. Droit? Il est certain pointeur x. x peut être quelque chose, peu importe. Quel que soit x est-- dire x est de quatre. Il va stocker le adresse mémoire ici. Donc int, étoiles, x-- cela est une autre fente dans memory-- qui sait ce qu'il en est. Mais il va enregistrer une adresse ici. Donc, ce serait like-- dans ce cas, peu importe, est stocké à tout ce qui est stocké 0x1-- à l'adresse que notre pointeur contient, doit correspondre avec ce que nous avons désigné. Ainsi, au 0x1, dans ce cas, cela est x. Ce ne peut être que d'un int alors que nous sommes en utilisant ce. De même, si nous avons 1a autre, quel que soit adresse est stockée avec un y a être une même chose char-- avec z. De la même manière, chaque fois que vous essayer de faire INTX est égal à 0,4, il va crier à vous et être comme non, vous avez dit que vous vouliez un int. Ce système est censé être un int. Arrêtez d'essayer de faire un flotteur. Alors que les choses soient ce qu'ils veulent être. Laissez les choses eux-mêmes. Donc grand chose est juste quel que soit le type de pointeur il est, qui est la seule chose que vous pouvez y stocker. D'accord? Avec la pratique, comme la semaine dernière, tout semble vraiment une sorte de résumé. Nous allons faire un peu de pratique. Il devrait être plus compréhensible. Donc, le référencement et dereferencing-- il est vraiment important pour obtenir ces droits. Je dois encore rafraîchir de temps en temps. Et je suis comme attente, dont un que je veux? Donc, l'esperluette sera effectivement donner vous la référence ou l'adresse de. Donc, il renvoie l'adresse de mémoire de la variable qui est stocké. Donc, il va effectivement revenir à vous hexadécimal, alors que déréférençant qui se passe réellement à vous donner les données qui y sont stockées. D'accord? Donc, nous allons regarder un exemple très vite, ou en fait à côté. Dáccord. Donc, nous devons penser vraiment soigneusement à ce sujet. Nous avons donc ici un entier x. Je vais essayer de dessiner ce sur au mieux de mes capacités. Nous allons donc avoir cette fente x. Et il est le stockage de cinq ans. Son adresse est 0x4. Cool? Toutes les bonnes. Nous avons donc maintenant ce pointeur. Il était ici. Et l'esperluette nous donne l'adresse de quelque chose. Donc, dans ce cas, il est l'adresse de x. Quelle est l'adresse de x? 04-- et ce pointeur est à 0x08. Cool? Ainsi, vous pouvez penser à cette pointeur, 04, fait un peu plus ici. Et ils sont appelés pointeurs parce que nous aurons plus dans cette, vous allez voir pointer des choses. Et un bloc pointant vers un autre bloc fera beaucoup plus de sens. Voici donc deux. Et puis nous avons un peu copie, qui est 0x0c what--. Et il va déréférencer notre pointeur. Donc, ce qu'il dit est OK, voici notre pointeur. La valeur qu'il stocke est 0x04, et ce il est dit est d'aller à cette adresse et dites-moi ce qu'il ya dedans. Voilà donc efficacement ce cette flèche fait. Vous pouvez penser ce que votre étoile. Alors OK, quand nous faisons étoiles, cela signifie suivre. Allez à cette adresse. Et qui est fondamentalement juste après cette flèche pour ce morceau de mémoire. Et nous donner ce qu'il ya dedans, qui est de 5. Voilà pourquoi notre copie est égal à 5. Est-ce logique? Est-ce que quelqu'un a besoin de moi à passer par que de nouveau, ou plus lentement? Vous voulez que je vais à travers elle une fois de plus? Dáccord. Nous allons redessiner à nouveau. Quand nous commençons, nous sommes tous d'accord que nous avons certains morceau de mémoire qui est une variable x que nous avons mis égal à 5. Nous ne contrôlons pas où il est dans la mémoire. Donc, cet endroit est juste attribué arbitrairement. Il bon? Dáccord. Puis on initialise un pointeur vers un int. Voilà pourquoi il est permis de pointer vers x parce que nous avons un int ici. Nous avons un autre morceau de mémoire parce que ce pointeur est une variable comme tout le reste. Il est attribué arbitrairement un peu d'espace dans la mémoire. Et ce qu'il stocke l'adresse de x. Ampersand signifie l'adresse de x. Alors, quelle est l'adresse de x? PUBLIC: Il est zero-- ENCEINTE 1: 0x04. Donc alors-- dernier. Nous avons quelques copy-- nouveau juste une autre variable. Donc, nous allons assigner un endroit arbitraire. Et nous déréférencer notre pointeur. Signifie l'étoile aller à la L'adresse est stockée dans mon pointeur. Dites-moi ce qui est là. Donc, l'adresse stockée dans notre pointeur est 0x04. Donc, nous allons à cette adresse. Il pointe vers cette adresse. Ce qui est à l'intérieur de ce bloc de mémoire? Il est cinq. Voilà ce que nous attribuons notre copie. Tout le monde bien? Laisser refroidir. Photos Again--. Ainsi le suivi des valeurs ici-- je suis vais laisser vous en pensez à ce sujet. Nous pouvons tirer une autre image. Mais je veux que vous essayiez et la raison à travers ce sur votre propre pendant une minute. Comme ils ne donnent nous un exemple d'adresse, Je vais juste faire x-- esperluette qui devrait aider à conduire à la maison. Ampersand moyens d'adresse. Ainsi, dans le premier, chacun aller à la première ligne. Certains x de five-- un certain ensemble fente aléatoire dans la mémoire. Star Pointer Int est égal à l'adresse de x, non? Int pointeur étoiles crée ce bloc, l'appelle pointeur, et il assigne à l'adresse de x. Je suis terrible à esperluette. Maintenant, ce que nous faisons est que nous disons OK, déréférencer notre pointeur. Donc, nous allons OK, ce qui est en notre pointeur? Il est esperluette x. Aller à esperluette x et réaffecter. Alors maintenant, esperluette x va être 35. Donc, fondamentalement, lorsque vous êtes déréférencement, vous allez OK. Vous allez être le dessin photos comme celle-ci. Vous allez être le dessin vos flèches plus où il est. Alors, allez à cet emplacement dans la mémoire et soit me donner cette valeur de retour, ou le modifier. Dans ce cas, parce que nous sommes à ce valeur, nous assignant à 35. Alors que dans le dernier un, si vous remarquez, nous ont été attribuant ce qui était ici à quelque chose d'autre. Donc, ils ont ce tableau impressionnant. Il est pas si mal. Les gars, vous travaillez dessus. Je vais dessiner sur la planche. Nous allons remplir ensemble, OK? Alors prenez un peu de papier, grab un partenaire, de commencer à travailler. Je vais me faire un plus gros morceau de craie. Parce que ça va être beaucoup. Dáccord. LE PROFESSEUR: OK. Commençons par la première rangée. Nous allons commencer par là, puis vous les gars peut peut-être travailler un peu plus à travers. Dáccord. a est égal à b fois c Alors, quelle est une? Il est pas une question piège, je le promets. L'ÉLÈVE: 4 fois 5. LE PROFESSEUR: 4 fois 5. 20. Alors, quel est b? L'ÉLÈVE: 4. LE PROFESSEUR: Et c? L'ÉLÈVE: 5. LE PROFESSEUR: 5. Et puis ce va juste être un esperluette, esperluette b, c esperluette, non? Pas mal. Il est assez simple. Dáccord. Ainsi, la suivante. A est égal à une fois c, dans le cas personne ne connaissait pas cela. Tout le monde est familier avec le temps est égal? OK, tout cela désigne: ceci est raccourci pour une fois c est égal à un. Vous pouvez aussi le faire avec la division, avec l'addition, la soustraction. Vous pouvez faire un égal, ou un plus égaux c signifie un égal un plus c, une moins égal c serait égal à un moins c. Il est juste un sucre syntaxique. Donc, dans ce cas, a est égal à une fois c seraient-nous ce que donner? Encore une fois, pas une question piège. L'ÉLÈVE: 100. LE PROFESSEUR: 100. Est-ce que quelque chose d'autre a changé? Non. Peut-être que je vais enfin obtenir mieux à mes esperluette. L'ÉLÈVE: OK, désolé, comment avez-vous 100? LE PROFESSEUR: OK. Ainsi, a est égal à un c fois, donc une fois c. L'ÉLÈVE: Oh, vous utilisez un pour le previous-- LE PROFESSEUR: Oui. Donc, ce sont nos valeurs les plus récentes. Ce sont ce que vous devriez être l'aide que nous nous dirigeons vers le bas, OK. Ainsi, b est la seule chose qui change, non? Donc, nous allons remplir à tout le reste. B. Quel est b va être? Pour être ou ne pas être. Quel est donc ce fait? Quelle est la star pa faire? L'ÉLÈVE: Code de l'emplacement de pa. ÉTUDIANT: Non, pas tout à fait. Donc, ceci est une référence d. Etudiant: Ainsi b est la valeur équitable de pa. LE PROFESSEUR: Oui, si pa est l'adresse d'un, non? Ainsi, il est dit aller à l'endroit où a est stockée et lui donner cette valeur. Alors, quelle est b? L'ÉLÈVE: 100. LE PROFESSEUR: 100. Parfait. OK, donc pc est ce qui est en train de changer. Tout le reste demeure le même. Qu'est-ce pc va être? Une simple affectation. Pc est égale à pa, et ce qui est pa? L'ÉLÈVE: Ampersand un. LE PROFESSEUR: Parfait. Maintenant, nous obtenons intéressant. OK, nous allons briser celui-ci vers le bas. Tout d'abord, ce qui est b fois c, parce que ce la partie la plus facile de celui-ci, non? B fois c est-- L'ÉLÈVE: 500. LE PROFESSEUR: Ouais, donc ce qui est un fait ce, Si elle est pb étoiles, ce qui change? L'ÉLÈVE: Quel est dans the-- LE PROFESSEUR: Qu'est-ce en b? L'ÉLÈVE: Quel est dans l'espace que pb pointe. LE PROFESSEUR: Et PB pointent to-- L'ÉLÈVE: B. LE PROFESSEUR: B. Donc, la seule chose qui change est b, à droite. Donc b fois c, 500. Voilà donc ce qui change maintenant. Laisser refroidir. Belle. Vous faites grand. Tout droit, brisant celui-ci vers le bas. C est en train de changer, non? Ainsi, nous pouvons remplir tout le reste. Voyons. Dáccord. On sait que c va être le produit de deux nombres, non? Quelles sont les deux numéros, si? L'ÉLÈVE: A et C? LE PROFESSEUR: Donc un est droit pour le premier. Nous sommes donc d référencement p d'un, non? P d'un point à un, donc nous savons que cela va être 100 fois quoi? Fois ce qui ne le point de pc à? Points à une. Ainsi, 100 fois 100 est 10000. Est-ce que cela a un sens? Laisser refroidir. Dernière ligne droite, les gars, dernière ligne. Dáccord. Ce qui change ici? L'ÉLÈVE: A. LE PROFESSEUR: A. parfait, tout le reste peut rester le même. Dáccord. Et ce qui est une? Donc, il ya une fois quoi? Ceci est pb étoiles. Donc pb étoiles signifie ici est pb, les points pb à b. L'ÉLÈVE: 500. LE PROFESSEUR: 500. Nous avons donc 500 fois 100. Voilà 50.000. Ouf! Regardez ça. ÉTUDIANT: Pourquoi avons-nous le & c pour la last-- LE PROFESSEUR: Désolé. L'ÉLÈVE: Oh, OK. LE PROFESSEUR: My bad. Beaucoup d'écriture. Tout le monde bien? Pas trop mal, non? Faut juste un peu tandis que de travailler à travers. Si vous le décomposer, comprendre ce que chaque partie se réfère to-- comme avec tout ce qu'il est, yes-- décomposer à la petite problèmes et puis recombinent, et vous pouvez faire des trucs super. Il ya les réponses, mais nous l'avons fait. L'arithmétique des pointeurs. Ah. Mes mains sont toutes calcaire. Ainsi, en ajoutant ou en soustrayant int ajuste le pointeur par la taille du type de pointeur. Rappelez-vous comment tous les types a une taille différente? Donc, comme un double ou un long long est- huit et int est de quatre, mais l'omble est un. Donc ce que vous voulez faire est-- une chose à retenir est juste que combien votre valeur du pointeur change réellement dépendra de la type de pointeur, il est. Tout le monde bien avec ce? Puis-je effacer? Nous sommes bons? Impressionnant. Donc, si nous avons un pointeur that-- cela va être-- je suis va faire un pointeur int. Il stocke ce. Si vous deviez dire pointeur plus un, ce qu'il va faire est il va mettre à jour par la taille d'un int parce que ce la type de pointeur, il est. Avec C, tout est très strict et réglementé. Le pointeur int va mettre à jour par la quantité d'espace int prendrait. Un int est de quatre octets. Alors qu'est-ce que ce transformer en? Vous êtes juste en ajoutant quatre sur cette. Maintenant, votre pointeur se être-- OK. Donc, si elle était char et nous avons fait pointeur plus un, quel serait-il maintenant? Si il started-- prétendant nous started-- maintenant il est 0x08. Disons maintenant que ce fut une carboniser pointeur, et nous avons ajouté un. Que faudrait-il changer pour? Combien d'octets est de type char? PUBLIC: Un. ENCEINTE 1: One. Auditoire: Alors 0x09. ENCEINTE 1: Il serait donc neuf. Il suffit donc de quelque chose à retenir. Juste au moment où vous ajoutez un, il est pas l'ajout d'un moins que ce soit un produit de carbonisation. Il est l'ajout combien octets type que ce soit, qui est pourquoi nous avons cette équation ici. Il est donc temps int la taille du type de pointeur. Donc, nous avons l'exemple ici. y a été affecté à cette valeur, 0x4, quand nous avons fait plus de y est égal à un. Qu'y at-il, ce qui est en x, ne change pas. Qu'est-ce que le changement est ce qui est dans y. L'adresse stockée dans Y mise à jour en quatre parce qu'il ya quatre octets dans un int et il est un pointeur int. Bien. Nous avons donc maintenant un autre exercice. Donc la question est ce qui sera imprimé. Toutes les idées? AUDIENCE: Le nombre de personnages de chat heureux? ENCEINTE 1: Exactement. Donc, comme avec votre chaîne. Est-ce que tout le monde vous cela? Voulons-nous de marcher à travers elle? Oui, OK. Donc, ce que nous avons ici-- je comme ce d'autant plus. Je n'ai pas à [Inaudible] ridiculement. Donc, nous avons notre chaîne ici, chat heureux. Belle. Nous avons une certaine compteur nous gardons la trace. Nous avons donc une certaine char * pointeur que tout est réglé égal à Str. Qu'est-ce que ce fait est qu'il est attribuer certains pointeur au début de votre chaîne. Parce que je suis sûr que, comme il il a été mentionné dans la leçon, nous vous avons donné ce gars type de données appelé chaîne. Mais vraiment chaînes sont juste un tableau de-- comme char *. Il est un pointeur sur un tas de personnages qui sont contiguës dans la mémoire. Donc, cela crée seulement il égal à une chaîne est identifié par où Le premier caractère est. Donc, cela est couchait un certain point égal au début de la chaîne. Tout le monde il bon? Laisser refroidir. Donc, ce déréférencement est notre pointeur. Donc, il va vraiment nous donner une certaine valeur ici, dans notre chaîne que nous parlons. Et nous disons aussi longtemps que il est pas terminaison nulle. Donc, continuez jusqu'à ce que vous obtenez à la fin de la chaîne. Mettez à jour votre pointeur par un. Donc r, il sera effectivement mise à jour par un à chaque fois parce que cela est un char, le char *. Donc ça va passer. Il va mettre à jour. Donc, la première fois cela va, il va être ici à h. Il va mettre à jour. Ce sera un un. Ça va être un p, y, et ainsi de suite et ainsi de suite. Nous mettrons à jour compteur. Quand il atteint la fin, il imprime à quel point il est obtenu. Oui. PUBLIC: Ce compte l'espace comme un seul, non? Dáccord. ENCEINTE 1: Pensez donc. Est-ce une question-- PUBLIC: [inaudible]. ENCEINTE 1: Pas de soucis. Ce que je fais. Très bien, alors une chose que je comprendre est que, avec un tableau, vous pouvez aussi le traiter comme un pointeur car les tableaux ne sont que taches continues de mémoire. Ainsi, vous pouvez traiter de la même façon. Vous pouvez les manipuler avec des pointeurs, trop. Ainsi, au lieu de faire, dans ce cas, la chose analogue serait gamme 0 est égal à 1. Mais de la même façon que une chaîne est déterminée par le début de l'endroit où Le premier caractère est, un tableau est déterminée par où son premier élément est. Parce que nous savons, nous sommes garanti, que ceux-ci vont être continu des blocs de mémoire. Voilà ce que nous permet de faire cela. Nous savons qu'ils sont en continu des blocs de mémoire. Donc dans ce cas, par le déréférencement juste tableau, qui nous dit, OK, aller au début de votre tableau, ce qui est ici. Ainsi, vous pouvez régler égal à un. Et dans ce cas, quel que soit votre choix type est, lorsque vous mettez à jour un, qui est comme la mise à jour pour l'index suivant. Vous pouvez le faire parce que vous savoir ce qui est dans votre tableau. Donc, il sait combien de mettre à jour votre pointeur par, quelle adresse le mettre à jour afin de que vous êtes à l'emplacement suivant. Donc, ceci est juste une façon différente de la rédaction de tableau 0 est égal à 1, tableau 1 est égal à 2, tableau support 2 est égal à 3. Il est juste une autre façon de penser. Parce qu'ils sont continues blocs dans la mémoire, vous pouvez vous référer à eux, soit par le réseau notation-- qui je personnellement easier-- trouver mais peut-être vous devez manipuler strictement par des adresses de mémoire. Et ceci est la façon dont vous souhaitez le faire. Genre de plus de comme un Ce qui est cool que vous pouvez faire contre peut-être pas quelque chose que vous êtes passe réellement à mettre en œuvre. Je l'utilise en 61. Vous les gars ne peuvent sans doute pas besoin à vous soucier de trop. Mais si vous êtes intéressé, prendre 61 l'année prochaine. Nous sommes dans les gars à la maison d'étirement. Je sais, il est long. Dynamic Memory Allocation-- si nous savons que l'un des choses lorsque nous avons parlé au cours de notre première section ensemble, nous avons examiné un swap fonction où il était en dehors de la portée de notre fonction principale. Et nous étions de passage dans ces valeurs qui étaient effectivement des copies. Et une fois terminé échange d'exécution, elle vient de quitter une pile. Rappelez-vous, nous avons une empiler cadre de swap. Il laisse et ceux valeurs partent avec elle. Et ils étaient partis. Nous ne pouvions rien faire avec eux et nous étions tristes parce que nous ne pouvons pas échanger nos valeurs. Mais avec C, comme je le disais, vous avoir beaucoup de pouvoir sur la mémoire. Donc ce que vous pouvez faire vous est possible allouer des choses sur le tas ici qui y resteront jusqu'à ce que vous leur dites autrement. Ils sont comme de bons enfants. Ils y restent. Ils ne partent pas. Ils vont y rester jusqu'à ce que vous êtes comme, OK, vous pouvez aller. Alors que les choses sur la pile, who-- ils sont comme des enfants désobéissants. Ils vont juste fuir quand vous voulez d'être là et puis ils sont partis. Vous ne pouvez pas les récupérer. Ainsi, le tas est-- nous allons parler de malloc et free, qui Je suis sûr que vous les gars entendu parler en conférence. Et qui est essentiellement un moyen de disposer de données très persistantes. Ainsi, vous pouvez conserver les données aussi longtemps que vous le souhaitez. Hum. Public: Pouvez-vous définir tas et la pile? Sont-ils aiment endroits pour mettre les choses? ENCEINTE 1: Ils sont donc essentiellement just-- ils sont la façon dont nous parlons juste de mémoire. Donc tas est des lieux où les la mémoire est allouée dynamiquement, alors que la pile se réfère plus d'empiler les cadres qui ne sont plus au centre de la fonctions qui sont effectivement en cours d'exécution. Vous ne devez pas vraiment de contrôle. La grande différence, vous avez le contrôle sur le tas si vous voulez. Vous avez moins de contrôle sur la pile. La pile dépend de la fonctions qui sont en cours d'exécution, et l'ordre dans lequel ils sont courent, et comment les choses sont retournés. Alors qu'avec le tas, comme nous allons le voir, vous pouvez dire, OK, je veux que cette valeur soit autour jusqu'à ce que je vous dis le contraire. Vous n'êtes pas autorisé à se débarrasser de lui. Vous n'êtes pas autorisé à remplacer. Vous allez garder autour aussi longtemps que je vous dis. Vous arrivez à être le patron dans le tas, alors que la stack-- peut-être si vous comme finagle votre chemin vous pouvez être le patron. Mais pas tout à fait. Et il est vraiment juste mémoire. Il est juste de différentes façons de faire référence à la mémoire. Laisser refroidir. Donc, avec cela, comment contrôler votre mémoire. Il est avec malloc, qui vous allez apprendre à utiliser. Donc, il est un peu moins pour l'allocation de mémoire. Voilà tout ce qu'il est. Il ya un tas d'autres frais fonctions qui ont alloc à la fin, et qu'ils représentent des choses différentes. Ainsi, lorsque vous avez besoin de stockage qui doit pour survivre à votre fonction actuelle pour que lorsque votre actuel fonction fuit, vous avez encore les données que vous obtenu de lui, vous souhaitez utiliser malloc. Ça initialiser sur le tas. Et comme je l'ai dit et continue dire, vous allez continuer à y jusqu'à ce que vous arrêtiez, qui est la chose importante ici. Donc, une chose à remarquer, et qui est généralement très important, est ce que sizeof est super utile à utiliser parce que, selon le type de la machine que vous utilisez, il peut avoir des quantités variables de mémoire qu'il faut. Donc, vous voulez toujours utiliser la taille de sorte que vous n'êtes pas dépend de la machine, afin que votre code fonctionner sur une machine. Et qui est juste partie d'écrire du bon code. Si cela fonctionne sur une machine, mais aucun des autres, Quelle était l'utilité de votre programme? Donc, vous voulez toujours assurez-vous et utiliser sizeof. PUBLIC: est donc que, comme le taille de 10 pouces [inaudible]? ENCEINTE 1: Ceci est la taille de 10 ints. ouais. Donc la taille d'entiers sera de retour combien peut-on prendre int. Ou la taille de char, comment coûte une prise char. Et puis le nombre de blocs de ce que vous voulez? Donc dans ce cas, nous voulons quelque chose que nous pouvons stocker 10 ints à. Et cela va fonctionner indépendamment de la machine, ce qui est cool. Alors combien d'octets sera que réellement vous donner? Calcul rapide. Public: 40. ENCEINTE 1: 40. Exactement. Donc, une autre grande chose. Pointeur ou malloc peuvent retourner null. Encore une fois, vérifiez toujours voir si elle retourne null avant d'essayer de faire quelque chose avec elle. Si vous essayez de déréférencer ce pointeur maintenant, il va tout simplement une erreur de segmentation parce que vous êtes allé et essayé toucher nulle quand vous ne devriez pas avoir. Il faut donc toujours vérifier nulle. Encore une fois, tout ce que vous pouvez faire. Il pourrait retourner null. Il reviendra null si vous êtes soit d'espace, ou pour toute autre raison il a couru dans un bug de mémoire. Il revient parfois juste nul. Donc, vous avez juste à vérifier pour elle. Voilà tout ce diaporama dit. Et puis ce que nous avons ici est un appel à libérer. Ainsi, de la même manière que si l'on ouvrir un fichier, vous devez fermer un fichier, si vous la mémoire malloc, vous devez vous libérer cette mémoire. Et vous les gars obtenir de faire des trucs vraiment cool. Et il ya un programme que vous pouvez exécuter à voir si vous êtes toujours fuite de mémoire. Mais vous ne voulez pas perdre la mémoire. Il est vraiment mauvais. Situé à gâcher les choses. Il est mauvais de faire exactement comme la programmation sage pour l'efficacité de la conception. Mais il est aussi juste genre de mauvais pour votre ordinateur. Tant de choses juste gratuits quand vous les malloc. Vous vu les symétries ici. Super simple. Juste libre et puis Quel que soit votre pointeur, quel que soit le nom de le pointeur est, et il prendra soin de le libérer pour vous. Laisser refroidir. Ensuite, nous avons cela. Donc, nous allons juste marcher à travers ce programme. Et puis vous aurez fini. Donc, [inaudible] juste principale. Nous avons donc des int * pointeur. Nous avons donc un pointeur que ça va tenir ints. Et combien ints que ça va tenir? Juste une. Taille d'un int. Nous vérifions pour voir si pointeur est nul parce qu'il est, nous voulons dire ne rien faire. Il est mauvais. Donc, nous imprimons une erreur de mémoire, reviennent le plus souvent 1, comme vous les gars sont habitués. Et puis nous avons ici, nous déréférencer notre pointeur. Cela signifie donc que nous allons stocker quelque chose à l'endroit qui nous est donnée. Int * pointeur, ou malloc, renvoie le adresse de l'endroit où elle a mis de côté cette mémoire pour vous. Donc, il est fondamentalement vous donnant like-- si vous penser à un tas de maisons dans un quartier que vous voulez mettre vos meubles, malloc est comme OK, vous obtenez d'aller à la maison trois. Et il vous le donne adresse de la maison de trois. Donc, ce droit maintenant, ce magasins de pointeur une adresse, stocke l'adresse de votre maison. * moyens de ptr, OK, je suis chez moi. Laisser refroidir. Je dois obtenir un entier. Donc, vous demandez à quelqu'un pour vous donner des meubles maintenant. Ainsi, vous obtenez un certain int. Et il met dans votre pointeur où il pointe vers. Et alors il a juste gravures , vous avez entré partout. Et encore, la référence. Donc, cela est comme vous êtes allé à cette adresse et vous avez vu ce qu'il y avait. Cool? Et puis bien sûr, nous libérons notre pointeur. Ne pas oublier de libérer votre pointeur. Ne pas oublier de vérifier la valeur NULL. Ne pas oublier de libérer votre pointeur. Vous avez deux choses vous vous souvenez de ce, ou que vous devriez vous rappeler. Oui. PUBLIC: [inaudible] des trucs comme ça, le char * s. Comment se fait-il que nous ne libérons ceux-là? ENCEINTE 1: Hm? Public: Est-ce ceux qui, comme les chaînes? Vous avez dit chaînes sont comme char * s, non? Alors, pourquoi ne nous libérons pas les chaînes? ENCEINTE 1: Vous seulement gratuit si vous allouer de. PUBLIC: Oh, si vous allouer de. ENCEINTE 1: Alors malloc et libre sont deux choses que vous devez toujours avoir ensemble. f ouvert, f près, deux choses vous devriez avoir ensemble. Dans ces deux cas, vérifiez nulle. Oui. AUDIENCE: Le libre est juste permettant autre chose pour y être stocké après ce programme a utilisé? ENCEINTE 1: Il est juste de dire, OK, je suis fait avec cette. Vous ne devez garder autour. Sinon votre ordinateur juste comme essayer de l'y maintenir. Et puis vous can't-- il fonctionne dans les problèmes de mémoire plus tard. Vous voulez toujours pour le libérer parce que il indique à votre ordinateur, OK, je suis fait avec ce lieu de mémoire. Vous pouvez le récupérer pour moi d'utiliser plus tard. Cool? Oui. Auditoire: Alors, nous avons utilisé le% d juste car un double qui va revenir, ou pourquoi est-- [inaudible]. Public: Pouvez-vous utiliser% i? ENCEINTE 1: Vous pouvez utiliser% i. Les dernières questions minute? Aller de l'avant. PUBLIC: Je viens de poser une question rapide. Donc, la variable ptr, that's-- comme, avec l'int * ptr = malloc, qui est juste de dire qu'il est pointant vers un endroit dans memory-- ENCEINTE 1: Voulez-vous [inaudible]? PUBLIC: --Que est la taille de-- pas, il est OK. Mais il est juste pointant vers un endroit dans mémoire qui est comme quatre octets. ENCEINTE 1: Droit. Donc malloc la taille de int dit, OK, je vais aller de ruissellement, trouver quatre octets de mémoire pour vous. Quand il trouve que quatre octets de mémoire, il vous rend l'adresse de l'endroit où il commence, et qui est ce stockée pointeur, ou ptr. Bon. Vous avez l'air moins confus que la plupart les gens quand je parle, pointeur donc je me sens très bien en ce moment. Bien. Comme toujours, vous les gars devraient avoir tout obtenu vos qualités de pset2 maintenant. Je sais qu'il ya eu une certaine bancal choses où il est dit, formule pas valide ou quelque chose. Si vous obtenez ce que, tout de vos notes sont valables de mon côté. Donc, je peux vous envoyer captures d'écran de vos notes. Laissez-moi savoir ainsi si vous êtes manquant pas de qualités ou quelque chose ne semble pas avoir de sens. Venez à moi. Je suis super fier de vous les gars déjà, alors gardez-le. Et avoir un bon repos de votre semaine. Je suis sûr que je vais voir une certaine de vous à des heures de bureau.