[MUSIC THEME] SPEAKER 1: Ciao a tutti. Bentornato alla sezione. Bella giornata fuori-- ed è per questo, io sono certo, ci sono solo quattro di voi qui e non il nostro solito pacco. Sono stato male in questo fine settimana. Quindi non ho Starburst per voi ragazzi. E posso iniziare a tossire terribilmente tutto questo. Quindi, solo portare con me. Ho intenzione di provare davvero e ottenere attraverso questo primo, però, prima ho un attacco di tosse. Ma solo essere facile su di me un poco bit-- questo è tutto quello che chiedo. Quindi il nostro ordine del giorno per oggi-- solo un reminder-- il quiz è la prossima settimana. Ti ho detto la settimana scorsa in modo che non sarebbe prendere alla sprovvista. Quindi ti sto ricordando di nuovo. La prossima settimana il quiz. A tal fine, la prossima settimana di sezione sarà molto più di-- cercherò di lavorare in qualche recensione. Quindi, se voi ragazzi potrebbe darmi una mano con l'invio di me cose che sei a tuo agio con, che siete preoccupati, argomenti che vorreste per me a coprire, sarebbe fantastico. Così posso cercare di lavorare nella nostra sezione la prossima settimana o inviarle materiale extra o di preparazione che non si potrebbe ottenere altrove. Yeah! Sempre più persone stanno arrivando! Ho pensato, l'ho fatto male lo scorso settimana, che nessuno vuole tornare? Ho paura. Così le altre tre cose che stiamo per andare oltre sono reindirizzamento, file I / O, e poi puntatori e memoria dinamica. Sono sicuro che siete tutti super eccitati pointers-- argomento preferito di tutti, così semplice da capire. Sono sicuro che voi ragazzi tutto hai, vero? Quindi, prima le cose, redirection-- questo è fondamentalmente solo un modo per controllare come si inserisce le cose nel vostro programma, come voi le cose di uscita dal programma. Le principali vie che voi ragazzi sono stati interagendo con esso è solo attraverso fuori norma con la schermata di stampa qui. Ma ci sono modi per pipe-- come vediamo qui è uno della nostra specie words-- di tubo che le informazioni o che i dati in un file da un file. E 'solo modi diversi di fare le cose nel vostro programma e fuori del vostro programma, invece di appena li stampa su questa schermata o inserendo cose dalla riga di comando. Così prima è poco maggiore di accento circonflesso. Così output-- viene stampato solo l'uscita di un file invece dello schermo. Quindi, se si ha qualcosa che stampato "Ciao, mondo!" allo schermo, se lo metti al posto a output.text, che crea il file chiamato output.text. E quando lo si apre, sarà dire "Ciao, mondo!" in là. Questo può essere super utile se si dispone di un sacco di errori in realtà, come si vede in questo uno. Se lo fai due accento circonflesso, sarà stampare i messaggi di errore. Quindi, se hai un problema con compilazione, ha un sacco di errori e il gioco è impantanarsi nel tentativo per scorrere nella riga di comando attraverso tutti loro, è possibile basta stampare su un file, aprire il file in modo che si può scorrere più facilmente. Ho utilizzato che un molto quando ero il debug i miei 181 p-set per l'apprendimento della macchina. Così può essere super utile in seguito. E 'anche utile se si dispone di un programma che forse sta generando una libreria o la generazione di un insieme di stringhe, e si devono essere in grado di vedere che li sta generando correttamente. Questo è il modo per farlo. Quindi, se li stampa su un file, possono più facilmente esaminarle, giusto? Versus cercando di scorrere tramite la linea di comando. E poi una cosa da notare è che solo con maggiore di accento circonflesso, se si sta scrivendo a un file che già exists-- così come se abbiamo fatto questo il primo tempo, abbiamo messo a output.text, e poi abbiamo avuto un secondo programma che stampate questo come programma di due e ha fatto un maggiore rispetto per output.text, esso sovrascriverà che-- così sovrascrivere quello che è stato mai in quel file per cominciare. Quindi, se si desidera aggiungere in un file, come si vede qui, basta fare due più grande di segni. E si aggiungerà ad esso. Non si sovrascrive. Quindi, se avete bisogno di eseguire più programmi e il tipo di mantenere traccia di ciò tutti sono tornare a voi in un file, questo è un modo per farlo. Se non si cura ciò che è nel vostro file ed è permesso di essere sovrascritto, si può semplicemente utilizzare un unico superiore. Questo fa senso per tutti? PUBBLICO: Come dot ridurre drasticamente ciao maggiore di testo di output puntino, come due volte, sarà solo mostrare solo in uscita dot testo una seconda tempo-- SPEAKER 1: Giusto. Quindi, sarebbe fondamentalmente solo completamente sovrascrivere quello che era lì per cominciare. Se questo file Qui, la output.text già esiste, in pratica tutto ciò che si chiama che ancora una volta con un unico grande che si può solo pensare di esso in quanto, come ha sostituito il file. Come quando si sta salvando una parola documento e non Salva con nome, e si mantiene lo stesso nome, e sovrascrive completamente it-- questo è lo stesso genere di cose. Qualcuno ha qualche domande su solo l'output in un file? Impressionante. Così, ovviamente, se si inverte il freccia direzione, si può fare di ingresso. Così, quando voi ragazzi avevate come Cesare o Visioneer e si doveva inserire qualcosa, si ha un argomento della riga di comando che in realtà inserirlo. Questo è un altro modo per farlo. Così, invece di aspettare per un prompt dei comandi, come quando hai chiesto per il vostro messaggio di Cesare o di Visioneer, se si ha un file di testo che aveva il tuo messaggio, si può solo scrivere in questo. Quindi, se questo fosse come punto tagliare Cesare 3 meno di freccia testo di input, che è il messaggio, che funzionerebbe bene. Quando il programma di Cesare realtà chiesto per l'input da parte dell'utente, sarebbe già, perché hai digitato in questo file. Questo è solo un altro modo. Solo una inversione di output-- basta inserire i vostri dati. E poi l'ultimo è il tubo. Quindi di questo piuttosto fresco. Perché permette di prendere l'uscita di un programma e metterlo come input per un altro programma. Non so se qualcuno di voi giocato con il decifrare che CS50 potrebbe avere dato, ma sarebbe permettono di prendere qualche campione file, digitare nella tua crittografia, e poi da lì digitare che nel tuo decrittazione per assicurarsi che si è scoperto lo stesso. Quindi è un po 'come ciclo a tre vie. Andare per esso. PUBBLICO: Se un programma ha più ingressi, c'è un modo per dirgli quale ingresso utilizzare il file di testo o dell'uscita per? SPEAKER 1: Ha più ingressi. Qualunque sia depositare la input-- quando è chiedendo input che prima volta, è intenzione di assumere, credo, che sia andando a tubo l'intero file. Quindi, se si dispone di più ingressi, sei sta per essere piping in più file. Quindi, se stai chiedendo per i messaggi tre volte nel codice, si sta andando ad essere messa in tre file differenti. E diventa pazzo. E non si deve avere a preoccuparsi che in questo momento. Ma questa è l'idea. Quindi sì, il tubo è solo l'uscita di un programma usa ingresso nell'altro. Tutto bene lì? Freddo. Ok. Probabilmente non sarà necessario di fare troppo con esso. Ma è necessario comprendere modi è possibile utilizzare questo. E ci sono alcuni casi che si potrebbe desiderare di utilizzarlo. Così File I / O-- So quello che sei saying-- siamo abituati alla lettura da e scrivendo al nostro schermo lì, che è standard e standard output. Ed è quello che voi ragazzi siete stati facendo dall'inizio di classe qui. Ma si può anche leggere e scrivere file, che tutti i file di I / O-- così file di input, uscita è tutto ciò che rappresenta. Quindi, questo significa che è possibile memorizzare i dati di ora. Quando si solo è necessario stamparlo su schermo, è praticamente andato, giusto? Non appena si effettua "Ciao mondo "ed eseguire" Ciao mondo " la stampa "Ciao mondo" sullo schermo. Ma non si può davvero fare qualsiasi cosa con esso da lì. Se si memorizza in un testo file, poi improvvisamente si dispone di questi dati, che si è permesso di manipolare o metterlo in un file, o metterlo in un programma più tardi. Uno dei motivi perché facciamo questo è solo come un modo per memorizzare i dati per un uso successivo. Ho un paio di passi qui solo a piedi attraverso di serie I / O. Nella fase uno, necessario creare un riferimento al file con tutte tappi file stella. Così che crea un puntatore a un file. Allora si desidera aprirlo. E tu dici, letteralmente, solo il file è uguale a fopen. E questo sta per restituire un puntatore al file appena aperto. Ho visto un paio di voi ragazzi nelle ore di ufficio. Ma una delle cose è puntatori remember-- può essere qualche indirizzo o per nulla, giusto? Se mai avuto un caso in cui qualcosa può restituire null, che cosa dobbiamo fare prima abbiamo mai usiamo? Abbiamo bisogno di verificare se è nullo o no, giusto? Poiché alcuni di voi hanno avuto il problema per cui qualunque oggetto veniva restituito in breakout è stato nullo. Si è tentato di eseguire qualche funzione su di esso. E il sito del computer in errore. Giusto? Scommetto che un paio di voi può aver avuto quel problema. Quindi, con fopen, fopen sarà o restituire un puntatore al file, o se qualcosa va storto, sta andando a restituire null. Quindi è sempre necessario controllare che non è tornato nullo prima di tentare di fare qualsiasi altra cosa. Questo è come un paradigma di serie che si sta andando ad avere bisogno qui. Se c'è mai una possibilità che qualcosa potrebbe restituire null, Controllare per assicurarsi che non prima di procedere. In caso contrario, si sta andando per ottenere belle colpe del sito. E a nessuno piace trattare con quelli. Quindi, come si vede qui, il primo argomento è solo il percorso del file. Se questo file non esiste, sta andando a creare quel file. Ed è solo andare a essere vuoto. E poi il secondo argomento è la modalità che si desidera. Vogliamo leggere da questo file? Vuoi scrivere da esso? Vuoi aggiungere? Quindi, in realtà quello che ho appena said-- se il file non esiste e si sta cercando di leggere da si, sta andando a generare un errore. Se il file nome-- come se file.text non esiste ancora e si desidera scrivere ad esso, si creerà un file vuoto chiamato file.text per voi. E se si desidera aggiungere, si dovrebbe fare la stessa cosa. Questo fa senso? Se stai cercando di leggere da un file che ancora non esiste, che sarà genera un errore. In caso contrario, verrà creato il file per fare ciò che si vuole ad esso. Freddo. Ora possiamo leggere dal file. E questo è solo un po 'andare attraverso le diverse funzioni che abbiamo per il file I / O. Questa volontà essere necessario pset di questa settimana, se non ricordo male. Sì, assolutamente sarà necessaria pset di questa settimana. Così fgetc restituisce il carattere successivo. fgets restituisce solo una riga di testo. Ritornerà nulla fino a una nuova linea, e si romperà. Così fread legge un certo numero di byte e li luoghi in un array, che è qualcosa che si potrebbe vuole fare con re-size-- potrebbe essere utile. Quante persone hanno letto le specifiche pset, a proposito? Ok. [Incomprensibile] SPEAKER 1: OK. Bene. Sicuramente leggere che-- è un pset divertente. Si arriva a recuperare una memoria cancellata card-- davvero emozionante quando funziona. Ma sicuramente, iniziare a leggere questo. Vieni a parlare con me se avere domande su di esso. OK, quindi come dicevo, fread legge un certo numero di byte. Questo è un numero arbitrario che si sta andando a impostare. E poi fseek solo mosse ad una certa posizione. Quindi forse non vi interessa circa i prossimi 10 byte. Hai voglia di andare avanti. Non ti importa di quelli. Si desidera leggere dal byte 11. fseek permette di fare questo. Quindi ti permette di essere selettivi su ciò che stai leggendo. Perché fgetc, fgets, e fread lettura da un certo posto nel file. Un modo di pensare a questo è se questo è il nostro file, quando si apre, si ha questa posizione nel file di che parte dall'inizio. Ogni volta che si chiama fgetc, fgetf, o fread, che sta per iniziare da questo marcatore di posizione. Diciamo che si desidera solo per leggere questo pezzo di memoria qui. Non si può semplicemente chiamare. Dovete cercare qui e poi leggere da lì o leggere, ottiene, o getc, a seconda di ciò che si desidera. Quindi cercare solo si permette di saltare porzioni di memoria. E questo è l'unico modo è possibile saltare le cose senza leggerli nel buffer. Questo fa senso per tutti? Ovviamente, c'è un sacco di qui-- parallelo il nostro reindirizzamento uscita, o ingresso, di aver letto e scrivere. Così fputc scrive solo un carattere nel file. fputs scrive una riga. Fprintf stampa un output formattato. Quindi, se si dispone di schede, o spazio, o roba del genere. E poi fwrite scrive un po ' array di byte in un file. Quindi questo è allo stesso modo fwrite e fread sono analoghi fgets opposites--, fputs, e poi un sacco fputc e fgetc-- di pazzi, cose veloci. Solo tipo di mantenere questo handy-- avrete momenti diversi dove forse si desidera solo un carattere alla volta. Forse si vuole una linea intera. Con il vostro pset-- dizionario che è a due p-set, Io credo, vi diamo un intero dizionario in un formato di testo che ha ogni parola separati da una linea. Quindi, se si voleva leggere in una parola alla volta, quello che si potrebbe usare se stai leggendo e sono tutti separati su nuove linee, e si desidera solo una parola alla volta? PUBBLICO: fgets SPEAKER 1: Giusto. Fgets-- perché restituisce qualunque sia su una riga. E se ogni parola è la sua propria linea, possiamo usare fgets. Freddo. Questo fa senso, tutti? Cool? Sì, stiamo per arrivare a la parte più divertente con i puntatori molto presto, in cui si arrivare a fare un po 'di matematica. E sarà grande. Ultimo step-- chiudere il file. Con così tante cose qui, uno dei nostri paradigmi è se può ritornare nulla, verificare la presenza di nulla. Se si apre qualcosa, è meglio chiuderlo. OK, quindi non finito fino a quando sei fatto a meno che non hai chiuso. Un po 'come non è finita fino a quando la signora grassa canta. E 'come chiudere il file. Come si dice qui, solo per ribadire, sempre aprire il file prima di sei la lettura o la scrittura di esso. E sempre chiuderlo se hai aperto. Bene? Freddo. Quindi, ecco un esempio. Così tiny-- Non so se si ragazzi possono vedere molto bene. Se solo potessimo aumentare la luminosità in qualche modo. Mi permetta di fare questo in realtà se posso. OK, voi ragazzi non si può davvero vedere che a tutti, si può? OK, stiamo andando a fare questo, allora. [Incomprensibile] Presumo che ciò è molto meglio vedere. Chiunque può vedere dove la mia il mouse è andato è la domanda? Ah, eccolo è-- cosa lotta! Ok. In sostanza, voi ragazzi dovrebbero avere tipo di un'idea di ciò che questo sta facendo. Non è perfetto. Ma io preferirei spiego che spendere più tempo a cercare di formattarlo correttamente. In sostanza, come vedete qui, si comincia con file aperto. E abbiamo un po ' file di database che siamo l'apertura che dice che è i nostri studenti. E abbiamo intenzione di scrivere. Così, naturalmente, restituire null. Quindi dobbiamo controllare per nulla. E poi se non è nullo, passiamo attraverso. E come vedete, noi siamo ciclo di qui. Ci sono studenti. Gli studenti hash è definito come tre. E quello che stiamo facendo è che siamo stampa su file, giusto? Allora, cosa stiamo stampando al nostro file? PUBBLICO: I punteggi che sono nella matrice? SPEAKER 1: Sì. I punteggi che si trovano in il array-- esattamente. Quindi apriamo questo file di database, che Presumo sia una sorta di database di gradi. E siamo solo stampando la punteggi di ogni studente a quel file. Cool? Buona. Impressionante. Ok. Torniamo a-- PUBBLICO: Ho una domanda veloce. E 'la printf non nel ciclo for? Questo è solo in se ciclo? SPEAKER 1: No, è nel ciclo for. Non riesco a vedere il mio mouse molto bene qui. Così sto lottando per formato corretto. Questo supporto dovrebbe essere sparito. Dovrebbe essere qui. Questo è ciò che è in vostro ciclo for. Là. Ora è abbastanza. Ecco, questo è come dovrebbe essere-- eccezione per l'ultima staffa che ho respinto. Ok. Questo fa senso per tutti? Ok. Stiamo per andare avanti per la prossima cosa then-- che, in realtà, si sta andando ad avere bisogno di vedere il codice. Così sto solo andando a copia che oltre al momento. Ok. Quindi ho intenzione di mostrare voi ragazzi questo codice. E voglio che tu a cercare di capire di che cosa si dovrebbe fare. Quindi, dato che-- prendere un minuto o giù di lì. Cercare di capire cosa sta succedendo qui. Tutte le idee? Noi sappiamo di avere almeno due argomenti nella riga di comando, giusto? Presumo uno dei quali sta per essere che [incomprensibile] del nostro programma è e poi un'altra cosa. Perché se [incomprensibile] è meno di due, abbiamo urlare contro di loro. Giusto? E dal loro utilizzo, sembra che che sta per essere una sorta di file. Siamo tutti d'accordo a questo? Così ora, qual è il ciclo facendo? Che cosa sta passando? PUBBLICO: Tutti i file. SPEAKER 1: Esattamente. Sta andando attraverso tutto il i file che abbiamo in ingresso ci. Quindi, per ogni file, è aprendo qualche stringa lì. E 'aprendo il file. Giusto? Ed è di lettura. Naturalmente, controllando se è nullo. E poi è la stampa. Se è nulla, è solo che ci dice che questo non è un file che esiste. Perchè ricorda, con leggere il nostro file deve esistere. Giusto? Con scrittura e append, si può farla franca. Ma con la lettura, il nostro file deve esistere. E poi, se esiste, cosa ci facciamo qui? Diciamo solo iniziare qui. Di cosa si tratta fare-- questo primo carattere. Che cosa fa? Si alza un carattere, giusto? Così che cosa sta facendo questo? Si sta facendo il primo carattere. Qualcuno sa EOF? PUBBLICO: Fine del file? SPEAKER 1: Fine di file-- esattamente. Così sta andando a passare attraverso l'intero file, giusto? E poi sta andando da aggiornare ottenere ogni carattere successivo. Giusto? E che cosa ci fa? PUBBLICO: Mettere che dentro-- SPEAKER 1: stampe putchar per il vostro screensaver. [Incomprensibile] il carattere. E poi quando [incomprensibile] questo chiude il file. PUBBLICO: Non ti bisogno di un [? altro? ?] SPEAKER 1: Non necessariamente. Voglio dire, è una specie di implicita in questo. Poiché questo restituisce, però, a patto in cui ciò non prendere questo, che stai bene. Voglio dire, è probabilmente un bene pratica per fare un altro. Ma l'altro non è sempre necessario in particolare se avete qualcosa come un ritorno, che significa che in questo caso se cattura esso, il programma sta per finire e che sarà mai arrivare a questo. E 'più per il caso in cui si è non necessariamente anche qualcosa. Perché se questo non è stato ritorno nulla, vorrebbe dire che se ciò fosse vero, il resto di questo sarebbe ancora eseguito. E in quel caso, si vorrebbe un falso. Se è di ritorno, e fine del programma, l'altro non è necessario tutto il tempo, a seconda del contesto. Jacob, hai avuto una domanda? PUBBLICO: Sì. Così fa fgetc ottenere il carattere successivo? Come aumentare il personaggio? SPEAKER 1: Sì. Così fgetc ottiene il carattere successivo. Si può pensare ad esso come il C ++ in un certo senso. PUBBLICO: Che cosa era EOF? SPEAKER 1: EOF è la fine del file. E 'solo un indicatore che consente di sapere che sei alla fine del file. Quindi questo sta andando per la stampa al vostro standard output. E poi sta andando a chiudere il file quando è fatto. E poi andiamo a il file successivo, giusto? Dunque, nel complesso, che cosa fa questo programma? [Incomprensibile] SPEAKER 1: Sì. Essa si limita a stampare fuori tutto quello che c'è. Quindi, CAT, se avete mai usato voi ragazzi e poi il nome di qualche file-- Non so se qualcuno di voi ha mai fatto sul vostro terminale. Ma se mai utilizza la Comando CAT-- C-A-T-- e quindi tutto ciò che di file hai there-- esso stampa fuori per il vostro terminale, che può essere super utile per alcune cose. Io lo uso molto. Questo fa senso per tutti? Cool? OK, il vostro compito now-- sia da soli o con le persone intorno a you-- è quello di scrivere un semplice programma che vi basta scrivere "Ciao, mondo!" in un file. [Incomprensibile] [Incomprensibile] SPEAKER 1: ero come, ha fatto Lo faccio male la settimana scorsa? Non pensavo che fosse così male. Sono contento che siete tutti qui. E mi fa davvero felice. Sono una ragazza di piaceri semplici. A me piace quando la mia sezione frequenta. Così sto solo ottenere questo è cominciato per voi ragazzi in modo che siamo in grado di codificare insieme. Non mi piace mettere chiunque su il posto a meno che non si vuole essere. Destinatari: per il quiz, fare dobbiamo scrivere un programma? SPEAKER 1: È possibile che venga richiesto di scrivere semplici programmi a mano. Sì. PUBBLICO: Il quiz è la prossima settimana, giusto? SPEAKER 1: Il quiz è Mercoledì prossimo. Questo significa che c'è una bella [? CSE?] classificazione partito in seguito, che significa che avrai i tuoi punteggi schiena che notte-- a che ora? Chi lo sa? Ma sarà quella notte. Bene. Come vogliamo iniziare questo? Ti darò un hint-- inizia con questo. PUBBLICO: Dovete aprire un file. SPEAKER 1: Sì. Allora, cosa si desidera chiamare questo? Avete voglia di chiamarlo "file"? Facciamo in modo facile. Quindi fopen-- qual è la nostra prova di uscita sta per essere? Chiamatela "Ciao." E qual è il nostro modo? Cosa stiamo facendo a questo file? PUBBLICO: Leggi. Scrivere. SPEAKER 1: Stiamo scrivendo a esso. Incantevole. OK, quindi abbiamo questo file. Che cosa dobbiamo fare? PUBBLICO: Controllare se è nullo. SPEAKER 1: Verificare se è esattamente null--. Questo è quello che mi piace sentire. Questo dovrebbe essere automatica, in particolare più o meno da questo punto in poi. Se si inizia a andare in segfault, probabilmente non controllare per nulla da qualche parte. Nove volte su dieci, che è sarà il vostro errore. Quindi, se si può solo ottenere nel abitudine, controllare sempre se è nullo, la tua vita sarà bello e easy-- o più facile. Quindi, controllare per vedere se è nullo. Quindi, se non è nullo, che è ciò che il botto è uguale means-- null-- non è valida. Che cosa vogliamo fare? Vogliamo solo la stampa a quel file, giusto? Così che cosa stiamo andando da usare? PUBBLICO: fprintf SPEAKER 1: Fprintf-- bella. E fprintf prende due arguments-- dove sta andando e cosa vogliamo stampare. Allora qual è il primo? Dove sta andando? PUBBLICO: File. SPEAKER 1: Sta andando in un file. E cosa vogliamo stampata? "Ciao, mondo!" Bene. Abbiamo un ultimo cosa-- un altro grande paradigma qui. PUBBLICO: Chiudi. SPEAKER 1: Chiudere. Ecco fatto. PUBBLICO: E 'questo accada se il file è nullo? SPEAKER 1: No, questo è se non è nullo. PUBBLICO: Oh, se è not-- OK. Per la fopen e poi la due argomenti che vanno all'interno, che cosa fa il primo argomento significa di nuovo? SPEAKER 1: L'argomento è proprio come il nome del file che si desidera andare. Così, dopo questo viene eseguito, si farebbe avere qualche file chiamato "ciao" che aveva "Ciao, mondo" al suo interno. Questo è tutto. Basta il nome. PUBBLICO: E dal momento che è la scrittura, la file non deve esistere già. E 'questo quello che hai detto? SPEAKER 1: Giusto. Esattamente. Se "Ciao" come file non esiste ancora, è andando a creare un file chiamato Ciao "e scrivere per voi. PUBBLICO: Quando stai dicendo il programma ha scritto al file, perché scrivi "file" invece di il nome del file e fprintf-- SPEAKER 1: Perché in questo caso, abbiamo che grande file-- tutti in stelle caps--, file. Quindi è un puntatore al file che si sta parlando. Questo è il modo in cui abbiamo appena riferiamo ad essa. Quindi, in questo caso, può pensare di aha file--, possiamo usare questo-- di file qui si riferisce alla apertura di "Ciao" e lasciandolo scrivere. PUBBLICO: Potremmo mettere un "Ciao" invece [? di soli file] f? SPEAKER 1: No, perché "Ciao" ha bisogno di essere aperti e scrivibile. File qui è come un designatore che dice OK, abbiamo avere questo hello-- file-- che stiamo guardando. È stato aperto. E ci accingiamo a scrivere. Se si basta usare "Ciao", che è incapsulato in essa. Così sta andando fuori di testa. Voglio dire, si potrebbe avere la chiamò. Avresti potuto fare di file, stella, "Ciao", è uguale a quella. Ma il punto è che si bisogno di un puntatore a file stella per essere in grado di utilizzare queste funzioni. PUBBLICO: Puoi fare di file, stella, il file, "Ciao" o non si deve mettere file di stelle, il file da esso? SPEAKER 1: Si potrebbe fare del file, stella, "Ciao." È possibile modificare questo per qualunque sia il nome che vuoi. E 'del tutto arbitraria ciò che quel nome è. È possibile assegnare un nome qualsiasi cosa. Nome che gli spaghetti volare, se si voleva. PUBBLICO: Che cosa è il "w" tra virgolette per? SPEAKER 1: La "w" è solo il modo. Quindi stiamo scrivendo a questo file. Tutto bene? Chiaro? Sì. Pubblico: Così, quando si scrive questo FILE, da dove troviamo poi quel file? SPEAKER 1: Sarà nello stesso directory che sei attualmente in. Se siete in tre e pset si esegue questo, all'interno del vostro pset tre la cartella sarà questo file chiamato "Ciao." Cool? Tutto bene? Mi sento come se fossi tutto ottenerlo, il che è fantastico. Ok. Ma torniamo al mio show-- diapositiva Mi piace quando le cose funzionano. OK, pointers-- Sei ragazzi eccitati? I puntatori sono grandi. Prendono un po ' per avvolgere la testa intorno. Questo è il mio secondo anno puntatori di insegnamento. E penso che ho finalmente capito. Quindi, se si lotta, va bene. Come ho detto prima, disegnare immagini aiuta molto con le cose in CS, quanto credo che le persone tendono pensare oh, siamo in un computer. Dovremmo solo codice. Immagini No-- disegno sarà davvero aiutare. E io davvero vi incoraggio a attingere al tuo fianco kindergartner e far emergere pastelli o marcatori e pareggio. Perché vi aiuterà. E se mi vedi in orario d'ufficio, ho sarà portare in giro pile di carta con le penne disegno le cose. Quindi, soprattutto con pointers-- disegnare. E sono sicuro che stiamo realmente andando a essere disegnare alcune foto anche qui. Quindi voi ragazzi tutti avuto modo di vedere Binky, questa cosa claymation fresco. E pensiamo che sia davvero divertente quando esplode in un mucchio di pezzi. E 'un po' di sollievo comico per la classe. C [incomprensibile] questa grande capacità essere in grado di controllare la memoria. Ed è una delle cose che in realtà lo rende un linguaggio così potente. Ma con un grande potere derivano grande responsabilità. E le cose folli possono accadere se non stai attento. Così, quando si sta utilizzando puntatori, si vuole fare Assicuratevi di capire veramente esattamente quello che stai facendo. Speriamo che il prossimo po 'di il tempo ci aiuterà a capire veramente puntatori, come utilizzarli, e come manipolarli. Così memory-- sono sicuro che abbiamo visto questo diagramma prima. Quindi, questo è solo un semplice diagramma di come le cose potrebbero essere memorizzati memoria. In modo da avere in pratica questi enormi array di blocchi di un byte è quello che abbiamo qui-- leggera incrementato di uno ogni volta. Questo è in esadecimale [incomprensibile] così isolati otto bit. E ogni blocco è associato con qualche indirizzo esadecimale. Quindi, se avete mai visto la 0x, questo è solo annotare che si tratta di un indirizzo esadecimale. È possibile assumere questo significa qualche indirizzo in memoria. Stiamo parlando di indirizzi di memoria ogni volta che vedete esadecimale. Abbiamo interi sono variabili, galleggianti sono variabili che memorizzano. Così int negozio int. Galleggianti negozio galleggianti. Così abbiamo anche puntatori che gli indirizzi di memoria negozio. Questo è una sorta di mappatura. I puntatori sono esclusivamente per gli indirizzi di memoria. Ecco, questo è come il tuo tipo lì. Il vostro apparecchio è a 32 bit, il che significa che il vostro indirizzo di memoria è di quattro byte. Quindi, qualsiasi puntatore che avete sta anche andando a essere quattro byte. Oppure se si tratta di quattro byte, la memoria è di quattro byte. Puntatori memoria negozio. Pertanto, sono quattro byte. Cool-- voglio solo rafforzare tale. Si dovrebbe ottenere questo fumetto ora. Non so quanti di voi sono fan xkcd, ma mi piace xkcd. È ottimo. Bene. Quindi la creazione di pointers-- come ho detto, è praticamente proprio come qualsiasi altra cosa. Si dispone di un tipo. Hai un nome. Giusto? Questo è ciò che abbiamo lì. [? Hex?] Stella significa che è un puntatore, e quindi tutto ciò che si desidera chiamare. Così il tipo rappresenta ciò che è possibile memorizzare. Bene? Allo stesso modo che se lo facciamo int, sappiamo che stiamo memorizzare un int lì. Con un puntatore, esso in possesso di un indirizzo di memoria. Ma che cosa vuol dire è che-- ecco dove un disegno sta per venire in aiuto. Quindi, in questo caso, abbiamo alcuni value-- diciamo quattro. Quattro è in un indirizzo. Ok? Questo primo qui significa che si tratta di un puntatore 2x. Giusto? E 'un po' di puntatore x. x può essere qualcosa, qualunque cosa. Qualunque sia x è-- dire x è quattro. Sta andando a memorizzare il indirizzo di memoria qui. Così int, stella, X-- questo è qualche altro slot in memory-- che sa di cosa si tratta. Ma sta andando a memorizzare un indirizzo qui. Quindi questo sarebbe like-- in questo caso, Qualsiasi cosa, è conservato a 0x1-- tutto ciò che è memorizzato presso l'indirizzo che il nostro puntatore detiene, deve abbinare con quello che abbiamo indicato. Così a 0x1, in questo caso, questo è x. Questo può mai essere solo un int mentre stiamo usando questo. Allo stesso modo, se abbiamo altro 1A, a prescindere indirizzo è memorizzato con un y ha essere una stessa cosa char-- con z. Allo stesso modo, ogni volta che cercare di fare inTX è uguale a 0,4, sta andando a urlare contro di voi e di essere come no, hai detto che volevi un int. Questo dovrebbe essere un int. Smettere di cercare di renderlo un galleggiante. Quindi lasciare che le cose siano ciò che vogliono essere. Lasciate che le cose si siano. Così grande cosa è solo qualunque tipo di puntatore è, questo è l'unico cosa che è possibile memorizzare lì. Ok? Con la pratica, come con la scorsa settimana, tutto sembra davvero di tipo astratto. Stiamo andando a fare un pò di pratica. Dovrebbe avere più senso. Così riferimento e dereferencing-- è molto importante per ottenere questi diritti. Devo ancora aggiornare di tanto in tanto. E io sono come attesa, quale voglio? Così la e commerciale sarà effettivamente dare il riferimento o l'indirizzo di. Quindi restituisce l'indirizzo cui memoria variabile viene memorizzato. Così sta andando per tornare realmente a voi un esadecimale, mentre dereferencing esso è in realtà intenzione di darvi i dati che sono memorizzati lì. Ok? Quindi stiamo andando a guardare un esempio veramente veloce, o addirittura accanto. Ok. Quindi dobbiamo pensare davvero attentamente su questo. Quindi qui abbiamo qualche intero x. Io vado a cercare di attirare questo fuori al meglio delle mie capacità. Quindi stiamo andando ad avere questo slot x. Ed è la memorizzazione di cinque. Il suo indirizzo è 0x4. Cool? Tutto bene. Così ora abbiamo questo puntatore. E 'stato qui. E la e commerciale ci dà l'indirizzo di qualcosa. Quindi, in questo caso, è l'indirizzo di x. Qual è l'indirizzo di x? 04-- e questo puntatore è a 0x08. Cool? Così si può pensare a questo puntatore, 04, poco fa qui. E si chiamano puntatori perché come si ottiene più in questo, si sta andando a vedere che punta a cose. E un blocco che punta ad un altro blocco renderà molto più senso. Così qui sono due. E poi abbiamo un po ' copia, che è 0x0C Cosa--. E sta andando a dereference il nostro puntatore. Quindi quello che sta dicendo è OK, ecco il nostro puntatore. Il valore che memorizza è 0x04, e che cosa che sta dicendo è andare a questo indirizzo e dimmi che cosa c'è dentro. Ecco, questo è efficace cosa questa freccia sta facendo. Si può pensare a questo come la vostra stella. Quindi OK, quando lo facciamo stelle, significa seguire. Vai a questo indirizzo. E questo è fondamentalmente solo in seguito questa freccia a questo pezzo di memoria. E ci darà ciò che è in essa, che è 5. E 'il motivo per cui la nostra copia è pari a 5. Questo fa senso? C'è qualcuno che mi ha bisogno di passare attraverso di nuovo, o più lentamente? Vuoi che me ne vada attraverso di essa ancora una volta? Ok. Stiamo andando a ridisegnare di nuovo. Quando si parte, siamo tutti d'accordo che abbiamo qualche pezzo di memoria che è una variabile x che ci siamo posti pari a 5. Noi non controlliamo dove si trova in memoria. Quindi questo punto è solo arbitrariamente assegnato. Buona lì? Ok. Poi abbiamo inizializzare un puntatore a un int. È per questo che è consentito per puntare a x perché abbiamo un int qui. Abbiamo un altro pezzo di memoria perché questo puntatore è una variabile, proprio come qualsiasi altra cosa. È assegnato arbitrariamente spazio nella memoria. E che memorizza l'indirizzo di x. E commerciale si intende l'indirizzo di x. Allora, qual è l'indirizzo di x? PUBBLICO: E 'zero-- SPEAKER 1: 0x04. Così then-- ultimo. Abbiamo ancora qualche copy-- solo un'altra variabile. Quindi cerchiamo di assegnare qualche posto arbitraria. E noi dereference il nostro puntatore. La stella significa andare al indirizzo memorizzato nel mio puntatore. Dimmi cosa c'è. Quindi l'indirizzo memorizzato nel nostro puntatore è 0x04. Quindi andiamo a questo indirizzo. Si punta a quell'indirizzo. Cosa c'è dentro questo blocco di memoria? E 'un cinque. Ecco, questo è quello che si assegna la nostra copia. Tutto bene? Freddo. Immagini Again--. Così il monitoraggio dei valori qui-- Sono intenzione di lasciare che voi ragazzi pensate di questo. Siamo in grado di disegnare un altro quadro. Ma voglio che tu provi e la ragione attraverso questo da solo per un minuto. Dal momento che non hanno dato noi un indirizzo di esempio, Sto solo andando a fare X-- commerciale che dovrebbe contribuire a guidare a casa. Ampersand significa indirizzo. Così nel primo, tutti andare con la prima linea. Alcuni di five-- un insieme x Slot casuale nella memoria. Int puntatore stella è uguale all'indirizzo di x, giusto? Int puntatore stella crea questo blocco, chiama puntatore, e assegna l'indirizzo di x. Sono terribile e commerciali. Ora quello che stiamo facendo è che diciamo OK, dereferenziare nostro puntatore. Quindi andiamo bene, ciò che è in nostro puntatore? E 'commerciale x. Vai a ampersand x e riassegnare esso. Così ora, commerciale x sta per essere 35. Quindi, in pratica, quando si è dereferenziazione, si va OK. Si sta andando ad essere il disegno immagini di questo tipo. Si sta andando ad essere il disegno le frecce su dove si trova. Quindi, andare a questo slot nella memoria e sia dammi quel valore di nuovo, o modificarla. In questo caso, perché siamo a questo valore, stiamo assegnando ad essere 35. Considerando che l'ultima uno, se ci fate caso, abbiamo sono stati l'assegnazione di quello che era qui a qualcosa d'altro. Così hanno questa tabella impressionante. Non è poi così male. Voi ragazzi lavora su di esso. Ho intenzione di disegnare sul bordo. Stiamo per compilarlo insieme, OK? Così afferrare un foglio di carta, afferrare un partner, iniziare a lavorare. Ho intenzione di ottenere un grande pezzo di gesso. Perché sarà molto. Ok. PROFESSORE: OK. Cominciamo con la prima riga. Inizieremo lì, poi voi ragazzi può forse lavorare con un po 'di più. Ok. a è uguale a volte b c così che cosa è un? Non è una domanda trabocchetto, te lo prometto. STUDENTE: 4 volte 5. IL PROFESSORE: 4 volte 5. 20. Così che cosa è b? STUDENTE: 4. PROFESSORE: E c? STUDENTE: 5. PROFESSORE: 5. E poi questo è solo andare a essere Ampersand a, b e commerciale, commerciale c, giusto? Non male. E 'abbastanza semplice. Ok. Quindi il prossimo. A è uguale a volte c, nel caso in cui chiunque non conosceva quella. È tutto familiare con i tempi uguale? OK, tutto questo means-- questo scorciatoia per un uguale volte e c. È anche possibile fare con la divisione, con aggiunta, con sottrazione. Si può fare un pari, o una più uguale c mezzi a è uguale a più c, un meno uguale c sarebbe uguale a un meno c. E 'solo zucchero sintattico. Quindi, in questo caso, a è uguale a a volte c noi che cosa darebbe? Anche in questo caso, non è una domanda trabocchetto. STUDENTE: 100. PROFESSORE: 100. Non qualsiasi altra cosa cambia? No. Forse io finalmente meglio i miei e commerciali. STUDENTE: OK, mi dispiace, come sei arrivato a 100? PROFESSORE: OK. Quindi a è uguale ad una volte c, quindi una volte c. STUDENTE: Oh, si sta utilizzando una per il previous-- IL PROFESSORE: Sì. Quindi questi sono i nostri valori più recenti. Si tratta di ciò che si dovrebbe essere utilizzando come ci muoviamo verso il basso, OK. Quindi, b è l'unica cosa che cambia, giusto? Quindi cerchiamo di riempire tutto il resto. B. Che cosa è b sta per essere? Essere o non essere. Così che cosa sta facendo questo? Qual è la stella pa fare? STUDENTE: Codice per la posizione di pa. STUDENTE: No, non proprio. Quindi questo è un riferimento d. STUDENTE: Quindi b è il valore di mano di pa. PROFESSORE: Sì, così è pa l'indirizzo di una, giusto? Quindi sta dicendo vai a dove a è immagazzinati e dargli quel valore. Così che cosa è b? STUDENTE: 100. PROFESSORE: 100. Perfetto. OK, in modo da pc è quello che sta cambiando. Tutto il resto rimane lo stesso. Che cosa è PC sarà? Assegnazione semplice. Pc è uguale a pa, e ciò che è pa? STUDENTE: Ampersand a. PROFESSORE: Perfect. Ora stiamo ottenendo interessanti. OK, rompiamo questo uno giù. In primo luogo, ciò che è volte b c, perché questo è la parte più semplice di questo, giusto? Volte B c è-- STUDENTE: 500. PROFESSORE: Sì, così che cosa sta facendo questo, Se si tratta di stelle pb, cosa sta cambiando? STUDENTE: Cosa c'è in the-- PROFESSORE: Cosa c'è in b? STUDENTE: Che cosa è nello spazio che pb sta puntando. PROFESSORE: E pb sta puntando a-- STUDENTE: B. IL PROFESSORE: B. Quindi l'unico cosa che cambia è b, a destra. Così b volte c, 500. Ecco, questo è quello che cambia oggi. Freddo. Incantevole. Voi ragazzi stanno facendo grandi. Va bene, rompendo questo verso il basso. C sta cambiando, giusto? Così siamo in grado di riempire tutto il resto. Vediamo. Ok. Sappiamo che c sta per essere il prodotto di due numeri, giusto? Quali sono i due numeri, però? STUDENTE: A e C? IL PROFESSORE: Allora a è proprio per il primo. Quindi stiamo D riferimento p di una, giusto? P di una punta a una, così sappiamo che questo sta per essere 100 volte che cosa? Volte quello che fa il punto pc a? Punti di a. Quindi 100 volte 100 è 10.000. Fa questo ha un senso? Freddo. Tratto iniziale, ragazzi, ultima riga. Ok. Che cosa sta cambiando qui? STUDENTE: A. IL PROFESSORE: A. Perfetto, così tutto il resto può restare lo stesso. Ok. E che è un? Quindi è un momento che cosa? Si tratta di stelle pb. Così stelle pb significa qui è pb, punti pb a b. STUDENTE: 500. PROFESSORE: 500. Così abbiamo 500 volte 100. Questo è 50.000. Meno male! Guardate che. STUDENTE: Perché abbiamo l'& C per la last-- PROFESSORE: Mi dispiace. STUDENTE: Oh, OK. IL PROFESSORE: Il mio male. Un sacco di scrittura. Tutto bene? Non male, vero? Appena prende un po ' mentre al lavoro attraverso. Se si scomposizione, capire ciò che ogni parte si riferisce a-- come con tutto ciò che è, yes-- scomposizione al piccolo problemi e poi si ricombinano, e si può fare un po 'di roba impressionante. Ci sono le risposte, ma abbiamo fatto. L'aritmetica dei puntatori. Ah. Le mie mani sono tutti gessoso. Quindi, aggiungendo o sottraendo int regola il puntatore dalla dimensione del tipo di puntatore. Ricordate come ogni tipo ha una dimensione diversa? Così come un doppio o un lungo lungo a dire otto e int fa quattro ma char è uno. Allora, cosa si vuole fare è-- una cosa da ricordare è solo che quanto il vostro valore del puntatore cambia in realtà dipenderà dal tipo di puntatore è. Tutti bene con questo? Posso cancellarlo? Siamo bravi? Impressionante. Quindi, se abbiamo un po 'di puntatore che-- questo sta per essere-- sono ce l'avrebbe fatta un puntatore a int. Memorizza questo. Se si dovesse dire puntatore più uno, che cosa sta andando a fare si sta andando ad aggiornare per la dimensione di un int perché questo è il tipo di puntatore è. Con C, tutto è molto rigorosa e regolamentato. Il puntatore int sta per aggiornare da la quantità di spazio int prenderebbe. Un int è di quattro byte. Così che cosa sarebbe questo trasformarsi in? Stai solo l'aggiunta di quattro su questo. Ora il puntatore sarebbe essere-- OK. Quindi, se si trattava di un char e abbiamo fatto puntatore più uno, quello che sarebbe ora? Se started-- fingendo noi started-- in questo momento è 0x08. Passiamo ora dire che questo è stato un char puntatore, e abbiamo aggiunto uno. Cosa cambierebbe per? Il numero di byte è un char? PUBBLICO: One. SPEAKER 1: One. PUBBLICO: Così 0x09. SPEAKER 1: Quindi sarebbe nove. Quindi, solo qualcosa da ricordare. Proprio quando si aggiunge uno, non è l'aggiunta di uno a meno che non si tratta di un char. E 'l'aggiunta di quanti byte del tipo che è, ed è per questo che abbiamo questa equazione qui. Quindi è int volte la dimensione del tipo di puntatore. Così abbiamo l'esempio qui. y è stato assegnato a tale valore, 0x4, quando abbiamo fatto y più uguale a uno. Che cosa è in esso, ciò che è in x, non cambia. Ciò che cambia è ciò che è in y. L'indirizzo memorizzato in y aggiornato da quattro perché ci sono quattro byte in un int ed è un puntatore a int. Bene. Così ora abbiamo un altro esercizio. Quindi la domanda è che cosa stampare. Tutte le idee? PUBBLICO: Il numero di caratteri felice gatto? SPEAKER 1: Esattamente. Così come con la stringa. Ricevono tutti che? Vogliamo camminare attraverso di essa? Sì, OK. Quindi ciò che abbiamo qui-- I come questo molto di più. Non ho a [Incomprensibile] ridicolmente. Così abbiamo la nostra stringa qui, gatto felice. Incantevole. Abbiamo qualche contatore che stiamo tenere traccia di. Così abbiamo un po 'di puntatore char * che proprio è posto uguale a str. Quello che sta facendo è la sua l'assegnazione di un po 'di puntatore all'inizio della stringa. Perché sono sicuro che, come è stato accennato in conferenza, vi abbiamo dato ragazzi questo tipo di dati denominato stringa. Ma in realtà le stringhe sono solo una serie di-- come char *. E 'un puntatore a un gruppo di personaggi che sono contigue in memoria. Quindi, questo imposta solo che pari a qualsiasi stringa è identificato da dove il suo primo carattere è. Quindi questo è solo l'impostazione un certo punto uguale all'inizio della stringa. Tutto bene lì? Freddo. Quindi questo è il nostro dereferencing puntatore. Quindi è in realtà andando a ci danno un certo valore in qui, nella nostra stringa che stiamo parlando. E stiamo dicendo più a lungo non è nullo di terminazione. Quindi, andare avanti fino ad arrivare alla fine della stringa. Aggiornare il puntatore di uno. Quindi r, sarà effettivamente aggiornare da una ogni volta perché questo è un char, il char *. Così sta andando a passare attraverso. E 'intenzione di aggiornare. Così la prima volta che questo viene eseguito, che sta per essere qui alle h. E 'intenzione di aggiornare. Sarà un a. Sarà un p, y, e così via e così via. Ci aggiorneremo contatore. Quando si raggiunge la fine, stampa fino a che punto si è ottenuto. Sì. PUBBLICO: Così Conta lo spazio come quello, giusto? Ok. SPEAKER 1: Pensare così. È un interrogo PUBBLICO: [incomprensibile]. SPEAKER 1: Non preoccuparti. Questo lo faccio. Va bene, quindi una cosa che capire è che con una matrice, è anche possibile trattarlo come un puntatore perché gli array sono solo continue macchie di memoria. Così si può trattare allo stesso modo. È possibile manipolare con i puntatori, troppo. Così, invece di fare, in questo caso, la cosa analoga sarebbe di matrice 0 è uguale a 1. Ma nello stesso modo in cui una stringa è determinata entro l'inizio di dove il suo primo carattere è, un array è determinata dalla in cui il primo elemento è. Perché sappiamo, siamo garantito, che questi stanno per essere continua blocchi di memoria. Questo è ciò che ci permette di fare questo. Sappiamo che sono in continuo blocchi di memoria. Quindi, in questo caso, dereferenziando semplicemente array, che ci dice, OK, andare all'inizio di l'array, che è qui. Quindi, è possibile impostarlo uguale a uno. E in questo caso, qualunque sia la matrice tipo è, quando si aggiorna ad uno, è proprio come l'aggiornamento al successivo punto di indice. Si può farlo perché si sapere cosa c'è nella tua matrice. Così si sa quanto a aggiornare il puntatore, quale indirizzo di aggiornarlo a così che ci sei lo slot successivo. Quindi, questo è solo un modo diverso della scrittura di matrice 0 è uguale a 1, 1 campo è uguale a 2, matrice Staffa 2 è uguale a 3. E 'solo un altro modo di pensarci. Perché sono in continuo blocchi in memoria, è possibile fare riferimento a loro o dalla matrice notation-- che personalmente trovare easier-- ma forse è necessario manipolarlo rigorosamente indirizzi di memoria. E questo è il modo in cui l'hai fatto. Tipo di più come un cosa bella che si possa fare contro forse non qualcosa che ti in realtà andando a implementare. Io lo uso nel 61. Voi ragazzi, probabilmente non è necessario di preoccuparsi troppo. Ma se siete interessati, prendere 61 l'anno prossimo. Siamo i ragazzi in casa tratto. Lo so, è lungo. Memoria dinamica Allocation-- così sappiamo che uno delle cose quando abbiamo parlato durante la nostra prima sezione insieme, abbiamo guardato uno swap funzione di dove era al di fuori del campo di applicazione della nostra funzione principale. E stavamo passando in questi valori che erano effettivamente copie. E una volta finito di swap esecuzione, è appena lasciato una pila. Ricordate, abbiamo un impilare cornice per swap. Lascia e quelli I valori vanno con esso. E se ne erano andati. Non abbiamo potuto fare niente con loro e ci è dispiaciuto perché non siamo in grado di scambiare i nostri valori. Ma con C, come ho già detto, è hanno un sacco di potere sulla memoria. Che cosa si può fare è che si può allocare le cose sul mucchio qui che ci rimarrà fino al dite loro altrimenti. Sono come i bambini buoni. Rimangono lì. Essi non lasciano. Rimarranno lì fino a sei come, OK, si può andare via. Mentre le cose in pila, who-- sono come bambini cattivi. Faranno solo scappare quando vuoi di essere lì e poi se ne sono andati. Non è possibile farli tornare. Così il mucchio è-- che andremo a parlare di malloc e libero, che Sono sicuro che voi ragazzi sentito parlare in conferenza. E questo è fondamentalmente un modo di avere dati molto persistenti. In modo da poter conservare i dati intorno come il tempo che vuoi. Mhm. PUBBLICO: Si può definire heap e stack? Sono come posti per mettere le cose? SPEAKER 1: Quindi sono fondamentalmente solo-- sono il modo ci riferiamo solo alla memoria. Così heap è solo luoghi in cui memoria viene allocata in modo dinamico, considerando pila si riferisce più di impilare i frame che sono più centrale per la funzioni che sono effettivamente in esecuzione. Non è davvero il controllo. La grande differenza, si ha il controllo sopra il mucchio, se si desidera. Hai meno controllo sulla pila. Lo stack dipende dalla funzioni che sono in esecuzione, e l'ordine in cui sono correre, e come le cose vengono restituiti. Considerando che, con l'heap, come vedremo, si può dire, OK, voglio che questo valore sia intorno finché non ti avvertirò in caso contrario. Non ti è permesso di sbarazzarsi di esso. Non ti è permesso di ignorare esso. Hai intenzione di tenerlo in giro per tutto il tempo che ti dico. Si arriva a essere il capo nel mucchio, mentre il stack-- forse se come finagle la tua strada si può essere il capo. Ma non del tutto. Ed è davvero solo la memoria. E 'solo modi diversi di riferirsi alla memoria. Freddo. Quindi, con questo, come controllare la vostra memoria. E 'con malloc, che avete intenzione di arrivare a utilizzare. Quindi è solo a breve per l'allocazione della memoria. Questo è tutto ciò che è. C'è un sacco di altre fresco funzioni che hanno alloc alla fine, e si distinguono per cose diverse. Così, quando hai bisogno di stoccaggio che deve per sopravvivere la funzione corrente in modo che quando il vostro attuale funzione fugge, avete ancora i dati che si ottenuto da esso, si desidera utilizzare malloc. Che sarà inizializzare sul mucchio. E come ho detto e continuo a dicendo, ti tieni lì fino a quando gli si dice altrimenti, che è la cosa importante. Quindi una cosa da notare, e che è tipicamente molto importante, è che questo sizeof è super utile da usare perché a seconda del tipo di macchina che si sta eseguendo, esso può avere quantità variabili di memoria che richiede. Così si vuole sempre di usare la dimensione di così che non sei dipendente dalla macchina, in modo che il codice sarà eseguito su qualsiasi macchina. E questo è solo una parte di scrivere buon codice. Se funziona su una macchina, ma non tutti gli altri, quanto sia utile è stato il tuo programma? Così si vuole sempre di assicurarsi e utilizzare sizeof. PUBBLICO: Quindi è che, come il dimensione di 10 pollici [incomprensibile]? SPEAKER 1: Questa è la dimensione di 10 int. sì. Così dimensione di int tornerà quanto si fa a prendere int. O le dimensioni del carattere, come tanto fa una sola ripresa char. E poi quanti blocchi di che cosa vuoi? Quindi, in questo caso, vogliamo qualcosa che siamo in grado di memorizzare 10 int a. E funzionerà a prescindere di macchina, che è cool. Quindi, il numero di byte sarà che effettivamente dare? Rapido calcolo. PUBBLICO: 40. SPEAKER 1: 40. Esattamente. Così un altro grande cosa. Puntatore o malloc possono restituire null. Quindi, di nuovo, controllare sempre vedere se restituito un valore nullo prima si cerca di fare qualsiasi cosa con esso. Se si tenta di risolvere il riferimento questo puntatore ora, è solo andare a segmentation fault perché sei andato e provato toccare nulla quando non si dovrebbe avere. Quindi controllate sempre nullo. Anche in questo caso, tutto quello che puoi fare. Potrebbe restituire null. Si tornerà null se sei uno di spazio, o per qualsiasi motivo ha funzionato in qualche memoria bug. A volte restituisce proprio nulla. Quindi resta che verificare la presenza di esso. Questo è tutto ciò diapositiva sta dicendo. E poi quello che abbiamo qui è una chiamata a liberare. Quindi, nello stesso modo che se si aprire un file è necessario chiudere un file, se la memoria malloc, si si deve liberare quella memoria. E voi ragazzi ottenere di fare cose davvero interessanti. E c'è un programma è possibile eseguire per vedere se siete mai perdite di memoria. Ma tu non vuoi perdere la memoria. E 'davvero male. A soli incasinare le cose. E 'brutta da fare, proprio come la programmazione saggio per l'efficienza della progettazione. Ma è anche solo un po ' del male per il computer. Quindi, solo le cose gratis quando li malloc. Voi ragazzi trovare anche le simmetrie qui. Super semplice. Proprio libero e poi qualunque sia il puntatore, qualunque sia il nome il puntatore è, e si prenderà cura di liberare per voi. Freddo. Poi abbiamo questo. Quindi stiamo solo andando a camminare attraverso questo programma. E poi voi ragazzi è fatto. Così [incomprensibile] appena principale. Così abbiamo un po 'di puntatore int *. Quindi abbiamo un puntatore che sta andando a tenere int. E quanti int sta andando a tenere? Solo uno. Dimensioni di un int. Noi controlliamo se puntatore è nullo perché è, vogliamo dire non fare nulla. E 'male. Così il risultato della stampa qualche errore di memoria, il più delle volte ritorno 1, come voi ragazzi sono abituati. E poi abbiamo qui, ci dereference il nostro puntatore. Quindi questo significa che andremo a memorizzare qualcosa nella posizione dato a noi. Int * pointer, o malloc, restituisce il indirizzo di dove mettere da parte questo memoria per voi. Quindi è fondamentalmente dandovi like-- se pensare a un gruppo di case in un quartiere che si desidera inserire i mobili in, malloc è come OK, si ottiene per andare a casa tre. E ti dà la indirizzo di casa a tre. Quindi, questo proprio ora, questo puntatore negozi di un indirizzo, memorizza l'indirizzo della vostra casa. * mezzi PTR, OK, io sono a casa mia. Freddo. Ho bisogno di qualche intero. Quindi stai chiedendo a qualcuno per darvi mobili ora. Così si ottiene un po 'int. E si mette in il puntatore dove sta indicando. E poi è solo stampe fuori, hai inserito ovunque. E ancora, il riferimento. Quindi, questo è come si è andato a questo INDIRIZZO E hai visto quello che c'era. Cool? E poi, naturalmente, liberiamo il nostro puntatore. Non dimenticare di liberare il puntatore. Non dimenticare di controllare nulla. Non dimenticare di liberare il puntatore. Ci sono due cose che si ricordi da questo, o che si dovrebbe ricordare. Sì. PUBBLICO: roba [incomprensibile] così, il char * s. Come mai non ci siamo mai liberi quelli? SPEAKER 1: Hm? PUBBLICO: Sono quelli come stringhe? Hai detto che le stringhe sono proprio come char * s, giusto? Allora perché non ci liberiamo stringhe? SPEAKER 1: È solo GRATUITA Se mallocing. PUBBLICO: Oh, se stai mallocing. SPEAKER 1: Così malloc e libero sono due cose che si dovrebbe sempre avere insieme. f aperto, f vicino, due cose si dovrebbe avere insieme. In entrambi i casi, verificare la presenza di nulla. Sì. PUBBLICO: Così libero è solo permettendo qualcos'altro da memorizzare dopo questo programma ha usato? SPEAKER 1: E 'solo dicendo, OK, ho finito con questo. Non hai bisogno di tenerlo in giro. In caso contrario, il computer sarà proprio come cercare di tenerlo lì. E poi can't-- funziona in problemi di memoria successive. Hai sempre voglia di liberarlo perché racconta il computer, OK, io sono fatto con questo luogo di memoria. Si può avere indietro per me da utilizzare in seguito. Cool? Sì. PUBBLICO: Così abbiamo usato il% d appena perché un doppio che sta tornando, o perché è-- [incomprensibile]. PUBBLICO: È possibile utilizzare% i? SPEAKER 1: È possibile utilizzare% i. Tutte le domande last minute? Vai avanti. PUBBLICO: Ho solo una domanda veloce. Quindi la variabile ptr, that's-- come, con l'int * ptr = malloc, questo è solo dicendo che è che punta a un posto in memory-- SPEAKER 1: Vuoi [incomprensibile]? PUBBLICO: --that è il dimensioni di-- no, va bene. Ma è solo che punta a un posto in memoria che è proprio come quattro byte. SPEAKER 1: Giusto. Così malloc la dimensione di int dice, OK, ho intenzione di andare a correre fuori, trovare quattro byte di memoria per voi. Quando trova che quattro byte di memoria, Dà eseguire il backup l'indirizzo di dove inizia, e questo è quello memorizzato puntatore, o ptr. Buona. Ragazzi, guardate meno confuso di più la gente quando parlo di puntatore, quindi mi sento abbastanza bene in questo momento. Bene. Come sempre, voi ragazzi dovrebbe avere tutti ottenuto i voti PSet2 ormai. So che ci sono stati un po 'traballante cose dove si dice, formula non valida o qualcosa del genere. Se stai ricevendo che, tutti i voti sono validi dalla mia parte. Così posso inviarvi screenshot dei tuoi voti. Fatemi sapere e se siete manca qualsiasi gradi o qualcosa non sembra avere senso. Vieni da me. Sono stato super-orgoglioso di te ragazzi già, quindi continuate così. E avere un buon riposo della settimana. Sono sicuro che vedrò un po ' di voi in orario d'ufficio.