[RIPRODUZIONE DI BRANI MUSICALI] CAMILLE REKHSON: Hi, everyone. Benvenuti al quiz CS50 pari a zero revisione sessione. Sono Camille. E ho intenzione di andare su alcuni argomenti con te ragazzi oggi per aiutare voi prepararsi per il quiz. Quindi, ecco la nostra non esaustivo elenco degli argomenti dovrebbe avere familiarità con per il quiz. Queste sono state scattate direttamente dal programma. Lo so che sembra un sacco. Ma credetemi, che hai imparato tutti queste cose nelle ultime settimane. Così ci torneremo sicuramente su un sacco di questi oggi. Ma anche prendere un po 'di tempo sulla vostra proprio di rivedere queste cose. E se tu non fossi a conoscenza ciò che alcune di queste cose sono, assicuratevi di chiedere uno di noi. Inoltre, per la parola ufficiale sul quiz, andare a questo link. Ciò avrà tutte le informazioni con la quale stanza avete bisogno di andare in, divisi in ordine alfabetico, e anche alcuni suggerimenti su quali materiali si dovrebbe essere studiando, e che tipo di domande quiz ci si può aspettare. Quindi assicuratevi di controllare che fuori. Inoltre, alcuni suggerimenti per quando si si stanno preparando per l'esame. Pratica di codifica su carta. So che sono abituato ad avere il controllo IDE per i vostri errori per voi, e it's-- quando si sta digitando in su, è un po 'diverso che avere di scrivere le cose. Così la pratica facendo qualche codifica. Alcune buone funzioni di praticare facendo sono strlen e atoi, vedere se si può scrivere quelli da soli. Avere familiarità con i set di problemi. La maggior parte dei anni ci sono le domande che si riferiscono alla parte del materiale problema posto. Quindi, assicurarsi di aver compreso come fare tutti i set di problemi. Prova a fare alcuni dei vecchi quiz sotto il vincolo di tempo 75 minuti. Un sacco di quiz può essere di tipo lungo. Quindi è un buon modo per dare te una certa pratica, e quanto tempo ci sarà prendere, e come dovrebbe dividere il vostro tempo per assicurarsi hai finito tutto entro la fine. E anche, si ottiene una sola pagina, due foglio di riferimento facciate che si può scrivere quello che desiderare in da utilizzare durante il quiz. Così, quando si sta creando che, questo è anche veramente ottimo modo per studiare perché ti tipo di riesaminerà cose come si sta scrivendo. Quindi tutte le domande generali su il quiz, o come funziona? Già. PUBBLICO: Sarà che lista degli argomenti che hai appena mostrato di essere a nostra disposizione on-line? CAMILLE REKHSON: Questa intera diapositiva mostra sarà pubblicato sul sito web. Inoltre, il video della recensione di oggi sessione sarà sul sito web. Quindi non preoccupatevi troppo di scrivere cose giù tutto. Sarà tutto lì. Qualsiasi altra domanda? Ok, cominciamo. Quindi, una cosa da avere familiarità con è i diversi tipi di dati e la dimensione che assumono. Questo può anche essere una grande cosa per scrivere sul foglio di riferimento, solo per essere sicuri ricordare tutti questi. Ma-- così caratteri sono 1 byte. Ints sono 4 byte. Una lunga, lunga, che è sostanzialmente più spazio per un numero intero, è di 8 byte. Un galleggiante è di 4 byte. Un doppio, che fondamentalmente si dà più spazio per memorizzare un galleggiante, è di 8 byte. E poi un puntatore è anche 8 byte. Domande su questi? Così binario è un altro argomento che abbiamo coperto un po 'questo semestre. Quindi cerchiamo di fare un po ' praticare con la conversione tra il binario e decimale. Così chiunque ha idea di cosa che prima si sarebbe? Chiunque? Sì, è 42. Quindi, se vi ricordate, ogni dei luoghi in binario è fondamentalmente come 2 alla forza di quella posizione. In modo che primo spot è di 2 a 0 il potere. E abbiamo 0 lì, quindi non c'è niente. Il prossimo luogo è 2 alla prima accensione. E abbiamo un 1 lì, così che è fondamentalmente un 2. Il prossimo luogo è 2 a il secondo, che è 4. Non abbiamo nulla. Il prossimo luogo è più di 2 a il terzo, che sarebbe 8. E noi abbiamo uno lì. E noi continuiamo. Che last-- il più a uno a sinistra è dove abbiamo 32. E così, abbiamo praticamente abbiamo 32 più 8 più 2 per ottenere 42. Qualsiasi domanda? PUBBLICO: Qual è il pedice per? CAMILLE REKHSON: L'indice fondamentalmente ci dice che è binario. Quindi c'è un 2 lì. Se ci fosse like-- nel prossimo uno, o quando siamo conversione decimale a binario, c'è un 10 ci mostra che questo numero è originariamente in decimale. PUBBLICO: Grazie. CAMILLE REKHSON: Sì. Tutte le altre domande su quello? Ok, proviamo il prossimo uno poi, decimale a binario. Quindi, tenendo 50 e conclude che in binario. Come hai fatto? Già. PUBBLICO: 110010. CAMILLE REKHSON: Sì. Così tra-- un modo semplice di pensare conversione da decimale a binario è a-- che spesso aiuta a scrivere ciò che i diversi potenze di 2 sono. E poi passare attraverso di essa, e vedere qualunque sia la più alta di quelli è che si può mettere in per il numero decimale senza andare su di esso. Quindi, in questo caso, uno dei le potenze di 2 è 32. Così 32 va in 50. Ma la successiva accensione sarebbe 64, che ovviamente non va bene in 50. Così la più alta che abbiamo è il 32. Il successivo fino a 16. E 32 oltre 16 è solo 48. In modo che si inserisce ancora nel 50. Così abbiamo 1 di sia di quelli. E poi se continuiamo a scendere, l'unica cosa che abbiamo bisogno di partiti è più 2 per ottenere 48-50. Allora abbiamo un 1 in quella posizione, e uno 0 nella ultima posizione. Perché non c'è niente in 2 al 0-esimo posto. Domande sulla conversione decimale a binario? Così ora proviamo a fare qualche aggiunta binario. Come quando si aggiungono quei due in su? Già. PUBBLICO: 11100. CAMILLE REKHSON: Sì. Quindi, oltre a fare in binario è abbastanza molto simile a farlo in decimale. Tranne se si hanno due 1 dell'essere sommate, 1 più 1 è 2, ma 2 in binario è di 1 0. Quindi, si deve portare l'1, e mantenere portandola per le colonne di coppia. E a parte questo, è sufficiente aggiungere normalmente. Tutte le domande su questo? Già. PUBBLICO: Ci dispiace, che cosa è l'ultimo posto? C'è sei numeri. Così la colonna più a sinistra, quale valore si tratta? CAMILLE REKHSON: Su questo fondo? AUDIENCE: Sulla parte superiore uno, per 50. CAMILLE REKHSON: per 50? Oh, quindi quello più a sinistra è 32. PUBBLICO: 32? CAMILLE REKHSON: Sì, così sarebbe essere 32, 16, quindi 8, 4, 2, 1 o 0--. Beh, è ​​il 2 zeroth, che è 1. Già. Altre domande su questo? OK, allora stiamo andando a fare un po 'con esadecimale. Quindi questo potrebbe essere un po 'meno familiare, perché so che abbiamo fatto molto di più con binario. Ma un ottimo modo per pensare esadecimale è quello di rompere un binario numero in 4 pezzi bit. Poiché ogni 4 bit di un numero binario è fondamentalmente uno dei numeri esadecimali. Quindi, se abbiamo questa prima, abbiamo fondamentalmente otto 1 di. Così quelli può essere suddivisa up-- PUBBLICO: 255. CAMILLE REKHSON: Dire ancora una volta che. PUBBLICO: 255 in decimale, o 0xFF in esadecimale. CAMILLE REKHSON: Sì, lo è. Quindi, se si divise che fino in due blocchi di 4 bit, abbiamo praticamente abbiamo quattro serie di 1. Qual è il maximum-- fondamentalmente la massima possiamo ottenere con 4-bit in binario. E il massimo che potrebbe ottenere per che in esadecimale sarebbe un F. Così avremmo due F di. Tutte le domande su questo? Sì? PUBBLICO: Può ripetere. CAMILLE REKHSON: Certo. Così ogni, fondamentalmente, luogo di esadecimale è equivalente ai 4 bit di un binario. Quindi il modo più semplice per farlo è suddividerlo in blocchi di 4 bit. Quindi, in questo caso, abbiamo otto 1 di. Quindi, se ci dividiamo quelli in due blocchi di 4 bit, avremmo due gruppi di quattro 1 di. E ognuno di questi è equivalente a F. Se si pensa about-- So che i nostri cervelli sono tipo di wired per pensare più attraverso decimale, perché è quello a cui siamo abituati. Così un modo si potrebbe pensare ad esso come i quattro di 1 è pari al 15 in decimale. E 15 in esadecimale è F. Ecco, questo è un altro modo si può pensare attraverso di essa. Già. PUBBLICO: Qual è la 0x per? CAMILLE REKHSON: Il 0x indica che è esadecimale. Quindi abbiamo appena messo che prefisso lì, normalmente. Altre domande su questo. Ok, proviamo di andare il solo modo. In questo caso si have-- dispiace? PUBBLICO: [incomprensibile]. CAMILLE REKHSON: Stiamo andando a binario. Così, andando nella direzione opposta. Ma in questo caso, abbiamo 5 e A. Quindi, se pensiamo a questo, se ciascuno di those-- il 5 e A sono entrambi andando a rappresentare un pezzo a 4 bit, come si direbbe 5 in binario? PUBBLICO: 0101. CAMILLE REKHSON: Sì, così che è la parte 0101. E poi come diresti A dentro-- PUBBLICO: 10. CAMILLE REKHSON: Dire it-- dispiace? PUBBLICO: 10. CAMILLE REKHSON: Sì, così questa è la seconda parte di essa. E allora, se si mette quei due insieme, che è come si ottiene il pieno binario per il esadecimale. Sì? PUBBLICO: sapere che un è 1010, devi memorizzarlo? Oppure si può like-- CAMILLE REKHSON: Quindi, se you-- il differe-- così quando stai passando binario, fondamentalmente binario ha da 0 a 9 e poi A attraverso F come i suoi 16 cose. Quindi, se fino a 0 se 9-- you-- 9 e poi A, fondamentalmente se abbiamo convertito in decimale, A sarebbe come 10, B sarebbe come 11. E se si pensa al binario 1010 è 8 e 2, perché quelli sono i due luoghi che aggiungono fino a 10, che è esattamente ciò che A è equivalente a. Ecco, questo è una specie di facile modo di pensare questo. Altre questioni su esadecimale. OK, ora stiamo andando a prendere un guardare operatori bit a bit. Quindi questi può sicuramente venire sul quiz. So che non abbiamo lavorato con loro un sacco. Ma stiamo solo andando a fare una piccola recensione di questi. Così si spera questi saranno un po 'più familiare. Così i sei operatori bit a bit che abbiamo sono elencate qui. E ci hanno lasciato manipolare singoli bit. Così l'operatore è un singolo commerciale. Non confondere con quella il doppio e commerciale, che è il logico e che ci permette di confrontare due cose. Il singolo è E come possiamo manipolare le cose bit a bit. Quindi questo ci dà il risultato di 1 se entrambi degli argomenti che stiamo confrontando sono la stesso-- o sono 1. E la barra verticale, OR, darà us 1 se almeno uno di loro è 1. Quindi, in pratica esattamente ciò che le parole implicano. E, se i due bit sono 1, 1 e 1 ci dà 1. Ma con la O, se è 0 o 1, o 1 o 1, in entrambi i casi, abbiamo 1 come uno di loro. Allora ci sarebbe un 1. PUBBLICO: Che cosa vuoi dire che si dice dà 1? CAMILLE REKHSON: The risultato. Genere di, come voi would-- se avete fatto 0 e 1, il risultato che sarebbe 1-- o 0 1 e del risultato che sarebbe 0, mi dispiace. Sì, è stato tipo di risultato dell'espressione. E poi, questo simbolo di accento circonflesso è la XOR o OR esclusivo. Quindi questo significa esclusivamente una o esattamente uno dei due argomenti è pari a 1. E poi darebbe 1. La piccola linea ondulata è l'operatore NOT. Quindi, a differenza del resto di loro, che operano su un paio di bit, l'operatore NOT richiede solo un bit, e capovolgerla. Quindi, se si give-- se lo fai NON 0, si darebbe 1. E SE NON 1, darebbe 0. Sì? PUBBLICO: Qual è la differenza tra l'OR con una linea e l'OR con due? CAMILLE REKHSON: Così l'OR con due linee è la logica OR. Ecco, questo è per il confronto due interi pieni, o two-- per vedere se le cose sono uguali. O come fare questo è uguale a questo, O questo è uguale a questo tipo di cose. Considerando che il singolo bar o, è per fare le cose bit. Già. PUBBLICO: Che cosa si intende per bit per bit? CAMILLE REKHSON: Così bit funziona direttamente con i bit in binario. PUBBLICO: Oh, capisco. CAMILLE REKHSON: Sì, così lavorando con 0 e 1 di. Faremo un paio di esempi di questo dopo, solo così non è troppo confusa. E poi gli ultimi due sono il spostamento a sinistra e lo spostamento a destra. Quali sono sostanzialmente due meno segni o due maggiore di segni. E hanno spostato a bit il numero indicato di posti che si dà nella direzione. Quindi sarebbe o spostarlo a sinistra oa destra. Sì? PUBBLICO: Qual è la sintassi per l'esecuzione? CAMILLE REKHSON: Stiamo andando a passare attraverso un esempio in un secondo. Così si spera, che vi aiuterà. Tutte le domande sul proprio cosa succede qui, before-- OK. Quindi passando attraverso alcuni esempi. Cominciamo con AND quelli. Che cosa otterremmo se abbiamo fatto 0 E 1? PUBBLICO: 0. CAMILLE REKHSON: OK, e se abbiamo fatto 1, 1? PUBBLICO: 1. CAMILLE REKHSON: Sì, E se abbiamo fatto 0 O uno? PUBBLICO: 1. CAMILLE REKHSON: Che ne dite di 1 o 1? PUBBLICO: 1. CAMILLE REKHSON: OK, come su 0 XOR 1? PUBBLICO: 1. CAMILLE REKHSON: E 1 XOR 1? PUBBLICO: 0. CAMILLE REKHSON: Voi ragazzi siete bravi. Che ne dici di non 0? PUBBLICO: 1. CAMILLE REKHSON: E NON 1? PUBBLICO: 0. CAMILLE REKHSON: OK, e quindi questo ultimo uno è un piccolo con lo spostamento. Quindi, se inizialmente impostato x di essere 8, e allora y è x spostato a sinistra 3, quello che vorrei che ci danno? PUBBLICO: [incomprensibile]. CAMILLE REKHSON: Dire ancora una volta che. PUBBLICO: [incomprensibile]. CAMILLE REKHSON: Quindi, questo in realtà ci dà 64. PUBBLICO: [incomprensibile]. CAMILLE REKHSON: Quindi io sono solo intenzione di scrivere questo qui, quindi questo rende un po 'di senso. Se abbiamo 2 a 0, 2 a 1, 2 a 2, da 2 a 3 sta per essere 8. E se vogliamo spostarlo altri 3 bit a fianco, che sarebbe 2 alla 4, 2 a 5, e 2 alla 6, e 2 al 6 è 64. Fa questo ha un senso? Sì. Pubblico: fa che spostare tutti i 1 del e 0 del del numero binario a the-- CAMILLE REKHSON: Sì. E non dovrete preoccuparvi sul quiz su questi essere negativo. Non faremo avete a che fare con spostamenti negativi in ​​alcun modo. Tutte le altre domande su questo? Sì. PUBBLICO: Se è lo spostamento a destra, è tutto ciò che wasn't-- tutto ciò che non era originariamente parte della cosa 0? CAMILLE REKHSON: Sì, si farebbe basta aggiungere 0 di sopra in originale. Già. PUBBLICO: Allora, qual è che il 100 spostato a destra per tre volte? CAMILLE REKHSON: 100 spostato a destra, in modo che avrebbe preso tutte le 1 e 0 e nel loro trasferimento a destra il numero di volte voi di spostare verso destra. PUBBLICO: [incomprensibile]? CAMILLE REKHSON: Beh, sono 100-- si parla di 100 in binario, o 100 in decimale? PUBBLICO: Mi dispiace, 100 in binario. CAMILLE REKHSON: 100 in binario, se si sposta alla destra- sopra se si sposta a destra una volta, sarebbe diventato 10. Se si sposta verso destra due volte, sarebbe diventato 001. E poi se si sposta di nuovo, è sorta di perdere bit. Sì, questo è solo 0. Altre domande su questo? Sì. PUBBLICO: Ecco che allora diventa 000. CAMILLE REKHSON: Sì. Ok, andiamo attraverso un po 'di matematica ASCII. Così i personaggi possono essenzialmente essere trattati come numeri interi in base ai loro valori ASCII. Quindi, se ci siamo seduti int A è uguale a 65, int B è uguale ad A + 1, int char C è uguale D meno 1, e salmerino D è uguale a 68, cosa stampare in fondo? Quindi, stiamo stampando these-- benedire you-- siamo la stampa di questi tutti fuori come caratteri in base alla percentuale C. Quindi stiamo fondamentalmente stampare il valore del carattere di tutti e quattro di queste variabili. Come un suggerimento, 65 è il valore ASCII del capitale A. Forse che ci ha aiutato. Che cosa? PUBBLICO: ABCD. CAMILLE REKHSON: Sì, così questo sarebbe stampare esattamente ABCD perché abbiamo impostato int A pari al valore ASCII di A. Quindi, se il risultato della stampa che come un carattere, otteniamo appena maiuscola, A più 1 sarebbe una B maiuscola in ASCII. D meno 1 sarebbe la C maiuscola in ASCII. E 68 è il valore ASCII di D. Domande sulla ASCII? Sì. PUBBLICO: Quindi, le virgolette intorno A, fa che il cambiamento A ASCII? CAMILLE REKHSON: Si uses-- esso count-- virgolette intorno alla A rende un carattere. E se hai a che fare con nel numero di form-- così quando, come in questo caso, è essere trattata come un int-- allora sarebbe fare con il suo valore ASCII. Sì. PUBBLICO: Ti consigliamo di abbiamo una tabella di riferimento ASCII? CAMILLE REKHSON: Non think-- PUBBLICO: O sarebbe solo che fare con questi? CAMILLE REKHSON: Penso che abbiamo sarebbe farlo con le cose facili. Non credo che sarebbe male a scrivere forse cosa maiuscola e minuscola A sono, solo quali quelle gamme iniziano con. Ma non credo che avete bisogno di prendere tutto lo spazio per mettere un tavolo intero ASCII. Già. PUBBLICO: Qual è la differenza tra il dire int A e char C, come si fa in cima? CAMILLE REKHSON: Quindi è solo come che è memorizzato. Ma si può trattare in entrambi i modi. Come si vede qui, facciamo stampa la A come un carattere. PUBBLICO: Ecco lo stesso di A? CAMILLE REKHSON: Sì. Qualsiasi altra domanda? PUBBLICO: Così, cento C sta dicendo stampare un char? CAMILLE REKHSON: Sì. PUBBLICO: Quindi, anche se A ha solo stato definito come un numero intero, se cerchiamo di stampare un char come 65, è would-- CAMILLE REKHSON: Sarebbe andare fondamentalmente va a tabella ASCII e ottiene qualunque personaggi nel grafico ASCII per quel 65. PUBBLICO: Grazie. CAMILLE REKHSON: Sì. Sì? PUBBLICO: Quindi, se avete fatto% I,% I, % I,% I, sarebbe solo print-- CAMILLE REKHSON: Sì, se hai fatto tutto 4% del I, sarebbe stampare il ASCII valori di tutti e quattro questi. Qualsiasi altra domanda? OK, così ambito, in fondo questo ci aiuta a determinare dove una variabile esiste nel vostro programma. Così abbiamo parlato di due diversi tipi di ambito, globali e locali. Se una variabile è ambito a livello globale, significa che l'intero programma ha accesso a quella variabile. E se a livello globale ambito di una variabile, è dichiararlo prima della funzione principale. Così è fatto bene fuori del blocco. E poi tutta la tua programma può accedervi. Se è ambito solo localmente, che variabili confinata in una regione specifica. Quindi, se si dichiara all'interno di un ciclo for, solo che per il ciclo può accedervi. Oppure, se si dichiara in una funzione specifica, solo che funzione può accedervi. Domande sulla portata. OK, così la funzione di prototipazione. Fondamentalmente perché C, quando si compila, si legge dall'alto verso il basso. Se si dichiara una funzione ritardo nel codice, il compilatore non sa che tale funzione esiste. Quindi ciò che usiamo sono prototipi, che sostanzialmente dicono al compilatore, questa funzione esiste, andare a cercare per lo più tardi nel codice. Quindi il modo di fare un prototipo di funzione è esattamente come si inizia off scrivere una funzione. Si dà il tipo di ritorno, il nome della funzione, e poi ogni argomento che tale funzione richiede. Così, per guardare un esempio veloce, in questo caso la nostra funzione che stiamo usando qui è fondamentalmente una funzione cubo. Quindi, tenendo in un numero intero e restituendo il cubo di quel numero intero. Quindi perché abbiamo scritto che funzione sotto la funzione principale, e vogliamo usare il Uscita di che-- o noi vuole che la funzione nella nostra funzione principale, abbiamo messo la sua strada prototipo nella parte superiore del nostro programma. E poi, quando chiamiamo nella nostra funzione principale, il compilatore sa che tale funzione è scritta più tardi, e che andare a cercare per esso, e userà correttamente. Domande sulla prototipazione? Sì. PUBBLICO: Allora, qual è il punto? Non capisco il punto di prototipazione. Perché non basta avere laggiù? CAMILLE REKHSON: Beh, se è qui, poi, quando si arriva alla linea cubo x nella funzione principale, il compilatore non hanno idea che la funzione del cubo esiste realmente. PUBBLICO: Non potresti appena messo di fronte? CAMILLE REKHSON: E ' una migliore pratica di codifica di mettere sotto la funzione principale. Ecco, questo è il motivo per cui ci sarebbe fare la prototipazione. Solo perché, se si aveva un sacco di funzioni, sarebbe davvero disordinato a leggere tutte quelle funzioni prima di arrivare alla carne del vostro programma. Gia ', e hai avuto un q-- PUBBLICO: Così, si dichiara la variabile nella parte superiore in modo da potervi accedere, farne una variabile globale? È che simile a questo dove è dichiarandolo lassù, in modo che sappia che sta andando per accedere in un secondo momento e si può utilizzare? CAMILLE REKHSON: Sì. Sì. PUBBLICO: Dovrebbe the-- qualsiasi ulteriore funzioni che creano chiave al di fuori di questa cosa, or-- CAMILLE REKHSON: Sì, se siete la creazione di altro principale functions-- è di per sé il function-- quindi se si sta creando altre funzioni, devono essere al di fuori. Sì? PUBBLICO: Che percentuale D? CAMILLE REKHSON: Percentuale D è la stessa cosa di cento I. Si riferisce ad un numero intero. Sì. PUBBLICO: Allora, qual è int FARE principale? Qual era quel vuoto? CAMILLE REKHSON: Void dice ci vuole in alcun argomento. PUBBLICO: [incomprensibile]. CAMILLE REKHSON: Può voi parlare un po 'più forte, mi dispiace? PUBBLICO: Sì, mi dispiace, perché ha fatto si mette annullare per il primo, e poi int ingresso per il secondo? CAMILLE REKHSON: Oh, per i due different-- per la funzione principale contro la funzione del cubo? Così nella funzione principale, usiamo nulla perché non c'è sono parametri che possono prendere in. Mentre nel cubo la funzione, abbiamo un input. Ecco perché si dice int, ingresso, perché ci sono argomenti che siamo prendendo per eseguire la nostra funzione. Già. Sono ci sono domande? OK, e poi rapidamente virgola mobile imprecisioni. Così abbiamo infiniti numeri reali. Ma ci sono solo un numero finito di bit che possiamo utilizzare per visualizzare quelli numeri, e li rappresentano. Allora si finisce con alcune imprecisioni. E i numeri non lo farà sempre essere abbastanza esattamente cosa si pensa che sono quando sei trattare con virgola mobile. Questo è solo qualcosa di buono a sapersi. Domande su questo? Sì. PUBBLICO: È questo riferimento all'idea di bit di overflow che era in conferenza? Era che qualcosa di separato? CAMILLE REKHSON: Sono completamente separato, sì. Ok fantastico. Pulak GOYAL: Hi, everyone. Il mio nome è Pulak, e io essere andare oltre i puntatori. OK, quindi cerchiamo di pensare prima su ciò che la memoria assomiglia. Quindi, come potete vedere qui, abbiamo prendere la memoria e ci dividiamo in su in un gruppo di blocchi. E referenziamo ogni bloccare da un indirizzo, giusto? E qualcuno si ricorda che tipo di notazione che usiamo per indicare un indirizzo? PUBBLICO: esadecimale, 0X. Pulak GOYAL: esadecimale, giusto? Così il 0X significa che siamo parlando esadecimale. OK, così come possiamo creare puntatori? Così prendiamo il tipo, abbiamo mettere it-- aggiungere una stella ad esso, e poi aggiungiamo il nome della variabile. Così gli esempi che abbiamo visto sono int stella x, y char stella, e galleggiare iniziano z. Così, quando dico int stelle x, qualcuno può dirmi quello che sto tipo di parlare di lì? Pubblico: La posizione del disco. Pulak GOYAL: Ci dispiace, che cosa? Puoi ripetere? PUBBLICO: La posizione del disco. Pulak GOYAL: Così actually-- così che cosa Volevo dire, è quando abbiamo int stella x, stiamo dicendo è la creazione di un puntatore, e può memorizzare l'indirizzo di un variabile che è un int, giusto? Quindi, con char stella y, stiamo creando un puntatore che può memorizzare l'indirizzo di una variabile che è un char. In modo che ha senso a tutti? Ok bello OK, così con i puntatori, ci sono due operazioni importanti che possiamo fare. C'è riferimento, e c'è dereferencing. Sì? PUBBLICO: Potrebbe andare un po 'più lento? Pulak GOYAL: Certo. Sì, so-- Sì, fare domande come vado lungo se you-- se qualcosa non è chiaro. Così abbiamo referenziamento e dereferencing. Quindi, quando si vuole ottenere l'indirizzo di una variabile, quindi utilizzare la e commerciale. Quindi diciamo che ho dichiarato int x da qualche parte. E voglio ottenere l'indirizzo di quel e passarlo in, farei commerciale x. E quando si desidera ottenere la valore associato con un puntatore, si utilizza il dereference operatore, che è una stella. Quindi, consente di dire che ho avuto int stella x, e Ho avuto indicando qualcosa. Se voglio ottenere il valore di ciò che è indicando, vorrei solo fare stella x. È chiaro? Tutte le domande di questo? Già. PUBBLICO: Quindi in generale, è non sarà in grado di fare in x e stella x con lo stesso x. Questo è corretto? Perché se x è un variabile, allora hai a fare in x per ottenere che si tratta di un puntatore. Ma se x è un puntatore, allora avete bisogno fare stella x per ottenere la variabile. Pulak GOYAL: Sì, in modo che il domanda era su quando usiamo un star-- quando useresti la stella, e quando usiamo la commerciale, e possiamo usare con lo stesso tipo di variabile? Quindi, di solito se avete, per esempio, un int x, si sarebbe per lo più utilizzare il commerciale per ottenere l'indirizzo di questo. Poiché non fa senso di deferenza in x. Considerando che, se avessimo int stella x, si sarebbe utilizzato il funzionamento dereference perché non avrebbe senso utilizzare in x in quel caso. Fa questo ha un senso? PUBBLICO: così non si può e, quindi un puntatore? Pulak GOYAL: Così si tecnicamente, in realtà può fare la e commerciale di un puntatore. Ma questo è fuori dalla ambito di questa classe. Per la purpose-- per i vostri ragazzi ' scopi, ogni volta che si hanno puntatori, si desidera utilizzare l'operatore dereference per ottenere il valore associato a tale. E quando si hanno regolare variabili, come un int x, si desidera utilizzare la e commerciale operatore per ottenere l'indirizzo di questo. ok? Ok, diamo un'occhiata a puntatori e cosa succede sotto il cofano. Quindi la prima cosa che ho fatto qui è l'int dichiarato x è uguale a 5. L'indirizzo di questa variabile è 0x04, e il valore è 5. Quindi vediamo cosa succede con la riga successiva. Così ora si dichiara un puntatore. Il suo indirizzo è 0x08, e la sua valore è l'indirizzo di x. Questo fa senso per tutti? Tutte le domande di questo? OK, e ora vediamo cosa accade con la riga successiva. Quindi, con questa riga successiva, abbiamo l'indirizzo della copia essere 0x10, e il suo valore è 5. Quindi la ragione abbiamo ottenuto cinque è abbiamo detto, dereferenziare puntatore, che abbiamo dichiarato un int stella. E così went-- quando abbiamo dereferenziarlo, ha detto, bene, ciò che è nello slot 0x04. Ed è andato a quello. E che x è un x0-- 0x04, e il valore è 5. Questo fa senso? Sì? PUBBLICO: Perché è l'indirizzo della copia a soli 4 byte sopra il puntatore x? Pulak GOYAL: Sì, questo è un errore on-- CAMILLE REKHSON: Quindi, sì, ricordo questo è scritto in esadecimale. Pulak GOYAL: Oh, sì. CAMILLE REKHSON: Quindi questo è in realtà 8 e poi 16 perché abbiamo detto che, il puntatore, ricorda, nel nostro IDE sta per essere lungo 8 byte. Pulak GOYAL: Sì. Quindi, solo per essere chiari, puntatori sono lunghi 8 byte. Un int è di 4 byte. Quindi la ragione per cui ciò saltato da 0x04 a 0x08 è perché abbiamo dovuto fare un salto di 8 byte. E poi siccome for-- copia è solo un int, è 4 byte, che è la metà di 8 byte. Così abbiamo appena saltiamo a 0x10, che è due di distanza da 0x08. Qualsiasi altra domanda? OK, let's-- sì? PUBBLICO: Perché non è il valore di int copia solo the-- perché è 5 invece di 0x04? Pulak GOYAL: OK, perché è 5? OK, così quando the-- così di lasciare prima pensare a questo in termini di tipi. Così sto dicendo int copia è pari a puntatore stella. Allora, qual è il tipo di puntatore? È un int stella. E quando ho dereferenziare che, il tipo diventa un int. Allora, cosa ci aspettiamo di memorizzare qui è in realtà un int. Questo fa senso? PUBBLICO: Certo, un po '. Pulak GOYAL: Così, di solito quando si pensa in termini di tipi, esso aiuta a capire che cosa è il tipo del valore che dovrebbe andare lì. Così di solito si può escludere molti di questi errori comuni pensando in termini di tipi. Lasciami andare attraverso un po 'più diapositive. E possiamo ottenere domande a la fine della sezione puntatore. OK, così abbiamo un programma buggy qui. E così fa anyone-- qualcuno può dire me ciò che è sbagliato con questo programma? Giusto, quindi quello che siamo aspettandosi di fare qui è-- quello che vogliamo fare è prendere la variabile int x e girare it-- renderlo uguale 5 invece di 3 e quindi stampare quello. Ma questo non sta accadendo. Qualcuno può dirmi perché? Sì? AUDIENCE: Quando la funzione to_five prende x come è argomento, non ci vuole x sé, ma invece crea una copia, un, di esso. E costituisce operazioni su questo. Ma a causa di questo, non è necessario modificare il valore effettivo di x. Dal momento che sei [incomprensibile]. Pulak GOYAL: Destra, a destra, in modo che quando chiamiamo la funzione to_five, cosa stiamo facendo è il pensiero, darmi una copia del valore di tale funzione. Tale funzione, poi, sta andando e facendo alcune manipolazioni. Ma una volta ritorna, è ora fuori del campo di applicazione della funzione principale qui. E così x è ancora, infatti, pari a 3, e stampiamo 3. Ok, e vediamo come questo accade. OK, quindi non c'è niente dichiarato. Quindi, qui, x è pari a 3. E ora è-- alla posizione due, una non è ancora portata. E adesso andiamo a posizionare tre, dove una ormai assume il valore di 3. Alle quattro, ora cambiamo una a 5. Ma ora, quando salto indietro a cinque, che è l'istruzione print, a è ormai fuori portata. E X è ancora pari a 3. Questo senso per tutti? OK, ora parliamo di come possiamo utilizzare i puntatori per risolvere questo problema. Qualcuno ha qualche idea su come noi potrebbe risolvere questo problema utilizzando puntatori? PUBBLICO: si prende in un int stella invece di un int per to_five. Pulak GOYAL: Siamo spiacenti, si potrebbe parlare? PUBBLICO: si prende in un int stella invece di un int per to_five. Pulak GOYAL: OK, sì. Quindi cerchiamo di pass-- invece di passare solo il valore, passiamo per riferimento. Questa nuova funzione, giusto? E così facendo passare l'indirizzo, abbiamo può fare manipolazioni sull'indirizzo. E così siamo in realtà, infatti, cambiando x. Vediamo quindi come funziona. Ok, quindi in questo esempio abbiamo riparato. Abbiamo cambiato la nostra firma di to_five a prendere in un int protagonista invece di un int qui. Poi abbiamo dereference questo un 5 e assegnare ad esso. E ora questo sarà, infatti, stampa 5. Così vediamo come le fasi di lavoro qui. Quindi, con il primo passo, non c'è nulla ancora dichiarata. Così qui, con la seconda fase, abbiamo detto x è uguale a 3, ma una è ancora fuori portata. Ora, per la terza linea, abbiamo x è ancora pari a tre. E ora, abbiamo superato dentro-- ciò che è memorizzato in un ora l'indirizzo di x. Questo fa senso tutti, come siamo arrivati ​​che? A destra, abbiamo la amper-- è così che abbiamo passato una e commerciale x alla funzione to_five. E poi alla riga successiva, cosa che facciamo, è noi dereferenziare a. E dereferenziando una, siamo in grado modificare il valore di x da 3 a 5. Perché x vive a quell'indirizzo 0x12. E poi, alla fine, quando torniamo indietro a principale, Anche se questo è un ormai fuori ambito, abbiamo, infatti, cambiato x. Ed è 5. Avete domande su questo? Sì? PUBBLICO: Mi puoi dire quello che la e commerciale x era? Ho pensato e commerciale era come ED. Pulak GOYAL: Sì, quindi usiamo lo stesso simbolo per molte cose diverse. Così qui, quando si have-- in questo caso, quando si hanno, Io guess-- quindi in questo caso, quando hai a che fare con i puntatori, quando si mette la e commerciale di fronte di un int, una variabile int, o un char, o un flusso, che cosa stai dicendo è, dammi l'indirizzo di questo. Ma quello che stavi pensando, quando il resto si usa commerciale è, diciamo, in un'istruzione if. Si dispone di un vero, e alcune variabili che restituiscono qualche booleano, e alcune altre variabili che convalidare alcuni booleano e si desidera ottenere il e di quella. Poi si può usare la e commerciale. SPEAKER 1: Sì, così proprio oggi, abbiamo parlato di tre diversi usi di commerciale. Abbiamo due e commerciali, che è cosa Pulak ha appena descritto. Abbiamo una commerciale, che è ciò che ha descritto Camille in precedenza, che è uno commerciale. E questo è per AND bit a bit. E notare che sia il e- condizionato o, mi dispiace, il logico e il bit E, quelli hanno due numeri, giusto? E 'stato qualcosa di commerciale qualcosa e commerciale, qualcosa commerciale qualcosa. Qui, quando non ci resta che commerciale qualcosa, che è dereferencing. Pulak GOYAL: Sì, grande questione. Già. PUBBLICO: Perché in linea 5a e stella di un diventare N / A? Perché non solo tipo di mantengono la stessi valori della riga precedente? Pulak GOYAL: Perché abbiamo usciti la funzione. E così quello che happens-- così cosa-- ora siamo fuori portata di quella funzione, ciò che accade in realtà è quelli vengono rimossi dalla memoria. Già. PUBBLICO: Tra 3 o 4 stelle un uguale 5. Pulak GOYAL: Sì. PUBBLICO: Che cosa esattamente denotano? Pulak GOYAL: Che cosa vuol dire? PUBBLICO: Sì. Pulak GOYAL: Così il domanda era: che cosa è che-- cosa stai facendo in linea quando diciamo, stella è uguale a 5? Quindi ricorda la stella operatore dereference. Così, quando un, in questo caso, è un puntatore. Si tratta di un int stella. Così, quando abbiamo dereference un by Con la stella, quello che stiamo dicendo è, andare a tutto ciò che è memorizzato in indirizzo, memorizzato in a-- così take-- così una, in questo momento, ha qualche indirizzo memorizzato in esso. Vai a quando tale indirizzo indica, e ora modificare qualunque cosa sia a cinque. Già. PUBBLICO: Si può dire in termini più semplici? Modificare l'indirizzo di un a 5. Pulak GOYAL: Non siamo cambiare l'indirizzo di un a 5. A ha qualche indirizzo in esso, che è il indirizzo della variabile di interesse. E così quello che stiamo dicendo quando abbiamo dereferenziare è, ora vogliamo change-- ora stiamo riferimento l'interesse direttamente della variabile. Fa questo ha un senso? SPEAKER 1: Un altro modo di pensare di esso è go-- così a è un indirizzo. La star dice recarsi in tale affrontare e guardare il suo valore. E ora impostarne il valore su 5. Così si dice, andare al indirizzo di x, che sta per essere ciò che è memorizzato in una, e modificarlo in 5. Pulak GOYAL: Sì? AUDIENCE: Quindi la posizione è dove il puntatore sta andando, l'indirizzo. Ma il valore è un assegnato il valore in base all'indirizzo. Pulak GOYAL: Sì. Tutte le altre domande su questo? PUBBLICO: Ho una domanda. Pulak GOYAL: Sì, mi dispiace. PUBBLICO: Quindi, quando si store-- così se stai dicendo [incomprensibile] a. Pulak GOYAL: Sì. PUBBLICO: Dovete memorizzare l'x con una e commerciale? Perché non si può semplicemente dire x prima int [incomprensibile]? Pulak GOYAL: So-- PUBBLICO: [incomprensibile]. Pulak GOYAL: Allora è la tua interrogo oh. Quindi la tua domanda è, perché non può we-- alla funzione to_five, perché non possiamo basta passare un x, giusto? PUBBLICO: Giusto. Pulak GOYAL: OK, sì, quindi questo nuovo risale alla nostra discussione sui tipi. Quindi la funzione to_five ora in attesa di un tipo di stella int. Allora, qual è il tipo di x? X è solo un int. Ma che cosa questa funzione si aspetta è un int stella. Quindi si aspetta una variabile che ha un indirizzo memorizzato in esso. Ecco come you-- mettere il commerciale, e in modo che sia come si passa in indirizzo, che è now-- e che interpreta che come un int stella, sì. Grande domanda. Altre domande su questo? Ok bello. OK, ora parliamo circa l'aritmetica dei puntatori. Così qui, aggiungendo e sottraendo i regola il puntatore per i volte la dimensione di il tipo di puntatore byte. Quindi diamo un'occhiata a come che sembra. Così qui, abbiamo dichiarato int x è uguale a 5. E adesso andiamo a dichiarare un puntatore y, e passare l'indirizzo di x lì. Così abbiamo che. Quindi x è conservato a 0x04. Così ora y è uguale a quello. E qualcuno può dirmi quello che pensano accadrà quando facciamo y più uguale a 1? Sì? PUBBLICO: Cambierà a 0 volte 0 8? Pulak GOYAL: Dimensione e type-- PUBBLICO: si sta spostando l'indirizzo. Pulak GOYAL: Sì è era-- sì. Così giusto. Così cambierà a 0x08. E perchè-- così devi usare questo formula 1 volte la dimensione del puntatore e gli indicatori sono di size-- [STUDENTI MURMUR] Pulak GOYAL: Giusto. [STUDENTI MURMUR] SPEAKER 1: Quindi il tipo che il puntatore punta a-- Pulak GOYAL: È, sì, sì, è 4 byte. SPEAKER 1: Così interi sono 4 byte. Pulak goyal: Quindi se avessimo a-- LET'S diciamo abbiamo dichiarato, credo, un char. Che cosa sarebbe che-- quindi diciamo noi avere char x pari ad un o qualcosa del genere. E abbiamo avuto l'indirizzo che a 0x04, cosa sarebbe y più uguale a 1 ora fare? Mi dispiace che cosa? PUBBLICO: 0x05. Pulak GOYAL: 0x05, a destra. Ritiene vedere a tutti che? OK, e ora diciamo che si tratta di un galleggiante. Cosa succederebbe? Chiunque? Così galleggianti sono quanti byte? PUBBLICO: 4 byte. Pulak GOYAL: Giusto. Quindi sarebbe la stessa cosa di questo. Raffreddare. OK, e ora parliamo su puntatori e array. Così hai visto questo sul precedenti due serie p, dove possiamo treat-- array così e puntatori non sono la stessa cosa. Ma possiamo trattare array come puntatori. Ecco, noi abbiamo questo array qui, che ha tre slot. Nella prima abbiamo slot-- avere uno, due e tre. Quindi, se we-- così possiamo assegnare che dicendo, abbiamo matrice, dereference questo. E poi quando abbiamo dereference che, quello che stiamo effettivamente facendo si riferisce alla stessa slot. Così matrice stella è uguale a 1. Abbiamo could- come potrebbe scriviamo che-- ciò che è un modo alternativo potremmo scrivere questo? PUBBLICO: Array 0 uguale a 1. Pulak GOYAL: Esattamente, fa vedere a tutti che? Quindi, stessa cosa in questa sede. Così, quando abbiamo matrice più 1, abbiamo fare-- così even-- ricordare con l'aritmetica che abbiamo appena parlato, quando lo facciamo più 1 o spostarlo sopra da 4 byte, a destra. Ritiene vedere a tutti che? E quel lato, quando dereferenziare che, possiamo impostare che a 2. Ed è così che abbiamo impostato il blocco successivo a 2. E così un modo alternativo per scrivere che sarebbe anche la staffa di matrice 0 staffa è uguale a 1. PUBBLICO: Avete bisogno le parentesi? Pulak GOYAL: Sì, perché sei dereferencing l'intero quantitativo matrice più 1. OK, e stessa cosa per il campo più 2. Avete domande su questo? Già. PUBBLICO: Così array è automaticamente impostato a 0? Pulak GOYAL: Array è-- scusate, che cosa? PUBBLICO: Array è 0. L'indirizzo di array è solo 0. Pulak GOYAL: Quindi la domanda era, è l'indirizzo di matrice appena 0? Quindi, no, array ha qualche indirizzo. Così, quando abbiamo dereferenziarlo, that's-- in modo da poter pensare about-- letteralmente come un puntatore che punta all'inizio di un array. In modo che ha qualche indirizzo. Non sappiamo di cosa si tratta. Ma quando abbiamo dereferenziarlo, sappiamo questo è l'inizio della matrice. E così quando ci muoviamo da 1, stiamo solo muovendo rispetto a quando tale indirizzo era. Qualsiasi altra domanda? Sì? PUBBLICO: Quindi, se si fa Staffa di matrice più 1-- Pulak GOYAL: Siamo spiacenti, I-- si potrebbe parlare? PUBBLICO: Sì, se si fa Staffa array [incomprensibile]. Allora se si mette il pointer-- Pulak GOYAL: Mi dispiace, non ti sento. Puoi dire ancora una volta? PUBBLICO: Sei OK. Pulak GOYAL: OK, mi dispiace. Ok bello. Any-- sì. Quindi, quando si va in fascia matrice 3-- Pulak GOYAL: Sì. PUBBLICO: --isn't there-- non sarebbe che sia quattro punti come 0, 1, 2, e 3? Perché non è int array di 2? Pulak GOYAL: No, così appena la convenzione C è-- quando si dichiara la matrice, we-- il numero che abbiamo messo lì è il numero di slot che vogliamo. Ma gli indici dell'array sono in realtà di matrice 0, 1 campo, e la matrice 2. Quindi è solo la convenzione sul nostro modo di dichiarare gli array. Sì, tutte le altre domande? Già. PUBBLICO: Quindi siamo ancora parlando di puntatori, giusto? Pulak GOYAL: Sì. PUBBLICO: Potrebbe ancora fare protagonista di matrice 0 è uguale a 1? Pulak GOYAL: No, no, so-- OK, quindi la domanda è stata possibile basta fare staffa matrice stelle zero e quindi dire che uguale a 1. Quindi, no, quello che stiamo dicendo qui è che possiamo think-- possiamo trattare array come puntatori. Così abbiamo have-- ciò che siamo detto è che abbiamo due modi Finora riferimento allo stesso blocco. Quindi, se avete doing-- matrice pari a zero, il tipo di che ora è un int. E se si prende la stella che, si ottiene una cosa valida. Quindi quello che stiamo dicendo qui, è ci sono due modi alternativi per indicare lo stesso blocco. È possibile fare matrice Staffa 0 è uguale a 1. Oppure si può fare dereference matrice, e che hanno uguale a 0. Quindi, solo due modi di facendo la stessa cosa. Già. PUBBLICO: Perché non è dimensioni di int 1 per aggiungere a-- Pulak GOYAL: Dimensioni del 1 int. PUBBLICO: Perché questo è in movimento una tantum. Pulak GOYAL: Perché questo è solo il modo in C funziona. E 'solo il modo in cui puntatore aritmetica è definito. Ci vorrà il puntatore. E allora tutto ciò si aggiunge ad esso, sarà moltiplicare che dalle dimensioni di qualsiasi il negozio puntatore è, sì. Già. PUBBLICO: Così si dice possiamo trattare puntatori e array lo stesso, ma che sono diversi. Quindi, ciò che li rende diversi? Quello che non possiamo fare con uno ma non l'altro? Pulak GOYAL: Ai fini del presente classe, credo che it's-- cosa fare you-- SPEAKER 1: Quindi, we-- OK, così, per ad esempio, se si alloca la memoria e si dispone di un puntatore a un numero intero, ad esempio. Se si è tentato di avviare fare l'aritmetica dei puntatori e andare oltre la quantità di memoria che voi assegnato, devi correre in errori. Sappiamo con gli array, abbiamo Dico prima del tempo, OK, vogliono allocate-- questo essenzialmente dice, voglio ripartire abbastanza spazio per tre numeri interi. E così ora possiamo trattare memoria, come se abbiamo tutti e tre questi numeri interi. Fa quel tipo di senso? Pulak GOYAL: Sì. Già. PUBBLICO: Quindi una stella array, è che l'assegnazione di 1 al 0 indice dell'array? Pulak GOYAL: Sì. PUBBLICO: Quindi, qual è il dopo due righe successive in termini di the-- I capire che si sta cercando utilizzare l'aritmetica dei puntatori qui, ma ancora una volta, non capisco che cosa è l'aritmetica dei puntatori. Così la matrice più 1, sei dicendo che sei ora andando a voler parlare di il primo indice nella matrice. Pulak GOYAL: Giusto, e così il ragione per cui funziona è matrice, qui, possiamo pensare come un int stella. E così, quando facciamo l'aritmetica dei puntatori su di esso, ricordare la formula dove prendiamo the-- Credo che qualunque l'indirizzo corrente è, e poi quando aggiungiamo 1 ad esso, in realtà moltiplicare 1 dalle dimensioni della la cosa che stiamo manipolando. Quindi, in questo caso, la dimensione di un int. E poi ci spostiamo trasmette entro tanto. SPEAKER 1: Quindi finta avete b matrice stella. Pulak GOYAL: OK, sì. SPEAKER 1: Con la mano. Andare qui. Pulak GOYAL: O posso solo-- sì. OK Così qui--, così davanti alle tue inizio, è proprio qui. Così, quando abbiamo dereferenziare array, eravamo solo con riferimento al primo blocco qui. Ma ora quando faccio matrice più 1, che è-- che la freccia è ora proprio qui. Fa questo ha un senso? Giusto, perché questo blocco è di int size, che è 4 byte. E così, quello che stiamo facendo è che siamo in movimento che puntatore 4 byte oltre. Ogni volta che facciamo aritmetica su di esso, sarà sempre spostarla con incrementi di 4 byte. Perché questo è come un int stella. Questo fa senso? OK. PUBBLICO: Così le cose nella matrice sono stati 5 byte, saremmo spostiamo 5 bytes-- Pulak GOYAL: Giusto, quindi se abbiamo avuto una stella char, saremmo spostiamo da solo 1 byte. Quindi, nel caso di char stelle, che sarebbe solo essere sposta sopra di 1. PUBBLICO: Per ottenere il accanto hai bisogno di una stella. Pulak GOYAL: Sì, sì, fa questo ha un senso? SPEAKER 1: Possiamo chattare a questo proposito più avanti. Pulak GOYAL: Sì, sì, di sicuro. Ok bello. Passiamo alla sezione successiva. SPEAKER 1: Oh, OK fresco. Si Quello sono io. Va bene, impressionante. OK, fresco, quindi ora siamo su un po ' informazioni più generali sulla memoria. Inoltre, apprezzo il fatto che stavano andando abbastanza rapidamente. E 'un sacco di materiale per ottenere attraverso in un'ora e mezza. Ma se ci sono argomenti vuole andare più in profondità in, stiamo andando ad avere orario di ufficio di questa settimana dove è possibile chattare con noi uno contro uno. Oppure si può semplicemente venire al finisce e noi chiacchieriamo di cose. E, come sempre, liberi di porre domande. Eccezionale. Quindi, ecco la nostra immagine di memoria che che abbiamo visto in conferenza un miliardo di volte. E noi sappiamo che questo stack cresce dal basso e l'heap cresce verso il basso. E qual è la differenza tra le cose che manteniamo sul mucchio e le cose che manteniamo nello stack? Qualcuno buttare qualcosa là fuori. Già. PUBBLICO: E 'pila per le cose che sono solo variabili impermanenti che siamo solo dichiarando utilizzando alcune funzioni? SPEAKER 1: Bello, sì. Così ogni volta in cui, diciamo dire che siamo in una funzione, e non ci resta che alcune variabili locali. Coloro che stanno per finire in pila. Se, invece, si chiama malloc e in realtà allocare memoria, che viene sempre dal mucchio. Quindi, sì freddo? E così ricordare che qualsiasi memoria allocare utilizzando malloc, che sta andando a finire sul mucchio. E se si dimentica di gratuitamente, il computer di non andare a sapere che hai finito con esso. Quindi è solo andare a appendere fuori in memoria. E tu sei essenzialmente perdite che la memoria. Stai perdendo. Perché non hai mai detto il computer, hey Ho finito di usarlo, sentitevi liberi di utilizzare, mettere altre cose lì. Raffreddare. Tutte le domande lì? Sì. PUBBLICO: Che tipo di memoria è pila? Alimenti non dinamico, delegato? Cosa vorresti chiamare? SPEAKER 1: Certo, così si potrebbe pensare ad esso come variabili locali. Chiamate a funzioni reali stanno per impilare. Qualunque altra cosa? Sì? PUBBLICO: Come si fa gratis la memoria che si aggiunge a the-- SPEAKER 1: Certo, in modo che quando si assegnano memoria heap, si chiama malloc. E così allora che ti dà indietro un puntatore a qualche indirizzo nella memoria. Così dicono che hai chiamato puntatore, giusto? Poi, basta dire puntatore gratuito. E che libera la memoria. Raffreddare. Altre domande? Sì. PUBBLICO: Che cosa allocata dinamicamente significa? SPEAKER 1: assegnato dinamicamente significa, nel corso del programma. Così, quando si chiama malloc in Al centro del programma, all'inizio del programma, non c'è memoria allocata. E come il computer passaggio attraverso quel codice, sta andando a allocare la memoria. Ecco, questo è ciò che intendiamo per dinamicamente. Bella domanda. Sì? PUBBLICO: Quando si definisce un array con le parentesi quadre, fa che ancora [incomprensibile]? SPEAKER 1: Questa è una buona domanda. Penso che quando si assegnano un array, in realtà mette in pila. Io non sono positivo circa che, quindi non mi citare. SPEAKER 2: Penso it-- sì mette in pila. SPEAKER 1: Mette in pila. OK, fresco, ha confermato. Altre domande? Sì? PUBBLICO: Quando si delega malloc, non fa il computer automaticamente allocare memoria per le variabili? SPEAKER 1: Sì, per le variabili locali, si mette automaticamente memoria sullo stack. PUBBLICO: Quindi qual è la punto di usare malloc? SPEAKER 1: Qual è il punto di usare malloc? Così abbiamo visto un po 'di esempi, come, per esempio, utilizzando scambio, dove vogliamo che il campo di applicazione la variabile di essere qualcosa di là solo la sua chiamata di funzione. E noi vogliamo qualcosa che siamo in grado di passare intorno e che possiamo accedere da luoghi diversi. Ecco dove ci piacerebbe mettere la memoria sul mucchio. Così che tutti questi diversi le funzioni possono accedervi. PUBBLICO: si può solo spiegare che? SPEAKER 1: Quindi una opzione è-- così il domanda era, possiamo semplicemente allocate-- scusate, possiamo dichiarare una variabile globale, essenzialmente. Questa è una opzione. Ma con un sacco di quelli, quelli tendono a diventare davvero disordinato. E generalmente si pensa anche di questo cattivo design. Già. Fresco, tutte le altre domande? Eccezionale. OK, andare avanti. Quindi, questo è in realtà il modo in cui allocare memoria. Abbiamo parlato di questo un po '. Usiamo questo funzione chiamata malloc. E gli dite quanti byte in memoria, quindi quanti byte sul mucchio, tu vuoi. E sta andando a restituire l'indirizzo, quindi un puntatore, un pezzo di memoria che è allocata per voi. Così il tipo sarà nulla stella. Sta andando essere un puntatore a tutto ciò che si decide di mettere in là. Ogni volta che si chiama malloc, abbiamo già detto dovete liberare così noi non hanno perdite di memoria. Qual è l'altra cosa che è assolutamente hanno a che fare ogni singolo volta che si chiama malloc? OK, è necessario liberarlo. Qual è l'altra cosa? Controllare per nulla, bello. Quindi, sì, è proprio lì sul bordo. Se volete provare a ripartire memoria e non hanno memoria di sinistra, il computer sta per dire, Non ho nulla da darti. E ti dà indietro nulla. Domande su questo? Già. PUBBLICO: Perché mai voglia di dichiarare un puntatore con un tipo specifico quando vuoto stella in grado di gestire tutti i tipi di puntatore comunque? SPEAKER 1: Buona domanda. Perché dovremmo dire int stelle al contrario di annullare stella quando vuoto stella in grado di gestire tutto? Quindi noi non vogliamo mai esplicitamente espressi puntatori. E 'solo una cattiva pratica. Ma parleremo int stelle così come una comprensione di, questo è un puntatore a un numero intero. PUBBLICO: OK. SPEAKER 1: Sì, e permette di manipolare i valori in essa come interi. PUBBLICO: Oh, OK. E nulla stella non avrebbe permesso di farlo? SPEAKER 1: Dipende dal Sì contesto, quindi non preoccupatevi non preoccupatevi troppo sul tipo lì. Basta sapere che, in generale, malloc restituisce un puntatore a qualcosa. Bella domanda. PUBBLICO: Perché si moltiplica cronometra 10? [Incomprensibile]. SPEAKER 1: Certo, quindi ero solo facendo esempio a caso qui dove Volevo allocare abbastanza spazio per memorizzare 10 numeri interi. Solo una scelta casuale. Già. Già, che cosa succede? PUBBLICO: Quello che fai significare controllando per nulla? Vuoi controllare il puntatore nullo o il malloc? SPEAKER 1: Sì, esattamente. Quindi la domanda era, cosa cosa si intende per controllo da zero? Vogliamo a-- ogni volta che chiamiamo malloc e stiamo tornati un puntatore, vogliamo dire, è puntatore uguale a null? Così letteralmente PTR. È PTR uguale a null. Sì. PUBBLICO: Allora, ero tipo di chiedersi, se inizializzare il puntatore nella malloc, fa puntare all'inizio del malloc? Perché se si tratta di un array-- SPEAKER 1: Questa è una grande domanda. Sì, se si chiama malloc, la puntatore che it-- diciamo, ecco allochiamo 10 byte di memoria. Quindi, mi dispiace, abbastanza ambiente per 10 interi, stiamo andando a ottenere l'indirizzo di che primo pezzo della memoria. Questa è una buona domanda. Già. PUBBLICO: Assegnando 10 interi diffusi, potrebbe effettivamente utilizzare che puntatore come like-- quasi come un array di interi? SPEAKER 1: Sì, potete farlo anche voi usarlo come un array di interi? Sì, esattamente, questo è ciò che Pulak solo mostrato si on-- una coppia scivola fa, dove si dice, OK, questo è davvero solo tipo di-- noi può pensare ad esso come un array di 10 interi. Succede solo per essere sul mucchio. Pubblico: Ma non si poteva accedere con la notazione parentesi quadra? SPEAKER 1: Si effettivamente poteva accedere con la notazione parentesi quadra, sì. Si può trattare loro lo stesso. Sì. PUBBLICO: Perché sarebbe puntatore mai essere nullo? SPEAKER 1: Perché sarebbe puntatore mai essere nullo? Se si intende utilizzare il backup di tutti la memoria del mucchio. Se il programma sta mangiando, divorare, mangiare la memoria, e non c'è niente di sinistra, poi malloc sta per say-- se dici, Voglio altri 100 byte, sta andando per dire, non ho 100 byte. Ecco nullo. Ciò significa, ho fallito. Sì. Pubblico: In questo caso, nulla è nulla, giusto? SPEAKER 1: Sì, in quel caso, nulla è nulla. Non hai indirizzo. Non c'è memoria. Va bene, andare avanti. Ok, parliamo molto velocemente su buffer overflow. Quando possiamo incontrare overflow del buffer? Diciamo che abbiamo a-- noi allocare un pezzo di memoria, e abbiamo intenzione di scrivere la stringa. E stiamo per dire, OK, ho intenzione di stanziare abbastanza spazio per sei caratteri. E ho intenzione di chiedere l'utente un certo input. E gli input dell'utente, ad esempio, ciao. E che si adatta perfettamente bene perché abbiamo spazio a tutti i personaggi di ciao, e il carattere di terminazione null. Un sacco di spazio, nessun problema. Ma cosa succede se diamo l'occasione per un utente del male per usare il nostro programma, e digitare non sei caratteri, o meno cinque personaggi, ma un milione. Continuano dattilografia, e digitando, e dattilografia, che cosa succederà? Beh, diamo solo la enough-- computer o dispiaciuto, abbiamo solo dato questa stringa spazio sufficiente per 5 caratteri. Quindi, stiamo andando a ottenere qualcosa di simile questo, in cui la persona malvagia che è digitare in ingresso può sovrascrivere la dimensione del buffer, e può effettivamente andare oltre l'importo che è originariamente assegnati. E allora cosa si può fare, il cosa davvero male si può fare, è sovrascrivere l'indirizzo di ritorno. Il che significa fondamentalmente si può sorta di prendere controllo del comportamento del programma. Così ad un livello molto alto buffer overflow è quando allocare una certa quantità di memoria. E poi you-- questo perché sei prendendo l'input dell'utente o qualcosa come che-- si va oltre i limiti di ciò che hai originariamente assegnato e iniziare a rovinare il vostro programma. Sì? PUBBLICO: Perché non vorrei che solo restituire un errore di segmentazione? SPEAKER 1: Perché non vorrei che restituire un errore di segmentazione? Potrebbe. A volte il compilatore o durante uno dei tuoi runtime è in realtà sta per verificare. Se certe cose accadono, e questo è una specie di livello inferiore, allora avete bisogno di sapere. Ma se non si progetta questi sistemi correttamente, allora si ha la possibilità di non averlo scoperto e solo permettendo al computer la take-- persona malvagia per controllare il computer. Già. PUBBLICO: [incomprensibile]? SPEAKER 1: Certo. Oh, quando dico di buffer, voglio solo dire la quantità di memoria che avete assegnato. Così qui ho detto, oh, abbiamo assegnato a sei char-- abbastanza spazio per sei caratteri. E ho appena chiamo il mio tampone dove potrei scrivere le informazioni. Già. Altre domande su questo? Già. PUBBLICO: Come si fa a fermarlo? Come si fa a fermarlo? SPEAKER 1: Awesome domanda. Come si fa a fermarlo? Come si fa a evitare buffer overflow? Beh un modo per farlo è qualcosa di simile GetString, dove siamo costantemente aumentiamo la quantità di memoria che allochiamo se l'utente immette un sacco di testo. Un'altra cosa è, se solo vogliono sei personaggi, fare un rapido controllo. Dire solo l'ingresso di sei caratteri. Già. Quindi diciamo che eri lavoro on-- stiamo andando per andare a roba web un po ' più tardi nel naturalmente-- ma cerchiamo di dire che si sta lavorando su un modulo, si farebbe solo limitare la quantità potrebbe consegnato. Già. PUBBLICO: GetString tira memoria dalla pila, giusto? Giusto per chiarire? SPEAKER 1: Ancora una volta? PUBBLICO: Fa GetString prendere la memoria dalla pila? SPEAKER 1: Credo Getm-- get int prende memoria dal mucchio perché richiama alloc. PUBBLICO: Oh. OK. SPEAKER 1: Sì, malloc e realloc. Altre domande? Già. PUBBLICO: Quindi definendo la dimensione del buffer, si impedisce a qualcuno di poter iniettare codice che può scorrere oltre il [incomprensibile]. SPEAKER 1: Quindi, definendo la dimensione del buffer, hai detto, OK ecco come quantità di memoria che possiamo usare. Se si consente all'utente di scrivere su di esso, allora si sta andando a correre in problemi. Ha senso. Eccezionale. Andiamo avanti. Tutto ok. Parlando di errori, qui sono alcuni messaggi di errore comuni che potrebbe essere mostrato mentre eri codifica, lavorando sui vostri insiemi di problemi. Buona probabilità che uno dei Questi spettacoli sul quiz se negli ultimi anni sono alcuna indicazione. Quindi, le risposte sono un po ' qui sul bordo. Ma sentitevi liberi di gridare un po '. Perché un errore di segmentazione potrebbe accadere? Perché si potrebbe ottenere un segmentation fault quando si esegue il programma? PUBBLICO: [incomprensibile]. SPEAKER 1: Good. Sì, se cerchiamo di accesso memoria che non è dato a noi. Se dereference un puntatore nullo. Ad esempio, se si chiama malloc, e dimenticare di verificare se è nullo, e cerchiamo solo di usarlo, il computer del ci darà un errore di segmentazione. Bene. Che dire implicita Dichiarazione della funzione? Cosa significa? PUBBLICO: Si sta cercando di utilizzare un funzione che non è stata definita. SPEAKER 1: Good. Stai cercando di utilizzare una funzione che non è stato definito. Quindi, che potrebbe essere una delle due cose. Forse era come l'esempio Camille vi ha mostrato in precedenza. E si dispone di una funzione principale che chiama qualcosa chiamato cubo. E diciamo hai dimenticato a scrivere questo prototipo. Hai dimenticato di dire, ehi di computer, Ho questa funzione chiamata cubo. Vedrai più tardi. Diciamo che si è dimenticato di scrivere il prototipo, si potrebbe ottenere questo errore. Un'altra cosa è, diciamo si è tentato di utilizzare printf, e dimenticato di includere la libreria standard, poi sta andando a dire implicita la dichiarazione della funzione. Ultimo ma non meno importante, identificatore non dichiarato. Già. PUBBLICO: Hai un ambito problema. Come forse si sta cercando di chiamare una variabile locale che è in un diverso tipo di zona. SPEAKER 1: grande, quindi se avete una variabile che non è nel campo di applicazione, e si sta cercando di usarlo, si sta andando a finire nei guai. E appena più in generale, diciamo si tenta di utilizzare x, con mai dire int X equivale 5, allora sei andare a correre nei guai. Mi scusi, domande su questo? Impressionante, sbuffando a destra lungo. OK, ricorsione, perché might-- facciamo see-- Ho perso il mio sch-- oh qui andiamo, Basta fare in modo che siamo circa nei tempi previsti. Va bene, fresco. OK, ricorsione, l'idea generale di ricorsione, una funzione ricorsiva è una funzione che si chiama. OK, quindi questo è quello che ho significa da un concetto di programma per cui una funzione chiama se stessa. Quale sarebbe some-- che cosa è una buona ragione per usare la ricorsione? Quando può essere utile? O che cosa è un programma che davvero si presta a ricorsione? PUBBLICO: La ricerca binaria. SPEAKER 1: La ricerca binaria si presta a ricorsione, perché avete questo problema che si possono scindersi in pezzi più piccoli, e continuamente eseguire lo stesso algoritmo su di esso. Questo porta a, in molti casi, più codice elegante che è più preciso. Abbiamo appena siamo l'esempio di ricerca binaria. Un altro esempio è merge sort. A volte, quando si pensa di un algoritmo, come fattoriale, ci si sente proprio ricorsivo, giusto? Perché sappiamo che il fattoriale 5 è un fattoriale 4 volte 5. E così quando si imposta un problema in questo modo, ci si sente proprio ricorsivo. Quindi sarebbe un ottimo modo di scriverlo. Domande? Sì. PUBBLICO: Che cosa è un caso base? SPEAKER 1: Oh, che è un caso base? Ho detto, non dimenticare per includere un caso base. Diciamo che stavamo scrivendo una funzione fattoriale, e stavamo facendo fattoriale di 5. E sappiamo un fattoriale di 5 è 5 volte un fattoriale di 4, bla, bla, bla, bla. Come facciamo a sapere quando smettere? Come facciamo a sapere che abbiamo in realtà hanno un numero? Perché se continuava a chiamarmi fattoriale, allora avremmo mai ottenere una risposta, giusto? Così, quando sappiamo come fermare nell'esempio fattoriale. Chiunque, sì. AUDIENCE: Quando il 1 fattoriale è 1. SPEAKER 1: Good. Così sappiamo. Siamo in grado di dare per scontato che 1 fattoriale è pari a 1. Quindi, se si arriva al punto in cui stiamo chiamando fattoriale su 1, basta andare avanti e tornare 1. E questo è il vostro caso base. Perché sappiamo che una volta che ci ha colpito, e abbiamo sempre colpiremo che, ci never-- noi non solo andare avanti per sempre. Tutte le altre domande sulla ricorsione? Sì. PUBBLICO: Quindi quando si torna 1, solo automaticamente si fermerà il programma, giusto? SPEAKER 1: Sì, così quando si chiamare ritorno 1, se: diciamo, diciamo fattoriale di 2 chiamate fattoriale di 1, fattoriale di 1 sarà solo restituire 1. E ora fattoriale di 2 dirà OK, 2 volte 1 è 2, e restituire la risposta. Sì. PUBBLICO: Dobbiamo preoccupare sull'ambito in ricorsione quando si va in un algoritmo? SPEAKER 1: Ah, sì. Sì, non dovete preoccuparvi di portata nel contesto della ricorsione. Così solo le variabili definite in tale esecuzione della funzione stanno per essere utile. Si buona domanda. Va bene, continuiamo muove lungo. Perché abbiamo un sacco di materiale da ottenere attraverso. Ma come ho detto, non esitate a colpire orario di ufficio, o noi dopo il fatto. Questo è solo uno scivolo molto veloce. Abbiamo imparato molto su ricerche e ordinamenti. Per favore, per favore, per favore, queste sezioni sono in linea, Credo che a cs50.net/quizzes. Quindi, andare a fare questo grafico e mettere sul vostro foglio di revisione, perché ci saranno una domanda su questo. Si prega di non sbagliare. Proprio molto rapidamente, cosa significa questo grafico, è si parla di grande o, che, come sappiamo essere il limite superiore di un algoritmi tempo di esecuzione. E abbiamo omega, che è sarà il limite inferiore di un runtime algoritmi. ok? PUBBLICO: [incomprensibile]. SPEAKER 1: Sì, che è l'ultima cosa? Che cosa è theta? E 'se we-- stiamo andando solo preoccupano in questa classe, nel caso dove il nostro limite superiore e il nostro limite inferiore sono gli stessi. Sì, questo è l'unica volta che è andando a venire in questa classe. OK, ho intenzione di andare avanti. Se non avete preso la vostra immagine, Prometto questi saranno on-line. OK, impressionante, le strutture. Perché potremmo desiderare le strutture? Che cosa è un motivo utile potremmo desiderare strutture. Qualcuno gridare qualcosa. Bene diamo un'occhiata al esempio sulla scheda. Diciamo che abbiamo a che fare con tutti questi studenti. Se stiamo facendo un programma per CS50, ci sono come 800 persone. Dobbiamo write-- stiamo andando a necessità di gestire un sacco di informazioni sugli studenti. Sarebbe bello se potremmo tipo di gruppo Questa poi tutte le informazioni che ha a che fare con un particolare studente in un tipo di dati. Ma sappiamo che c'è nessun dato tipo chiamato, Studente, giusto? Abbiamo un numero intero, abbiamo un galleggiante, abbiamo una stringa, o una stella char, ma non abbiamo, uno studente. Così possiamo fare è in realtà tipo di definire la nostra propria struttura, chiamano studente, e possiamo associare alcuni campi diversi con quella struct. Quindi, in questo caso, diciamo dire che abbiamo uno studente. E le cose che ci interessano circa sono il numero ID studente e il nome dello studente. E ora siamo in grado di associare questo ID e questo nome con un determinato studente. Vediamo quindi alcuni esempi. Ok, ecco io dico, va bene, andiamo diciamo che vogliamo fare uno studente. Lo chiamo studente 1. E il suo numero di identificazione, in questo caso, si può accedere da solo facendo il nome dello studente dot il campo si vuole accedere. Quindi questo sarà solo studente 1 dot ID, e abbiamo impostato pari a 1. Perché ricordate, abbiamo detto che ID sta per essere un numero intero. E in modo molto simile, si può dire, questo il nome dello studente sarà Davin, per esempio. Così possiamo solo accedere campo di una struttura con questo punto. Domande su questo? Già. PUBBLICO: C'è un modo per proteggere le variabili? C'è un modo per proteggere le variabili da cui si accede dall'esterno? SPEAKER 1: C'e 'qualche cosa per proteggere le variabili da cui si accede dall'esterno? Non nel campo di applicazione del CS50. Altre domande? Già. PUBBLICO: Qual è typedef struct? Che cosa significa ogni componente significa? SPEAKER 1: Ah, che cosa è typedef struct? Che cosa significa ogni componente dire di questo ragazzo? PUBBLICO: Sì. SPEAKER 1: OK, fresco. Quindi questo dice, hey computer, ho vuole creare una nuova struttura. E ho intenzione di definire una definizione per questo, in modo tale che potrei usarlo come se fosse un tipo tutto il mio programma. Ok, quindi voglio definire una struttura. E io ora intenzione di essere grado di usarlo come un tipo. E il suo nome è studente. E qui ci sono i suoi campi. PUBBLICO: Così è che typedef struct [incomprensibile]? SPEAKER 1: Se si vuole essere in grado di utilizzare questa struct tutto il programma, e nella maggior parte dei casi in CS50 noi fare, dobbiamo dire tipo Def. E che gli permette di utilizzare lo stesso modo in cui usiamo come int o float. Il computer sempre sa di cosa si tratta. Già. PUBBLICO: Possiamo scrivere questo nel file di intestazione? SPEAKER 1: Oh, mi dispiace. Scriviamo questo nel file di intestazione? Si potrebbe scrivere questo nella parte superiore del vostro il programma, nella parte superiore del vostro programma c. Sì, che sarebbe la più posto ragionevole per esso. Là dietro. PUBBLICO: Stessa domanda, quindi prima principale? SPEAKER 1: Giusto, avete bisogno di questo per essere da qualche parte che tutti possono accedervi. Quindi, prima principale nel tuo caso, sì. PUBBLICO: C'è una differenza tra mettendo studente in alto e in basso? SPEAKER 1: Ah, c'è un differenza tra studente mettendo in alto o in basso? Let-- salvare quella domanda, e quando si arriva a liste concatenate, vedremo che, OK? Così mantenere quella per un secondo. L'ultima cosa che voglio citare qui, è invece di avere una struttura, abbiamo un puntatore a una struttura, possiamo cambiare la nostra notazione per essere un po 'più bello. Possiamo dire, diciamo che abbiamo un puntatore a uno studente e non solo uno studente. Se vogliamo l'accesso a un campo, invece di facendo, anche andare dereferenziare il puntatore, e quindi accedere al nome del campo. Questa notazione sembra un po ' disordinato con la stella in questo punto. Completamente corretto, ma una sorta di modo più pulito per farlo, è solo per dire nome puntatore freccia. E che in realtà combina dereferenziazione e l'accesso a un bel simbolo. Domande su questo? PUBBLICO: Basta dire che ancora una volta. SPEAKER 1: Dire che ancora una volta. PUBBLICO: Esattamente quello che hai appena detto. SPEAKER 1: Certo, esattamente quello che ho appena detto. Se abbiamo un puntatore ad uno studente piuttosto che lo studente stesso, abbiamo can-- un modo che si possa accedere al campo è a dereferenziarlo, e poi Nome accesso. Un altro, molto più gradevole noi può farlo, che è solo un po 'di zucchero sintattico, è solo fare puntatore a nome freccia. E che sta per combinare la dereferencing e che accede. Sì, abbastanza fresco. Tutto ok. Quindi parliamo di l'altra domanda. Saltiamo a nodi, che andremo ad utilizzare in liste collegate in appena un secondo. Così qui, noterete che ci è il nodo di parola sia sul fondo, e sulla parte superiore. Prima, quando stavamo definendo studente, abbiamo avuto solo studente sul fondo. Non abbiamo avuto studente sulla parte superiore. Qualcuno sa perché che potrebbe essere? Qual è la differenza? Già. PUBBLICO: Quindi si utilizza il nodo è la definizione di nodo, quindi è una cosa ricorsivo? SPEAKER 1: Good. Sì, abbiamo bisogno dei nostri nodi avere puntatore ad altri nodi. Quindi, dal momento che usiamo questo tipo prima che sia realmente definito, abbiamo bisogno di mettere al top solo così si sa cosa sia. PUBBLICO: Così abbiamo ancora bisogno in fondo? SPEAKER 1: Sì. PUBBLICO: Quindi, sempre in basso. SPEAKER 1: Sempre nella parte inferiore. Quindi, tutto sarà tuo hanno in fondo. Qualsiasi altra domanda? Va bene, così lascia in realtà parlare su liste collegate molto velocemente. Così liste concatenate are-- li usiamo invece di array in alcuni casi, perché sappiamo che gli array sono un lunghezza fissa, mentre le liste collegate siamo in grado di crescere e restringersi come vogliamo. Quindi questo è un esempio di ciò che una lista collegata potrebbe essere simile. Quello che dobbiamo vedere è la testa della lista. Allora, dove l'elenco inizia. E poi nodo, ogni nodo successivo, è responsabile di conoscere dove il nodo successivo è. Quindi, in questo caso, il nodo che memorizza 1 è responsabile per sapere dove 3 è. La persona che memorizza 3 è responsabile per sapere dove 9 è. E 9 ha nessun altro per puntare a. E 'la fine della lista, così si dice proprio nulla. ok? PUBBLICO: Qual è il punto di questo? SPEAKER 1: Qual è il punto di questo? PUBBLICO: Sì. SPEAKER 1: Perché, diciamo dire che abbiamo alcuni dati. E noi non sappiamo esattamente come molti dati vogliamo prima del tempo. Quindi, con una matrice, diciamo dove siamo vogliono contare le persone in prima fila. È probabile che non cambierà. Possiamo solo dire, OK, vuole un array di dimensione sei. Ma se vogliamo qualcosa che sta per cambiare. Per esempio, diciamo che stavo cercando per tenere traccia degli studenti come vengono nella stanza per la sessione di revisione. Non ho idea di quanti di voi la gente va a vedere. Così potrei desiderare una struttura di dati che io possa espandersi e restringersi. Perché forse qualcuno sarà lasciare, forse qualcuno verrà. E così, in qualsiasi momento, abbiamo può aggiungere o rimuovere i nodi. Fresco, grande domanda. Già. PUBBLICO: Se è possibile utilizzare qualcosa come GetString che mantiene consentendo di ottenere più dati come ne avete bisogno, perché avete bisogno di questo? SPEAKER 1: Perché sarebbe si utilizza quando collegato lista si può usare qualcosa come GetString? Questa è una buona domanda. Ricordate che Get-- uno dei le cadute di GetString è che non abbiamo fatto molto buon lavoro di liberare quella memoria, e abbiamo introdotto una serie di perdite di memoria nel vostro programma? Si potrebbe prendere un staticamente array di dimensioni e continuare a crescere esso. Ma dovresti trovare nuovi luoghi in memoria. Sarebbe solo un sacco di spese generali. Una delle cose belle di legato liste al contrario di array, array è sono tutti nella stessa posizione nella memoria. Deve essere continua blocchi di memoria. Mentre liste concatenate, 2 e 3 maggio essere totalmente in luoghi diversi. Come 2 è finita qui, e 3 è qui. E finché hanno un puntatore tra loro, va bene. Sappiamo che possiamo trovare. Domanda laggiù? PUBBLICO: GetString è una funzione nella biblioteca CS50, giusto? Non esiste in programmi reali. SPEAKER 1: Corretto. A destra, questa è l'altra cosa. GetString non esiste al di fuori del contesto di CS50. Già. PUBBLICO: Così fa il fatto che due potrebbe essere davvero distanti tra loro, fa che l'impatto l'efficacia di Accedendo gli elementi della lista? SPEAKER 1: Questa è una grande domanda. La domanda era, lo fa impatto l'efficienza di accesso questi diversi elementi nella lista. Attualmente si. Perché sappiamo se: facciamo diciamo che vogliamo per accedere il secondo elemento della matrice, sappiamo possiamo solo fare staffa 1 campo, a destra. Sta andando sempre la stessa posizione. Ma se vogliamo arrivare a quel 3, non possiamo dire, andare a prendere quel 3. Dobbiamo dire, OK, inizio alle l'inizio della lista, e ora in realtà abbiamo camminare attraverso finché noi trovare il numero che ci interessa. Quindi, in questo caso si dice, OK questo è il primo numero. Quindi, in sostanza, questo è indice 0. Ora dobbiamo trovare il secondo numero. Questo è indice 1. Ecco, questo è realmente accadendo a-- solo accesso, sta per prendere tempo N. Fresco, grande N. vecchio Già. PUBBLICO: Quali sono ciascuna delle liste? Sono ogni array, o che cosa? SPEAKER 1: Questa è una grande domanda. Quali sono ciascuna delle strutture che ho disegnato? Sono nodi. Così ognuno di questi piccoli struttura ha due parti. Ha un intero che contiene. Ecco i dati effettivi che sta trattenendo. Questo è il tipo di parte utile. E questo è ciò che rende una lista collegata, ha un puntatore al nodo successivo. Impressionante domanda. Va bene, diamo un'occhiata molto rapidamente guardare alcuni esempi di ciò che che potremmo fare con liste collegate. Così un esempio molto rapido è, supponiamo di voler fare una ricerca. Che tipo di ricerca non può facciamo su liste collegate? PUBBLICO: Binario. SPEAKER 1: Binario. Perché non possiamo usare la ricerca binaria? PUBBLICO: [incomprensibile]. SPEAKER 1: Già, perché con binario ricerca, abbiamo dovuto fare affidamento sul fatto che potremmo saltare solo nell'array in qualsiasi punto. Potremmo dire, andare all'elemento centrale. In questa sede, come abbiamo detto un po 'prima, non possiamo saltare l'elemento centrale. Al fine di trovare qualsiasi elemento, in realtà camminare attraverso tutta la nostra lista. Quindi, se volessimo fare una ricerca, la cosa migliore che possiamo fare è solo una ricerca lineare. Partiamo dalla testa, abbiamo check-- diciamo che siamo alla ricerca di 9-- partiamo alla testa. Noi diciamo, è il 9? No. E 'questo 9? No. E 'questo 9? Sì, abbiamo trovato. Ok, questo è tutto quello. Ecco un po 'di pseudo-codice. Ho intenzione di lasciare questo per voi ragazzi a sfornare sopra per conto proprio, solo perché stiamo correndo un po 'a corto di tempo. Parliamo di inserimento. Abbiamo visto una demo davvero cool di questo in conferenza in cui abbiamo detto, OK, abbiamo questa lista concatenata dove tutti sta puntando tra loro, e qualcuno arriva sul palco. Come possiamo che inseriamo persona nella nostra lista collegata? Beh, un modo sbagliato di fare, che Penso che è quello che abbiamo visto prima, è quando la persona in anteriore automaticamente indicò la nuova persona. E poi abbiamo abbandonato l'tipo di seconda metà della lista, giusto? Perché noi non sappiamo dove è nella memoria più. Quindi, per essere molto attenti alla ordine in cui inserire le cose. Ecco, diciamo che vogliamo mettere 1 nella parte anteriore della nostra lista. In primo luogo, abbiamo 1 punto al secondo element-- o l'elemento che contiene 1. Così, lo facciamo, solo così non siamo andando a perdere il secondo tempo. E ora, siamo in grado di avere la testa punto a 1. Così ancora una volta, questo è solo come super alto livello. Questo è come vorremmo inserire un nodo. Abbiamo un sacco di pseudo-codice qui-- dispiace, Non so perché sono definendolo pseudo-codice. E 'il codice vero e proprio. Si può andare a controllare più tardi. Va bene, facciamo molto quickly-- altre domande su liste concatenate prima io spostare su un altro paio di dati strutture nelle nostre ultimi 10 minuti. PUBBLICO: Dobbiamo ora come scrivere su un test? SPEAKER 1: abbiamo bisogno di sapere come a-- PUBBLICO: Scrivere su un test. SPEAKER 1: c'è bisogno a-- si dovrebbe essere pronti scrivere, inserire, rimuovere, e la ricerca di liste concatenate sul test. Questo è qualcosa che abbiamo poteva aspettarsi di fare. Basta andare su di esso. Se avete domande sul codice, spara il tuo TF una e-mail, venire a orari di ufficio. C'è ancora un sacco di tempo di studiare, di non preoccuparsi. Va bene, qualsiasi altra domande circa le liste collegate? Sì. PUBBLICO: Quindi, se non si utilizza il puntatore per andare a quella a destra prima di utilizzare il puntatore per quella a sinistra, che è l'equivalente di cancellazione tutto bene? SPEAKER 1: Sì. PUBBLICO: [incomprensibile]. SPEAKER 1: Giusto, dato che non possiamo farlo, in realtà è ancora peggio. Perché non solo non sappiamo dove si trova, non possiamo più usarlo, ma we've-- non siamo liberando più che la memoria. Quindi è solo in giro e non essere utile perché non riusciamo a trovarlo. Sì, domanda fresco. Va bene, parliamo di stack. Abbiamo visto stack molto rapidamente. Sono primi in ultima strutture dati fuori. Quindi pensiamo degli stack in Annenberg di vassoi dove pila cose sulla parte superiore. E se avete intenzione di arriva ottenere un vassoio, sei sempre andando a prendere quello sulla superiore, che è la più recently-- che è la cosa che più recentemente messo in cima alla pila. Così si può sorta di pensare a questo tipo di visivo quando si sta pensando di pile. E allora, abbiamo spuntato qualcosa la parte superiore della pila. Se are-- oh, e le parole che abbiamo usare quando si parla di questi dati strutture di solito, se mettere qualcosa in pila, diciamo che stiamo spingendo in pila. E se prendiamo qualcosa dallo stack, diciamo che stiamo popping dallo stack. Se avete intenzione di implementare un stack-- che ho sicuramente consigliamo di provare fuori-- sei andando a voler tenere traccia di, diciamo che si sta utilizzando un array. So che in conferenza abbiamo parlato sull'utilizzo di entrambi gli array o liste concatenate per implementare uno stack. Se stai usando un array, è necessario keep-- scusa me-- abbiamo bisogno di tenere traccia delle dimensioni e della capacità. Quindi il numero massimo che il nostro stack può contenere. Domande sulle pile? PUBBLICO: Qual è la differenza tra le dimensioni e la capacità? SPEAKER 1: La differenza tra dimensione e la capacità, domanda impressionante. Quindi diciamo che siamo utilizzando una matrice, e allocare spazio sufficiente per 10 numeri interi. E cominciamo a riempire che fino. E spingiamo cose, e abbiamo pop cose fuori. Vogliamo tenere traccia del massimo numero possiamo tenere, che è la capacità. E vogliamo tenere traccia del numero attuale che abbiamo, che è formato. Bella domanda. Tutto il resto su pile? Va bene, parliamo su sorpresa, le code. A differenza di stack, che sono prima in ultima out, questi sono first in, first out. Quindi questo è like-- pensare ad una linea. Pensate di fila presso l'Apple Store per ottenere qualsiasi prodotto. E la prima persona in linea dovrebbe essere la prima persona che ha aiutato. Quindi, prima cosa che ha spinto sia questa la prima cosa che è spuntato. Raffreddare? Molto similarly-- oh, le parole che usiamo invece di spinta e pop-- che ho appena usato, Sono sorry-- è diciamo, se stiamo mettendo qualcosa in la coda, diciamo accodato esso. Se stiamo prendendo qualcosa fuori la coda, diciamo noi rimosse dalla coda. Si. I può essere pronunciando quelle sbagliato, ma si ottiene l'idea. E poi di nuovo, proprio come pile, se stiamo applicazione del presente come matrice, abbiamo bisogno di tenere traccia del dimensioni, la capacità e la testa. Cosa intendo per la testa? Perché abbiamo bisogno di mantenere traccia della testa? PUBBLICO: perché è lì l'inizio della vostra lista è. SPEAKER 1: Sì, fondamentalmente la testa è in cui l'inizio di una coda è. Perché sappiamo, a differenza di stack, which-- Io vado a cercare di affrontare questa way-- sappiamo che sta andando sempre ridurre in questo modo e crescere in questo modo. Code, la gente viene sull'estremità e lasciare fin dall'inizio, quindi dobbiamo tenere traccia di cui l'inizio è. Questo è ciò che intendo per che dobbiamo tenere traccia di dove la testa è. Raffreddare? Tutto ok. Otto minuti, coppia più argomenti, possiamo farlo. Va bene, tabella hash. Abbiamo parlato molto brevemente su tabelle hash. Per il quiz, è sufficiente loro capire ad un livello elevato. L'idea di base è che hai questi dati. E vogliamo accedere in tempo che è più veloce di qualcosa come un collegato lista. Perché abbiamo detto, se dovessimo la ricerca attraverso una lista collegata, che potrebbe prendere tempo N. Anche l'accesso può assumere Tempo N in una lista collegata. Le tabelle hash darci un modo che possiamo accedere più rapidamente le cose, e molto altro cercare rapidamente le cose, senza con i vincoli di un array dove abbiamo fissato dimensioni. Quindi pensiamo di una struttura dati in cui, dove lo mettiamo nella struttura dati dipende da questo funzione hash magico. Quindi, in questo caso, l'hash magica funzione è solo prendendo una parola, controllando ciò che la prima lettera è, e poi basta smistamento in ordine alfabetico. Così abbiamo essenzialmente li mettiamo in diversi secchi. Quando vediamo banana, diciamo, OK, mettiamo nel secchio B. Quando vediamo di Apple, andiamo metterla in un secchio. Se abbiamo visto albicocca, diamo messo in un secchio. ok? Quindi suppongo io stavamo cercando for-- I Non lo so, che cosa è un altro frutto? Supponiamo che io stavo cercando arancione. Dove devo cercare? Nel secchio O. Sì, c'è un solo posto che arancio potrebbe essere, OK? Così ho detto prima quello che succede se: bene ho detto prima, diciamo che abbiamo messo albicocca dentro-- ma io davvero affrontare il fatto che, oh no, se dovessi mettere in bacca, è che va in conflitto con la banana. Dove la mettiamo se c'è già qualcosa nella nostra tabella? Bene, abbiamo un paio di opzioni. Opzione numero uno è lineare sondaggio, che in pratica significa, diciamo che voglio provare a mettere bacca, e io vedo, oh no, banane già lì, Dico solo OK, lascia mi aspetto per il prossimo posto disponibile. Così cammino per, dico, oh, non c'è nulla nel secchio D. Non posso davvero pensare di qualsiasi frutta che iniziano con la lettera D, quindi sto solo andando a mettere bacca in là. Durian. Ok, dato che non c'è nulla in là ancora, Potrei anche semplicemente utilizzare quel posto. Qual è lo svantaggio di questo? PUBBLICO: E 'fuori uso. SPEAKER 1: Siamo spiacenti? PUBBLICO: E 'fuori uso. SPEAKER 1: E 'fuori-- a destra, potremmo finire con le cose che non sono dentro-- memorizzato in segmenti in modo che ci aspettiamo che siano. Quindi, se eravamo alla ricerca per bacca, prima abbiamo detto, oh possiamo guardare in un secchio. Potrebbe essere solo in un secchio. Ma ora, in realtà, potrebbe essere in tutti i secchi, giusto? Ok, qui è un'altra opzione, chaining-- separata che è l'idea che stiamo andando di usare un po 'più tardi in P set 5. Piuttosto che avere uno spazio in ciascun segmento, perché non abbiamo ogni secchio essere un puntatore a una lista collegata? Dove si dice, OK, c'è un secchio per tutto ciò che inizia con A. E c'è solo sarà un collegato elenco dei frutti che iniziano con A. Quindi, se vogliamo ottenere un nuovo frutto, diciamo noi abbiamo get-- avocado, abbiamo mela, diciamo che otteniamo albicocca, come potremmo mettere nella lista? Bene, noi andavamo a benna 0, e ci piacerebbe basta inserirla nella nostra lista è piaciuto, semplice come quella. Ora io continuo a dire secchio. Potremmo implementare questa in un certo numero di modi. Un tipico modo che questo tipo di immagine suggerisce, sta forse avendo una serie di puntatori a liste collegate. Questo è un modo possibile implementare una tabella hash. PUBBLICO: Volete bisogno di un altro lista perché banane e bacche sono fuori di ordine? SPEAKER 1: Volete need-- ah, vuoi bisogno di un altro elenco perché la banana e bacche sono in ordine? In questo caso, la nostra funzione di hash, che ci dice dove mettere le cose non si preoccupa la seconda lettera. Essa non si preoccupa di alfabetizzazione, si preoccupa solo la prima lettera. Domanda? PUBBLICO: Qual è la definizione di tale la funzione, e che cosa assomiglia? SPEAKER 1: Ah, bene. Ok, quindi non abbiamo bisogno di preoccuparsi troppo per questo quiz. Quindi non ho messo nelle diapositive. Stiamo per essere introdotto ad esso per P set 5. Ma in fondo, si dice, dato un nuovo elemento, dove dovrei metterla? Oppure, diciamo che sto cercando un elemento, quale potrebbe essere? Sì, grande domanda. OK, molto rapidamente, gli alberi e le mete. Quindi, un albero è un qualsiasi tipo di struttura dati organizzata. E stiamo andando a vedere un sacco di foto che renderà questo libero eccellente. E un trie, che abbiamo visto in classe, è un tipo molto speciale di albero che funziona essenzialmente come una tabella hash a più livelli. E 'super cool. Andiamo a vederlo in appena un secondo. Va bene, quindi cerchiamo di parlare di alberi prima. Quindi questo è davvero tipico esempio di un albero, dove abbiamo qualche gerarchia. Si vede che si è a il più alto, a destra? E posso dire superiore perché non c'è chiaramente un ordinamento perché hanno queste frecce scendendo. Così, la cosa in alto, Io lo chiamo il nodo principale. Così uno è il nodo principale. E le cose in fondo, che non hanno nulla a venire fuori di loro, Dico queste sono nodi foglia. Quindi 8,9 5, 6, 7, OK. E di solito l'abbiamo terminologia può dire è, 1 è genitore di 3. Quindi è la cosa che mi viene un livello sopra di esso, e da punti. E 3 è di 1 bambino. E 'la cosa che 1 punti a. Domanda? PUBBLICO: Si può tornare a diapositiva precedente, per favore? SPEAKER 1: Posso tornare alla diapositiva precedente? Certo. Domande su questo? Oppure si voleva solo di vedere le cose? PUBBLICO: Ho appena non ottenere attraverso di essa. SPEAKER 1: OK, freddo, sì. Questi saranno tutti on-line in modo da non fare preoccuparsi di ottenere ogni parola. E nell'interesse tempo, ho intenzione di andare. È ok? Eccezionale. Ok bello. Quindi parliamo di un kind-- molto specifiche così abbiamo questi generale Struttura di alberi, che è solo tutto ciò che ci permette al tipo di rango gerarchicamente cose. Alberi binari sono cose dove ogni nodo ha al massimo due bambini. ok? E io ho detto, ok, in modo che sembra per adattarsi a questa descrizione. Ho detto nodo, non un albero binario di ricerca. Che cosa è un albero binario di ricerca? E 'ordinato. Così si sa che in un albero binario di ricerca, tutto per il tutto tree-- ai nodi di sinistra è più piccolo, e tutto per il nodi a destra è più grande. Quindi questo non è un albero binario di ricerca. Questo è solo un albero binario. Così abbiamo grande categoria di alberi, categoria leggermente più piccolo di alberi binari, ricerca A-- alberi binari di ricerca. Raffreddare? Tutto ok. E ora, più divertente di tutto, abbiamo i nostri tentativi. Voi ragazzi SAW quest'immagine nella lezione? Sì, dovrebbe essere super-familiare. Diamo un'occhiata a come potremmo applicare concretamente questo. O in realtà, vediamo, vuol anche venire in su? No. Va bene, non hanno nemmeno bisogno di preoccuparsi di quella roba di basso livello. Avremo tutto il tempo per affrontare poi P impostare 5. Ma per ora, solo di altissimo livello, abbiamo sapere che questo è quello che sembra. Abbiamo descritto come tipo di una tabella hash a più livelli where-- cosa significa questo negozio? Questo memorizza i nomi di gli scienziati che si può effettivamente cercare da solo tipo di seguire il diverse tabelle hash giù, va bene? E lo scopo di questo è, in teoria, essi forniscono costante di tempo guardare in alto. Quindi, se voglio controllare che, per esempio, che è someone-- Mandel che è in questo trie, potrei molto rapidamente in linear-- Mi dispiace, in costante di tempo, capire anche se non è nel trie. Ma una truffa, si guarda quanto è grande questo è. Non stiamo nemmeno memorizzazione che molti dati, ed è enorme. Così un grande difetto è che essa utilizza una grande quantità di memoria. Sì. PUBBLICO: Perché non prevede costante di tempo, esattamente? SPEAKER 1: Ancora una volta? PUBBLICO: Qual è l'intuizione per questo che fornisce costante di tempo? SPEAKER 1: Eccellente domanda. Perché si prevede costante di tempo? Quindi cosa possiamo fare è, andiamo Diciamo che stiamo cercando Mandel. Sappiamo che vogliamo iniziare nel primo livello al M. Sappiamo che vogliamo seguire per E. Quindi, questo è fare un passo, due passi, giusto? La seguiamo a N. La seguiamo a D. La seguiamo per E. La seguiamo a L. E poi la prossima cosa controlliamo says-- questo delta dice sì, che è nella nostra tabella. Questa è una parola. Questa è una voce valida nel nostro trie. Quindi stai dicendo, OK, che ha preso sette passi. Ma se abbiamo aggiunto come un triliardo di più scienziati di questa struttura dati, non avremmo dovuto controllare un zillion più cose. Stiamo sempre e solo andando a prendere sette passaggi, la lunghezza della persona di nome. Così, ci piace pensare di runtime come, supponiamo aumentiamo le dimensioni del nostro struttura dati, quanto più lungo sta andando a prendere? In questo caso, se si aggiunge un gruppo più gli scienziati, non importa. E 'ancora in corso a prendere la stessa quantità di tempo. E 'tempo costante. Sì. PUBBLICO: Come si fa a non sapete per eseguire la scansione sugli altri numeri? SPEAKER 1: Come faccio a sapere come a-- PUBBLICO: Come come sapete si va direttamente da M a E e non M per A? SPEAKER 1: Oh, certo. Perché sapevo che ero cercando la parola Mandel, e so solo che è M-E. Così che-- sì, andare avanti. PUBBLICO: Non Avreste a guardare le altre lettere nel resto del [incomprensibile]? SPEAKER 1: Ah, non dovrei avere a guardare the-- OK, grande. Questa è una grande domanda. Dipende da come implementiamo esso. Se implementiamo come solo come una serie di matrici dove sappiamo che E è sempre in posizione 0, Non lo so, a prescindere numero indice è a. Sì, noi possiamo solo fare costante tempo, fare, fare, fare, fare. Raffreddare. Domanda laggiù? PUBBLICO: E 'tempo costante la stessa cosa in tempo reale? SPEAKER 1: E 'costante di tempo la stessa cosa è in tempo reale? Io non sono davvero sicuro in tempo reale è. PUBBLICO: Come quella volta progredisce letteralmente secondo dal secondo invece di essere una variabile indipendente. SPEAKER 1: Oh, sì, è può pensare in questo modo. In altre parole, non è dipendente delle dimensioni della struttura di dati. Questo è un modo di pensare di esso. Qualsiasi altra domanda? Forse in un primo tempo a la storia, abbiamo terminato in tempo. Se avete qualsiasi domanda, libero di venire chiederci, andare alla sezione, parlare con il vostro TF, ufficio ore 8:00 e le 08:30 sono alle 11:00 il Lunedi e Martedì, così è un po 'di tempo diverso, quindi assicuratevi di notare che. Già. PUBBLICO: abbiamo bisogno di sapere roba come argomenti della riga di comando, ls precipitare, precipitare a prescindere? SPEAKER 1: riga di comando argomenti e comandi Linux, sì, avete bisogno di sapere chi. Very-- è come il tipo di livello roba abbiamo coperto nella sezione 0, per quanto riguarda i comandi di Linux andare. PUBBLICO: sono le ore in Annenberg? SPEAKER 1: Orario di ricevimento, non sono del tutto sicuro dove sono. Ma è possibile controllare il sito web, e vi dirà.