[ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ] DAVID J. MALAN: Εντάξει. Αυτό είναι CS50, και αυτό είναι το τέλος της εβδομάδας Four. Και ένα από τα θέματα σήμερα είναι ότι από την ψηφιακή εγκληματολογία, η τέχνη της ανάκτησης πληροφοριών. Και μάλιστα, ακόμη και αν είστε στη μέση τώρα Ειρήνης σε τρεις και Breakout, την επόμενη εβδομάδα, η έμφαση θα δοθεί στην ακριβώς αυτό το όνομα. Έτσι, ένα από τα πιο cool δουλειές ποτέ είχε ήταν πίσω στο σχολείο απόφοιτος, όταν δούλευα για την τοπική Middlesex County Εισαγγελέα του γραφείο, κάνει εγκληματολογίας λειτουργούν. Έτσι, κατ 'ουσίαν, το Massachusetts Κρατική Αστυνομία, σε ορισμένες περιπτώσεις, όταν εργάζονται σε υποθέσεις θα φέρει σε πράγματα όπως σκληρούς δίσκους και δισκέτες και κάρτες μνήμης και τα παρόμοια. Και θα τους παραδώσει μου και μέντορας μου, και ο στόχος μας ήταν να βρουν στοιχεία, αν υπήρχε, σε αυτά τα μέσα. Τώρα, μπορεί να έχετε δει τις αναλαμπές από αυτόν τον κόσμο της εγκληματολογίας στα μέσα ενημέρωσης, τηλεόραση και ταινίες. Αλλά η δουλειά που είχα, και τολμούσα να πω ότι ο κόσμος, δεν είναι αρκετά όπως θα το δούμε. Ας ρίξουμε μια ματιά σε ό, τι πιθανώς έχετε δει. [VIDEO PLAYBACK] -εντάξει. Τώρα, ας πάρει μια καλή ματιά σε σας. [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ] -Κράτα Αυτό. Εκτελέστε το πίσω. Περίμενε ένα λεπτό. Πηγαίνετε δεξιά. -Υπάρχουν. Πάγωμα αυτό. -Πλήρης Οθόνη. -εντάξει. Πάγωμα αυτό. Καταστήσει αυστηρότερη επάνω σε αυτό, θα σας; -φορέα Μέσα σε αυτό ο τύπος από την πίσω ρόδα. -zoom Σε ακριβώς εδώ σε αυτό το σημείο. -Με Το σωστό εξοπλισμό, ο εικόνα μπορεί να μεγεθυνθεί και ακονισμένα. Τι είναι αυτό; -Είναι Ένα πρόγραμμα βελτίωσης. -Μπορείς Σαφές ότι μέχρι κάποια; -Δεν Ξέρω. Ας το ενισχύσει. -Enhance Τμήμα Α6. Θα ενισχυθεί η λεπτομέρεια, και-- -Νομίζω Υπάρχει αρκετό για να ενισχύσει. Αφήστε το στην οθόνη μου. -I Ενισχυθεί η αντανάκλαση στο μάτι της. -Ας Έχει τρέξει αυτό μέσω ενίσχυση βίντεο. -Edgar, Μπορείτε να ενισχύσετε αυτό; -Hang Για. -Έχω Ήδη εργάζονται σε αυτό τον προβληματισμό. Αντανάκλαση κάποιου -Δεν. -Reflection. -Υπάρχει Μια αντανάκλαση του προσώπου του ανθρώπου. -Το Αντανάκλαση! -Υπάρχει Μια αντανάκλαση. -zoom Μέσα σε καθρέφτη. Μπορείτε να δείτε μια αντανάκλαση. -Μπορεί Θα ενισχύσει την εικόνα από εδώ; -Μπορεί Να το ενισχύσει; -Μπορεί Να το ενισχύσει; -Μπορεί Θα ενισχύσει αυτό; -Μπορεί Να το ενισχύσει; -Κράτα Σε μια δεύτερη. Θα ενισχύσει. -zoom Στην στην πόρτα. -Times 10. -zoom. -Μετακινήστε Σε. -Περισσότερα. Περίμενε, να σταματήσει. Σταματήστε. -Pause Αυτό. -Rotate Μας 75 βαθμούς γύρω από τον κατακόρυφο, παρακαλώ. Σταματήστε. Πηγαίνετε πίσω στο τμήμα σχετικά με την πόρτα πάλι. -Σε Πέτυχα έναν ενισχυτή εικόνας που μπορεί bitmap; -Ισως Μπορούμε να χρησιμοποιήσουμε το Pradeep Singh μέθοδος για να δούμε μέσα στα παράθυρα. -Το Λογισμικό είναι εξέλιξη της τεχνολογίας. -Το Ιδιοτιμή είναι απενεργοποιημένη. -Με Δεξιά συνδυασμό algorithms-- Λαμβάνονται φωτισμό -Θέλει αλγόριθμοι στο επόμενο επίπεδο, και μπορώ να τα χρησιμοποιούν για να ενισχύσουν αυτή τη φωτογραφία. -Lock Και να διευρύνει το z-άξονα. -Enhance. Ενίσχυση. -Enhance. -Ακίνητος Και να ενισχύσει. [ΤΕΛΟΣ VIDEO PLAYBACK] DAVID J. MALAN: Έτσι αυτά είναι όλες οι λέξεις, αλλά δεν ήταν χρησιμοποιείται σε ποινές σωστά. Και πράγματι, στο μέλλον, κάθε φορά, παρακαλώ, έχετε ακούσει κάποιον να λέει τη λέξη, "Ενισχύσει" συγκρατημένο γέλιο λίγο. Διότι όταν προσπαθείτε να ενισχυθεί, Για παράδειγμα, αυτό είναι αυτό που συμβαίνει. Έτσι, εδώ είναι μια πανέμορφη φωτογραφία. Αυτή είναι η δική Daven CS50 του. Και ας υποθέσουμε ότι θέλαμε να επικεντρωθεί σε σχετικά με τη λάμψη στα μάτια του, ή η αντανάκλαση της κακός που ήταν σαφώς συλλαμβάνεται από την κάμερα ασφαλείας. Αυτό είναι τι συμβαίνει όταν κάνετε ζουμ σε μια εικόνα ότι έχει μόνο έναν πεπερασμένο αριθμό των bits που συνδέονται με αυτό. Αυτό είναι αυτό που θα πάρετε. Και πράγματι, στο μάτι του Daven είναι, αλλά τέσσερις, ίσως και έξι εικονοστοιχεία που συνθέτουν ακριβώς ό, τι ήταν φέγγος εκεί. Έτσι Πρόβλημα Σετ Τέσσερις θα έχει τελικά θα διερευνήσει αυτόν τον κόσμο, ιδιαίτερα από τη φύση του κάτι καλούμε το αρχείο i / o, όπου i / o είναι ακριβώς ένα φανταχτερό τρόπο λέγοντας εισόδου και εξόδου. Έτσι μέχρι σήμερα, όλες οι αλληλεπιδράσεις είχαμε με έναν υπολογιστή έχουν σε μεγάλο βαθμό με το πληκτρολόγιο και την οθόνη, αλλά όχι τόσο πολύ με το σκληρό δίσκο, ή την αποθήκευση των αρχείων πέρα ​​από αυτά που γράφετε οι ίδιοι. Τα προγράμματά σας έχουν μέχρι στιγμής δεν έχουν τη δημιουργία και την αποθήκευση, και την ενημέρωση δικά τους αρχεία. Λοιπόν, τι είναι ένα αρχείο; Λοιπόν, κάτι σαν JPEG. Αυτή είναι μια εικόνα που θα μπορούσε έχουν ή να ανεβάσετε στο Facebook, ή δείτε πουθενά στο διαδίκτυο. Πράγματι, η φωτογραφία που μόλις πριόνι Daven ήταν ένα JPEG. Και αυτό που είναι ενδιαφέρον σχετικά αρχεία, όπως αρχεία JPEG είναι ότι μπορούν να ταυτοποιηθούν, Τυπικά, με ορισμένα πρότυπα των bits. Με άλλα λόγια, τι είναι αυτό που διακρίνει ένα JPEG από ένα GIF από ένα PING από το Word έγγραφο από ένα αρχείο Excel; Καλά, είναι απλά διαφορετικό μοτίβα των bits. Και αυτά τα διαφορετικά σχέδια είναι συνήθως κατά την έναρξη αυτών των αρχείων. Έτσι ώστε όταν ο υπολογιστής σας ανοίγει το Word doc, ή όταν ένας υπολογιστής ανοίγει ένα JPEG, φαίνεται συνήθως κατά τη πρώτα αρκετά δυαδικά ψηφία στο αρχείο. Και αν αναγνωρίζει ένα μοτίβο, λέει, ω, αυτή είναι μια εικόνα. Επιτρέψτε μου να το εμφανίσετε σε ο χρήστης ως γραφικό. Ή, OH, αυτό μοιάζει με ένα έγγραφο του Word. Επιτρέψτε μου να το δείξει στο χρήστη ως ένα δοκίμιο. Έτσι, για παράδειγμα, αρχεία JPEG, αποδεικνύεται, είναι αρκετά εξελιγμένα κάτω από την κουκούλα. Αλλά τα τρία πρώτα bytes στις περισσότερες κάθε JPEG ξεκινήσει με αυτούς τους τρεις αριθμούς. Έτσι byte μηδέν, ένα, δύο και είναι, σε πλέον κάθε JPEG, 255, τότε ο αριθμός 216, τότε ο αριθμός 255. Και τι θα είναι σε θέση να αρχίσει να κάνει την επόμενη εβδομάδα είναι στην πραγματικότητα σπρώχνει κάτω η κουκούλα αρχείων, όπως αρχεία JPEG και όπως αρχεία bitmap, και βλέποντας αυτό που πάντα ήταν εκεί για όσο χρονικό διάστημα όπως έχετε χρησιμοποιήσει έναν υπολογιστή. Αλλά τι είναι δεν υπάρχει συνήθως γραμμένο σαν δεκαδικούς αριθμούς σαν αυτό. Οι επιστήμονες υπολογιστών δεν τείνουν να μιλούν σε δεκαδικό. Δεν πραγματικά να μιλήσει σε δυαδικό. Συνήθως, όταν θέλουμε να εκφράσουν αριθμούς, χρησιμοποιούμε πραγματικά δεκαεξαδικό, το οποίο μπορείτε να ανακαλέσετε από, ας πούμε, πρόβλημα Set Ένα, το οποίο αμφισβήτησε μπορείτε να σκεφτείτε για ένα διαφορετικό σύστημα. Εμείς, φυσικά, είναι εξοικειωμένοι με δεκαδικό, το μηδέν έως εννέα. Μιλήσαμε για το δυαδικό. Και δεν έχουμε πραγματικά να χρησιμοποιήσει τόσο πολύ εδώ για έξω, επειδή οι υπολογιστές θα χρησιμοποιήσει αυτό. Όμως, οι προγραμματιστές θα είναι πολύ Συχνά, αλλά όχι πάντοτε, χρησιμοποιούν δεκαεξαδικό, πράγμα που σημαίνει απλά έχετε 16 γράμματα στο αλφάβητο σας, σε αντίθεση με δύο ή 10. Έτσι, πώς θα μετράνε στην τριτοβάθμια από εννέα σε δεκαεξαδικό; Πας 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, α, β, γ, δ, ε, στ, μόλις κατά σύμβαση. Αλλά αυτό που είναι βασικό είναι ότι κάθε από αυτά είναι ένα ενιαίο σύμβολο. Δεν υπάρχει 10. Δεν υπάρχει 11, per se, διότι κάθε ψηφίων σας, όπως ακριβώς και σε δεκαδικό όπως ακριβώς και σε δυαδικό, πρέπει απλά είναι ένα ενιαίο χαρακτήρα, με σύμβαση. Έτσι ώστε, στη συνέχεια, είναι το αλφάβητο που έχουμε στη διάθεσή μας για δεκαεξαδική. Έτσι, αυτό που κάνει ένα JPEG μοιάζει αν ήταν να γράψει τα τρία αυτά πρώτα Δεν bytes ως δεκαδικά αλλά, για παράδειγμα, ως δεκαεξαδικό; Και γιατί είναι εξάγωνο ακόμη όλα αυτά χρήσιμη; Λοιπόν, μια γρήγορη ματιά σε ένα παράδειγμα. Έτσι, αν έχω γράψει τα κομμάτια που αντιπροσωπεύουν αυτά τα δεκαδικά numbers-- Αυτό θα μπορούσε να είναι λίγο σκουριασμένος τώρα από λίγες εβδομάδες πίσω, αλλά το αριστερό και το σωστό είναι αρκετά εύκολο. 255 ήταν ο μεγαλύτερος αριθμός που θα μπορούσε να αποτελέσει με οκτώ bits. Ήταν όλα αυτά. Έτσι, το μόνο που είναι ήπια ενδιαφέρουσα είναι η μεσαία. Και αν το είδος του κάνουν από το μαθηματικά, θα συμπεράνουμε ότι, πράγματι, αυτό το μοτίβο ενός και μηδενικά αντιπροσωπεύει 216. Οπότε ας ορίζουν για τώρα ότι αυτές είναι σωστές. Αλλά γιατί είναι αυτό το ενδιαφέρον; Λοιπόν, ένα byte, βέβαια, είναι οκτώ bits. Και αποδεικνύεται ότι, αν νομίζετε ότι από ένα byte ως δύο κομμάτια των τεσσάρων bits, σαν αυτό. Επιτρέψτε μου να προσθέσω κάποιο διάστημα. Έτσι, πριν, μετά. Έχω μόλις προστεθεί κάποιο λευκό χώρο για χάρη οπτικοποίηση εδώ. Πώς θα μπορούσαμε να αντιπροσωπεύουν πλέον το, ας πούμε, δεκαεξαδικό κάθε quad των bits, κάθε σύνολο τεσσάρων bits; Έτσι, για παράδειγμα, στην αριστερή τώρα, έχουμε 1111 σε δυαδικό. Τι είναι αυτός ο αριθμός σε δεκαδικό, αν το κάνετε από τα μαθηματικά; Έχετε τον τόπο αυτά, ο τόπος δυάρια, ο τόπος τέσσερα, και η θέση οχτάρια. ΚΟΙΝΟ: 15. DAVID J. MALAN: Είναι 15. Έτσι, αν κάνουμε οκτώ συν τέσσερα συν δύο συν ένα, θα πάρετε 15. Έτσι θα μπορούσα να γράψω 15 κάτω 1111, αλλά το όλο θέμα εδώ είναι δεκαεξαδικό και όχι δεκαδικό. Έτσι, αντί της γραφής κάτω 15, 1-5, Πάω να γράψω ότι το εξάγωνο, το οποίο αν νομίζετε πίσω, αν έχετε μηδέν έως στ, τι 15 πρόκειται να είναι; ΚΟΙΝΟ: f. DAVID J. MALAN: Έτσι αποδεικνύεται ότι το f. Και μπορείτε να εργαστείτε ότι έξω λέγοντας, και, αν είναι 10, τότε ΟΚ, f είναι 15. Έτσι, πράγματι, θα μπορούσαμε να ξαναγράψουμε Αυτό το ίδιο σύνολο αριθμών ως f f. Και στη συνέχεια, αν κάνουμε ένα κομμάτι των μαθηματικών, θα συμπεράνουμε ότι αυτό είναι d. Οκτώ είναι αρκετά εύκολο, γιατί εμείς έχουν ένα στη θέση οχτάρια. Και στη συνέχεια, έχουμε ένα ζευγάρι πιο f f του. Έτσι, τι οι άνθρωποι τείνουν να κάνουν με σύμβαση όταν χρησιμοποιείτε το δεκαεξαδικό είναι απλά γράφω αυτό λίγο πιο συνοπτικά, να απαλλαγούμε από το μεγαλύτερο μέρος αυτού του λευκού χώρου. Και ακριβώς για να είναι εξαιρετικά σαφές σε αναγνώστες ότι αυτό είναι δεκαεξαδικό, η απλή σύμβαση μεταξύ ανθρώπους είναι να γράψετε το μηδέν x, η οποία δεν έχει άλλη σημασία από ένα οπτικό αναγνωριστικό της, έρχεται εδώ ένας αριθμός εξάγωνο. Και στη συνέχεια, βάζετε τα δύο ψηφία, στ f στην περίπτωση αυτή, τότε d a, τότε η f f. Έτσι τα πολυλογώ, δεκαεξαδικό τείνει μόνο να είναι χρήσιμος επειδή κάθε ένα από του ψηφία, μηδέν έως στ, τέλεια γραμμές επάνω με ένα πρότυπο τεσσάρων δυαδικών ψηφίων. Έτσι, εάν έχετε δύο δεκαεξαδικά ψηφία, μηδέν έως F, ξανά και ξανά, που σας δίνει τέλεια οκτώ bits ή ένα byte. Έτσι, γι 'αυτό τείνει να είναι συμβατικά χρήσιμα. Δεν υπάρχει πνευματικής περιεκτικότητα σε πραγματικά πέρα ​​από αυτό, εκτός από την πραγματική χρησιμότητα του. Τώρα αρχεία JPEG δεν είναι το μόνο μορφές αρχείων για τα γραφικά. Θα θυμάστε ίσως ότι υπάρχουν αρχεία, όπως αυτό στον κόσμο, τουλάχιστον από λίγα χρόνια πίσω. Έτσι, αυτό ήταν στην πραγματικότητα εγκατασταθεί στα Windows XP σε εκατομμύρια υπολογιστές σε όλο τον κόσμο. Και αυτό ήταν ένα αρχείο bitmap, BMP. Και ένα αρχείο bitmap, όπως θα δείτε την επόμενη εβδομάδα, σημαίνει μόνο ένα μοτίβο από κουκκίδες, εικονοστοιχεία, όπως και αν ονομάζεται, ένα χάρτη για bits, πραγματικά. Έτσι, αυτό που είναι ενδιαφέρον, όμως, για αυτή τη μορφή του αρχείου, BMP, είναι ότι κάτω από το καπό, το έχει περισσότερο από ακριβώς τρία bytes που συνθέτουν την κεφαλιά του, έτσι να μιλήσει, τα πρώτα τσιμπήματα. Φαίνεται πραγματικά λίγο περίπλοκη με την πρώτη ματιά. Και θα το δείτε αυτό στο σύνολο P. Και να πάρει κάτι ιδιαίτερα από αυτό το τώρα δεν είναι τόσο σημαντικό, όπως ακριβώς το γεγονός ότι κατά την έναρξη της κάθε bitmap αρχείο, μια γραφική μορφή, υπάρχει μια ολόκληρη δέσμη των αριθμών. Τώρα η Microsoft, η συγγραφέας αυτής της μορφής, τείνει να καλέσει όσους τα πράγματα δεν ints και χαρακτήρες και άρματα, αλλά τα λόγια και δ λέξεις και λαχταρά και bytes. Έτσι είναι ακριβώς διαφορετικούς τύπους δεδομένων. Είναι διαφορετικά ονόματα για το ίδιο πράγμα. Αλλά θα δείτε ότι το P Σετ Four. Αλλά αυτό είναι μόνο για να πω ότι, εάν ένα ανθρώπινο διπλό κλικ κάποιο αρχείο .BMP του ή σκληρό δίσκο της, και ανοίγει ένα παράθυρο up δείχνει το άτομό του ότι η εικόνα, αυτό συνέβη επειδή το λειτουργικό σύστημα πιθανόν παρατηρήσει όχι μόνο η επέκταση αρχείου .BMP στο όνομα του αρχείου, αλλά και το γεγονός ότι υπάρχει κάποια σύμβαση με το πρότυπο των bits στην αρχή από το αρχείο bitmap. Αλλά ας τώρα να επικεντρωθούν στην ένα τέτοιο πολύπλοκο αρχείο, αλλά αντί για κάτι τέτοιο. Ας υποθέσουμε ότι εδώ στο gedit, I Απλά έχουν τις απαρχές ενός προγράμματος που είναι αρκετά απλό. Έχω μερικές περιλαμβάνει επάνω στην κορυφή. Τώρα έχω #include "structs.h", αλλά Θα επανέλθω στο θέμα αυτό σε μια στιγμή. Αλλά αυτό είναι χρήσιμο για τώρα. Έτσι, αυτό είναι ένα πρόγραμμα ότι πρόκειται να εφαρμόσουν όπως η βάση δεδομένων του καταχωρητή. Έτσι, μια βάση δεδομένων των μαθητών, και κάθε φοιτητής στον κόσμο έχει ένα όνομα και ένα σπίτι και ίσως κάποια άλλα πράγματα, αλλά θα το κρατήσουμε απλό. Κάθε μαθητής έχει ένα όνομα και ένα σπίτι. Έτσι, αν ήθελα να γράψω ένα πρόγραμμα του οποίου σκοπός στη ζωή ήταν απλά να επαναλάβει από μηδέν μέχρι και σε τρεις, αν υπάρχει τρεις μαθητές στο Πανεπιστήμιο του Χάρβαρντ. Και εγώ απλά θέλετε να πάρετε, χρησιμοποιώντας GetString, το όνομα και το σπίτι του κάθε μαθητή, και στη συνέχεια να εκτυπώσετε μόνο εκείνες έξω. Αυτό είναι το είδος του σαν Εβδομάδας Ένα, Δύο Εβδομάδα πράγματα τώρα, όπου θέλω μόνο ένα για βρόχου ή κάτι τέτοιο. Και θέλω να καλέσω GetString μερικά φορές, και στη συνέχεια να εκτυπώσετε στ λίγες φορές. Λοιπόν, πώς θα μπορούσε να το κάνω αυτό, όμως, όταν και οι δύο ένα όνομα και ένα σπίτι εμπλέκονται για κάθε μαθητή; Έτσι, η πρώτη μου σκέψη θα μπορούσε είναι να κάνει κάτι τέτοιο. Θα ήθελα να πω πρώτα, καλά, να μου δώσει, λένε, μια σειρά από χορδών ονόματα. Και δεν θέλω μια hardcode τρεις εδώ. Τι θέλω να βάλει εκεί; Έτσι, ΦΟΙΤΗΤΕΣ, γιατί αυτό είναι ακριβώς μια σταθερά που δηλώνονται στην κορυφή, ακριβώς γι 'αυτό δεν πρέπει να hardcode τρεις σε πολλαπλές θέσεις. Με αυτό τον τρόπο, μπορώ να το αλλάξετε ένα μέρος, και επηρεάζει μια αλλαγή παντού. Και τότε, θα μπορούσα να κάνω κορδόνι στεγάζει ΦΟΙΤΗΤΕΣ. Και τώρα, θα μπορούσα να κάνω κάτι σαν for (int i = 0? i <ΦΟΙΤΗΤΕΣ? i ++. Έτσι Γράφω γρήγορα, αλλά αυτό είναι τώρα πιθανώς εξοικειωμένοι σύνταξη. Και τώρα, αυτό ήταν το πιο πρόσφατο. Αν θέλετε να βάλετε στο i-οστό όνομα του μαθητή, νομίζω ότι το κάνουμε αυτό. Και στη συνέχεια, όχι τα ονόματα αλλά τα σπίτια περικλείουν i. Κάνω αυτό, GetString, και αφήστε να πάω πίσω και να διορθώσετε αυτή τη γραμμή. Συμφωνώ? Διαφωνώ; Δεν είναι πολύ φιλικό προς το χρήστη. Δεν έχω πει το χρήστη τι να κάνει. Αλλά τώρα, αν και ήθελε να αργότερα, ας ας πούμε, να εκτυπώσετε αυτά τα πράγματα out-- έτσι TODO αργότερα. Πάω να κάνει περισσότερο με Αυτό-- αυτό αναμφισβήτητα IS ορθή εφαρμογή των να πάρει τα ονόματα και τα σπίτια, τρεις από αυτούς σύνολο του καθενός, από ένα χρήστη. Αλλά αυτό δεν είναι πολύ καλό σχεδιασμό, σωστά; Τι θα συμβεί αν ένας φοιτητής δεν έχει μόνο ένα όνομα και ένα σπίτι, αλλά και έναν αριθμό ταυτότητας, και ένας αριθμός τηλεφώνου, και μια διεύθυνση ηλεκτρονικού ταχυδρομείου, και ίσως μια αρχική σελίδα, και ίσως μια λαβή Twitter, και οποιοδήποτε αριθμό άλλων στοιχείων σχετίζεται με ένα μαθητή ή ενός προσώπου, γενικότερα. Πώς θα αρχίσουμε να προσθέσετε λειτουργικότητα σε αυτό το πρόγραμμα; Λοιπόν, νιώθω σαν τον πιο απλό τρόπο θα μπορούσε είναι να κάνουμε κάτι, όπως, ας πούμε, int ταυτότητες ΦΟΙΤΗΤΕΣ. Έτσι, μπορώ να βάλω όλες τις ταυτότητες τους εκεί. Και κατόπιν, για κάτι όπως αριθμούς τηλεφώνου, Δεν είμαι σίγουρος πώς να Δηλώνετε ότι ακριβώς ακόμα. Ας πάμε μπροστά και μόνο κλήση Αυτό twitters ΦΟΙΤΗΤΕΣ, η οποία Είναι λίγο παράξενο, αλλά-- και ένα σωρό περισσότερα πεδία. Έχω αρχίσει να αποτελεσματικά αντιγραφή και επικόλληση εδώ. Και αυτό πρόκειται να αυξηθεί αρκετά δυσκίνητο αρκετά γρήγορα, σωστά; Δεν θα ήταν ωραίο αν υπήρχαν στον κόσμο, μία δομή δεδομένων γνωστή όχι ως int ή μια σειρά, αλλά κάτι υψηλότερο επίπεδο, μια αφαίρεση, έτσι να μιλήσει, γνωστό ως φοιτητής; C δεν έρχονται με ενσωματωμένη λειτουργικότητα για τους φοιτητές, αλλά τι γίνεται αν ήθελα να δώσω αυτό, όπως; Λοιπόν, αποδεικνύεται, Πάω να ανοίξετε ένα αρχείο που ονομάζεται structs.h εδώ, και μπορείτε να κάνετε ακριβώς αυτό. Και θα πάμε να αρχίσουν να κάνουν αυτό τώρα. Και κάτω από την κουκούλα του P Σετ Τρία, έχετε ήδη κάνει αυτό τώρα. Δεν υπάρχει τέτοιο πράγμα όπως ένα g έμμεσους ή μια g οβάλ στη γλώσσα προγραμματισμού C. Οι λαοί στο Stanford εφαρμοστούν εκείνες τύπους δεδομένων, χρησιμοποιώντας αυτή την προσέγγιση εδώ, δηλώνοντας και τη δική τους νέα δεδομένα τύπους χρησιμοποιώντας μια νέα λέξη-κλειδί ονομάζεται struct και άλλο μία που ονομάζεται typedef. Και πράγματι, αν και η σύνταξη μοιάζει λίγο διαφορετικό από τα πράγματα έχουμε δει στο παρελθόν, σε Κατ 'αρχήν, είναι εξαιρετικά απλό. Αυτό ακριβώς σημαίνει "καθορίζουν έναν τύπο." Αυτό πρόκειται να είναι μια δομή, και μια δομή Είναι ακριβώς όπως ένα δοχείο για πολλαπλές πράγματα. Και ότι η δομή πρόκειται να έχουν μια σειρά που ονομάζεται όνομα, και μια σειρά που ονομάζεται σπίτι. Και ας την ονομάσουμε, απλά για ευκολία, όλη αυτή η δομή δεδομένων φοιτητή. Έτσι, τη στιγμή που θα φτάσετε στο η άνω τελεία, έχετε τώρα δημιούργησε τα δικά σας δεδομένα τύπο που ονομάζεται φοιτητής που βρίσκεται τώρα, παράλληλα με int, και float, και char, και εγχόρδων, και ζ recT και g οβάλ, και οποιοσδήποτε αριθμός από άλλα πράγματα που οι άνθρωποι έχουν εφεύρει. Έτσι, ό, τι είναι χρήσιμο γι 'αυτό τώρα είναι ότι αν πάω πίσω να struct 0 και να τελειώσει αυτό εφαρμογής, το οποίο έγραψα εκ των προτέρων εδώ, παρατηρούμε ότι όλα από την αναπόφευκτη ακαταστασία ότι ήταν έτοιμος να αρχίσει να συμβαίνει, όπως θα προστεθεί αριθμούς τηλεφώνου και τα post στο twitter και όλα αυτά τα άλλα πράγματα για να ορισμό ενός μαθητή, τώρα είναι συνοπτικά τυλιγμένη όπως ακριβώς μια συστοιχία των μαθητών. Και καθένα από τους φοιτητές τώρα έχει πολλαπλές πράγματα μέσα από αυτό. Έτσι ώστε να αφήνει μόνο ένα ερώτημα. Πώς μπορείτε να πάρετε στο όνομα, και το σπίτι, και το ID, και ό, τι άλλο είναι στο εσωτερικό του μαθητή; Πολύ απλά, καθώς και. Νέα σύνταξη, αλλά μια απλή ιδέα. Μπορείτε απλά δείκτη μέσα στον πίνακα, όπως κάναμε και την περασμένη εβδομάδα και αυτό. Και αυτό είναι σαφώς η νέο κομμάτι της σύνταξης; Ακριβώς., Που σημαίνει "πηγαίνετε στο εσωτερικό του δομή και να πάρει το πεδίο που ονομάζεται όνομα, να πάρει το πεδίο που ονομάζεται σπίτι, να πάρει το πεδίο που ονομάζεται φοιτητής. " Έτσι, σε P Σετ Τρία, αν είστε εξακολουθούν να εργάζονται σε αυτό, και οι περισσότεροι λαοί εξακολουθούν να είναι, συνειδητοποιούν ότι, όπως σας αρχίσετε να χρησιμοποιείτε τα πράγματα όπως g rects και g οβάλ και άλλα πράγματα που δεν φαίνεται να προέρχονται από την εβδομάδα μηδέν, ένα ή δύο, συνειδητοποιούν ότι αυτό συμβαίνει επειδή Στάνφορντ δήλωσαν ότι ορισμένοι νέοι τύποι δεδομένων. Και πράγματι, αυτό είναι ακριβώς αυτό που θα κάνουν, καθώς, σε P Σετ Τέσσερις, όταν θα αρχίσουμε να ασχοληθεί με τα πράγματα όπως εικόνες, εικόνες, και πολλά άλλα. Έτσι, αυτό είναι μόνο ένα τρέιλερ και νοητικό μοντέλο για το τι είναι να έρθει. Τώρα, εγώ procrastinated λίγο το πρωί. Ήμουν είδος του περίεργος να δω τι η ταπετσαρία Microsoft πραγματικότητα μοιάζει σήμερα. Και αυτό αποδεικνύεται κάποιος το 2006 στην πραγματικότητα πήγε σχεδόν ακριβώς το ίδιο σημείο να φωτογραφίζουν στην πραγματικότητα τι μοιάζει ότι αυτές τις μέρες. Το πεδίο είναι πλέον μια μικρή κατάφυτη. Έτσι, μιλώντας σήμερα από τις εικόνες, ας φέρει πίσω Daven εδώ στην οθόνη και Νικολάου, και απλά να σας υπενθυμίσω ότι αν θέλετε να ενωθούν μαζί μας για μεσημεριανό γεύμα αυτή την Παρασκευή, το κεφάλι με τη συνήθη URL μας εδώ. Έτσι, όταν δεν αφήνουμε ανοικτά τη Δευτέρα; Εισαγάγαμε αυτό το πρόβλημα, σωστά; Αυτό ήταν φαινομενικά μια σωστή εφαρμογή της ανταλλαγής, σύμφωνα με την οποία θα λαμβάνει δύο ακεραίων, ένα ονομάζεται, που ονομάζεται β, ανταλλάξουν τους, ακριβώς όπως και η Laura έκανε εδώ στη σκηνή με το γάλα και το νερό, με τη χρήση μιας προσωρινής μεταβλητή, ή ένα άδειο φλιτζάνι, έτσι ώστε θα μπορούσαμε να βάλουμε β σε ένα και ένα σε β χωρίς να κάνει ένα σωρό από πράγματα. Χρησιμοποιήσαμε μια μεταβλητή. Λέγεται temp. Αλλά αυτό ήταν το θεμελιώδες το πρόβλημα με αυτόν τον κώδικα τη Δευτέρα; Ποιο ήταν το πρόβλημα; Ναι. ΚΟΙΝΟ: Δεν καταλαμβάνει περισσότερο χώρο. DAVID J. MALAN: Καταλαμβάνει περισσότερα χώρο, γιατί είμαι χρησιμοποιώντας μια μεταβλητή, και αυτό είναι εντάξει. Αυτό είναι αλήθεια, αλλά είμαι πρόκειται να πω ότι είναι εντάξει. Είναι μόνο 32 bits στο μεγάλο σχέδιο των πραγμάτων, έτσι δεν είναι μεγάλη υπόθεση. Άλλες σκέψεις; ΚΟΙΝΟ: Είναι swaps μόνο οι μεταβλητές σε τοπικό επίπεδο. DAVID J. MALAN: Ακριβώς. Είναι swaps μόνο τις μεταβλητές σε τοπικό επίπεδο. Επειδή κάθε φορά που θα καλέσετε έναν function-- όταν είχα τους δίσκους από Annenberg τελευταία φορά, έχετε κύρια στο κάτω μέρος. Μόλις καλέσετε μια συνάρτηση που ονομάζεται ανταλλαγή, swap δεν πάρει x και y, οι αρχικές τιμές. Τι κάνει ανταλλαγής πάρει, δεν μπορούμε να πούμε; ΚΟΙΝΟ: Αντίγραφα. DAVID J. MALAN: Έτσι αντίγραφά τους. Γι 'αυτό παίρνει ένα και δύο, αν θυμηθούμε το παράδειγμα από την τελευταία φορά, αλλά ένα αντίγραφο από ένα και δύο που είναι ανταλλαχθούν με επιτυχία. Αλλά δυστυχώς στο τέλος, αυτές οι τιμές είναι ακόμα η ίδια. Έτσι μπορούμε να δούμε αυτό με μας νέο φίλο, ελπίζουμε GDB, ότι εσείς ή οι TFs και Ca έχουν έχουν την καθοδήγησή σας προς τα εξής. Έτσι, δεν ανάκληση ανταλλαγής φαίνεται like-- ας ανοίξει Αυτό-- μοιάζει με αυτό. Έχουμε προετοιμαστεί x σε μία, y δύο. Είχε ένα σωρό εκτύπωσης στ του. Στη συνέχεια, όμως, το πλήκτρο κλήσης εδώ ήταν να ανταλλάξουν, η οποία είναι ακριβώς ο κώδικας που Μόλις είδα πριν από λίγο. Ποια είναι η σωστή σε πρώτη ματιά, αλλά λειτουργικά, αυτό το πρόγραμμα δεν λειτουργεί, επειδή δεν αλλάζετε μόνιμα x και y. Ας δούμε λοιπόν αυτό, μια γρήγορη προθέρμανση μέχρι εδώ με το GDB, ένα ./noswap. Ένα μάτσο συντριπτική πληροφορίες ότι Θα απαλλαγούμε από τον έλεγχο με L για τώρα. Και τώρα, θα πάω να να προχωρήσει και να το εκτελέσετε. Και, δυστυχώς, ότι δεν ήταν ότι χρήσιμο. Έτρεξε το πρόγραμμα μέσα από αυτό πρόγραμμα που ονομάζεται GDB, ένα πρόγραμμα εντοπισμού σφαλμάτων, αλλά δεν επιτρέψτε μου να σακί γύρω. Λοιπόν, πώς μπορώ πραγματικά παύση εκτέλεσης μέσα σε αυτό το πρόγραμμα; Έτσι σπάσει. Και θα μπορούσα να σπάσει σε οποιαδήποτε γραμμή αριθμός, ένα, 10, 15. Αλλά μπορώ επίσης να σπάσει συμβολικά λέγοντας διάλειμμα κύριο. Και αυτό πρόκειται να θέσει ένα διάλειμμα σημείο, όπως φαίνεται στη γραμμή 16 σε κύρια. Και πού είναι η γραμμή 16; Ας πάμε μέχρι τον κώδικα και να πάει μέχρι noswap. Και πράγματι, η γραμμή 16 είναι η πρώτα πολύ στο πρόγραμμα. Έτσι τώρα, αν πάω μπροστά και τον τύπο εκτελέσετε αυτή τη φορά, Enter, παύση. Οπότε ας σακί γύρω. Εκτύπωση x-- γιατί είναι x μηδέν; Και αγνοούν το σύμβολο του δολαρίου. Αυτό είναι μόνο για φανταχτερά χρήση του προγράμματος. Γιατί είναι x μηδέν αυτή τη στιγμή; Ναι. ΚΟΙΝΟ: Σταμάτησε λίγο πριν γραμμή 16, δεν είναι στην πραγματικότητα στη γραμμή 16. DAVID J. MALAN: Ακριβώς. GDB, από προεπιλογή, έχει διακοπεί εκτέλεση λίγο πριν από τη γραμμή 16. Γι 'αυτό δεν έχει εκτελεστεί, το οποίο σημαίνει ότι x είναι από κάποιο άγνωστο αξίας. Και πήραμε τυχεροί που είναι κάτι καθαρό σαν το μηδέν. Έτσι τώρα, αν μου πληκτρολογήσετε την επόμενη, τώρα εκτελεστεί 16. Είναι σε αναμονή για μένα να εκτελέσει 17. Επιτρέψτε μου να προχωρήσει και να εκτυπώσετε x. Είναι μία. Επιτρέψτε μου να προχωρήσει και να εκτυπώσετε y. Τι θα πρέπει να δούμε τώρα; ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Λίγο πιο δυνατά. ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Not quite a συναίνεση. Οπότε ναι, βλέπουμε κάποια αξία σκουπίδια. Τώρα, το γ είναι 134514064 εκεί. Λοιπόν, αυτό είναι μόνο κάποια αξία σκουπίδια. Το πρόγραμμά μου χρησιμοποιεί μνήμη RAM για διαφορετικούς σκοπούς. Υπάρχουν άλλες λειτουργίες. Άλλοι άνθρωποι έγραψαν στο εσωτερικό του υπολογιστή μου. Έτσι, αυτά τα κομμάτια έχουν χρησιμοποιηθεί για άλλες αξίες, και ό, τι βλέπω είναι τα απομεινάρια μερικών προηγούμενη χρήση της εν λόγω μνήμης. Έτσι, δεν είναι μεγάλη υπόθεση, γιατί το συντομότερο ως τύπου Ι επόμενο και στη συνέχεια να εκτυπώσετε y, που έχει προετοιμαστεί για να η τιμή που θέλω. Μέχρι τώρα, ας προχωρήσουμε λίγο πιο γρήγορα. N για την επόμενη. Ας το κάνουμε και πάλι. Ας το κάνουμε και πάλι. Αλλά δεν θέλω να χτυπήσει είναι εδώ, γιατί αν θέλετε να δείτε τι συμβαίνει στο εσωτερικό της ανταλλαγής, ποια είναι η εντολή; ΚΟΙΝΟ: βήματα. DAVID J. MALAN: βήματα. Έτσι, αυτό μου βήματα σε μια λειτουργία, όχι πάνω από αυτό. Και τώρα, είναι λίγο αινιγματική ειλικρινά, αλλά αυτό είναι μόνο λέγοντάς μου ότι είμαι στη γραμμή 33 τώρα. Και ας το κάνουμε και πάλι. Εκτύπωση temp. Αξία Σκουπίδια, αρνητική αυτή τη φορά, αλλά αυτό είναι απλά ακόμα μια αξία σκουπίδια. Οπότε ας κάνουμε το επόμενο, temp εκτύπωσης. Είναι αρχικοποιείται σε 1, το οποίο ήταν η τιμή του x, γνωστός και ως ένα. Τώρα, πού είναι μας και x που προέρχονται από; Λοιπόν, ανακοίνωση στην κύρια, είμαστε ονομάζονται αυτές οι τιμές x και y. Στη συνέχεια πέρασε τους να ανταλλάξουν ως εξής. X ήρθε πρώτο, κόμμα y. Και τότε, ανταλλαγής θα μπορούσε να τους καλέσει x και y. Αλλά για λόγους σαφήνειας, είναι καλώντας τους a και b. Όμως, α και β είναι τώρα πρόκειται να είναι αντίγραφα των χ και γ, αντιστοίχως. Έτσι, αν πάω πίσω στο GDB, temp είναι τώρα μία και είναι τώρα ένα. Αλλά αν το κάνω την επόμενη και τώρα κάνει εκτύπωση α, α έχει ήδη κινηθεί πάνω. Το γάλα έχει χυθεί μέσα στο πρώην ποτήρι χυμού πορτοκαλιού, ή το αντίστροφο. Και αν το κάνω την επόμενη φορά, και τώρα αν μπορώ να εκτυπώσετε ως επιταγή λογική, α εξακολουθεί να είναι δύο, αλλά b είναι τώρα ένα. Ειλικρινά, είναι ακόμα εκεί. Δεν με νοιάζει τι θερμοκρασία είναι. Αλλά μόλις τώρα τύπου, ας πούμε, συνεχίζουν να πάει πίσω, τώρα είμαι στο τέλος το πρόγραμμα. Και δυστυχώς, το χ είναι ακόμα ένα και y είναι ακόμα δύο. Έτσι, ό, τι ήταν η χρησιμότητα της GDB εκεί; Δεν με βοηθήσει να διορθώσετε το πρόβλημα per se, αλλά ελπίζω να με βοηθήσει καταλαβαίνω από την πραγματοποίηση ότι ναι, η λογική μου είναι σωστή, αλλά κωδικός μου δεν είναι εν τέλει έχουν μια μόνιμη επίδραση. Έτσι, αυτό είναι ένα πρόβλημα είμαστε πρόκειται να λύσει τώρα σήμερα. Αλλά ας φτάσουμε εκεί με τον τρόπο αυτό. String είναι ένα ψέμα. Είναι, επίσης, δεν είναι ένας τύπος δεδομένων ότι υπάρχει σε C. Είναι ήταν ένα συνώνυμο για ορισμένα χρόνο για κάτι άλλο, και μπορούμε να αποκαλύψει ότι ως ακολούθως. Επιτρέψτε μου να πάει μπροστά και να ανοίξει ένα πρόγραμμα που ονομάζεται συγκρίνουν-0. Και αντί να πληκτρολογήσετε αυτό το ένα έξω, θα αρχίσουμε να περπατήσει μέσα από τον κώδικα Έχω ήδη γράψει, αλλά είναι μόνο λίγες γραμμές. Έτσι, αυτό είναι compare-0. Και το πρώτο πράγμα που κάνω είναι να πάρει μια γραμμή κειμένου. Αλλά παρατηρήστε τι είμαι κάνει για πρώτη φορά. Τι είναι σαφώς διαφορετικές για γραμμή 21; Στην πραγματικότητα, περιμένετε ένα λεπτό. Αυτό είναι αντίγραφο δύο. Αυτό δεν είναι καν το σωστό πρόγραμμα. Εντάξει, προειδοποίηση spoiler. Εντάξει, έτσι δεν πειράζει. Αυτή είναι η απάντηση σε ένα μελλοντικό ζήτημα. Εδώ είναι compare-0, και είμαι για να πάρετε μια γραμμή κειμένου. Πρόγραμμα για πολύ απλούστερη. Έτσι, αυτό είναι απλή. Αυτό είναι σαν Εβδομάδα Ένας, Εβδομάδα Δύο πράγματα αυτή τη στιγμή. συμβολοσειράς s = GetString. Τώρα, μπορώ να το πω και πάλι εδώ κάτω. συμβολοσειράς t = GetString. Και στη συνέχεια, το τελευταίο πράγμα σε αυτό πρόγραμμα, όπως υποδηλώνει το όνομά του, είναι Πάω να προσπαθήσω να τους συγκρίνετε. Έτσι, αν s, η πρώτη σειρά, ισούται = t, τότε είμαι πρόκειται να πω πληκτρολογείτε το ίδιο πράγμα. Αλλιώς, Πάω να πω πληκτρολογήσετε διαφορετικά πράγματα. Έτσι, ας συγκεντρώσει και να εκτελέσετε αυτό το πρόγραμμα. Έτσι κάνουν συγκρίνετε μηδέν. Φαίνεται καλό. Δεν υπάρχουν σφάλματα μεταγλώττισης. Επιτρέψτε μου να προχωρήσει τώρα και πληκτρολογήστε ./compare-0. Επιτρέψτε μου να προχωρήσει και να πω κάτι : Daven και κάτι: Rob. Και εγώ πληκτρολογήσετε διαφορετικά πράγματα. Μέχρι στιγμής, όλα καλά. Πρόγραμμα φαίνεται να είναι σωστή. Αλλά ας τρέξει ξανά. Πείτε κάτι: Gabe. Πείτε κάτι: Gabe. Εντάξει. Ίσως να χτυπήσει το πλήκτρο διαστήματος ή κάτι funky. Ας το κάνουμε και πάλι. Έτσι Zamyla. Zamyla. Διαφορετικά τα πράγματα. Λοιπόν, τι συμβαίνει; Έτσι, έχουμε τις δύο αυτές γραμμές κώδικα, GetString που ονομάζεται δύο φορές. Και τότε, είμαι απλά προσπαθούν να συγκρίνουν s και t. Αλλά αυτό που πραγματικά τότε συμβαίνει; Λοιπόν, σχετικά με το χειρόγραφό μου να σφάζουν αυτό το παράδειγμα κάπως. Και ας ρίξει στην πραγματικότητα αυτό πάνω από εδώ, καθώς και. Έτσι, έχουμε μια γραμμή, όπως συμβολοσειράς s = GetString. Έτσι, αυτό είναι απλά η πρώτη ενδιαφέρουσα γραμμή από αυτό το πρόγραμμα. Αλλά τι ήταν όλο αυτό το διάστημα συμβαίνει κάτω από την κουκούλα; Λοιπόν, στην αριστερή πλευρά είναι κορδόνι, το οποίο είναι κάποιο είδος μεταβλητής, και λέγεται s. Έτσι ξέρω ότι αυτό είναι με τη χρήση της μνήμης, ή RAM, στον υπολογιστή μου με κάποιο τρόπο. Έτσι, Πάω να αφηρημένα επιστήσει ότι ως ένα τετράγωνο. 32 bits, αποδεικνύεται, αλλά περισσότερα για αυτό στο μέλλον. Και τότε, τι συμβαίνει εδώ; Λοιπόν, προφανώς GetString παίρνει μια συμβολοσειρά από το χρήστη. Και GetString πήρε Zamyla ή Gabe ή Daven. Έτσι, ας επιλέξουν το πρώτο εκείνων, που ήταν Daven. Έτσι, ουσιαστικά, τι GetString πήρε μου σε αυτή την πρώτη περίπτωση ήταν D-α-ν-ε-ν. Και τότε, τι άλλο έκανε να μου δώσει κρυφά; ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Ναι, η / 0 ή null χαρακτήρα. Γι 'αυτό μου έδωσε ουσιαστικά ένα string. Αλλά γνωρίζουμε ήδη από τα προηγούμενα φαίνεται ότι ένα string είναι απλά ένας πίνακας χαρακτήρων, και αυτό είναι καταγγελθεί από αυτό το ειδικό χαρακτήρα φρουρού, / 0. Αλλά αν αυτό είναι αλήθεια και αυτό είναι ένα τετράγωνο, Αυτό είναι σαφώς ένα πολύ μεγαλύτερο ορθογώνιο. Και πράγματι, αυτό είναι, Ισχυρίζομαι, μόνο 32 bits. Και αυτό είναι σαφώς περισσότερα από 32 bits, επειδή αυτό είναι πιθανώς οκτώ συν οκτώ συν οκτώ συν οκτώ συν οκτώ, μόνο και μόνο επειδή από bytes σε ASCII. Πώς στο καλό θα πάμε να χωρέσει Daven σε αυτό το μικρό κουτί εδώ; Λοιπόν, τι GetString πραγματικά κάνει; Λοιπόν, αυτό το πλέγμα αντιπροσωπεύει εδώ μνήμη ή μνήμη RAM του υπολογιστή μου. Οπότε ας αυθαίρετα λένε ότι αν κάθε ένα από αυτά αντιπροσωπεύει ένα byte, τότε μπορούμε να σκεφτούμε κάθε byte, όπως έχει μια διεύθυνση, όπως 33 Oxford Street, ή 34 Oxford Street, ή 35 Oxford Street. Έτσι ακριβώς όπως τα σπίτια έχουν διευθύνσεις και τα κτίρια έχουν διευθύνσεις, το ίδιο κάνουν και ατομικές bytes της μνήμης έχουν διευθύνσεις ή αριθμούς που προσδιορίζουν μοναδικά. Τώρα, αυτό είναι αυθαίρετος. Αλλά για να το κρατήσετε απλό, Πάω να χρησιμοποιούν δεκαεξαδικό μόνο με σύμβαση, αλλά το 0x σημαίνει τίποτε άλλο από «αυτό είναι το δεκαεξαδικό." και θα πάω να υποστηρίζουν ότι η "D" καταλήγει στο Byte One στη μνήμη. Δεν έχω τίποτα άλλο συμβαίνει σε μνήμη, έτσι Daven πήρε το πρώτο spot σε Byte One. Αυτό, στη συνέχεια, θα είναι 0x2. Αυτό πρόκειται να 0x3. Αυτό πρόκειται να είναι 0x4. Αυτό πρόκειται να 0x5. Αυτό πρόκειται να είναι 0x6. Αλλά τη στιγμή που θα αρχίσουμε να σκεφτόμαστε για το τι πράττειν του υπολογιστή κάτω από την κουκούλα, μπορείτε να αρχίσετε να συμπεράνουμε πώς, πριν από μερικά χρόνια, θα έχουν υλοποιηθεί C ίδιο. Τι είναι GetString πιθανώς returning-- γιατί αισθάνεται σαν να μην είναι επιστροφή Daven, per se, γιατί αυτός σίγουρα δεν θα για να χωρέσει σε αυτό το μικρό box-- έτσι τι είναι GetString πιθανότατα επιστρέφει; ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Η θέση της Daven. Και το έχει κάνει αυτό τότε Εβδομάδα One. Τι GetString είναι πραγματικά επιστροφή δεν είναι ένα string, per se. Αυτό είναι ένα από τα μικρά λευκά ψέματα. Είναι επιστρέφει τη διεύθυνση του κορδόνι στη μνήμη, η μοναδική διεύθυνση. Daven ζει σε 33 Oxford Street. Αλλά πιο λακωνικά, Gavin ζει σε 0x1, Διεύθυνση Number One. Έτσι, ό, τι παίρνει θέσει σε αυτό μικρό κουτί, στη συνέχεια, να είναι σαφής, είναι μόνο η διεύθυνση της συμβολοσειράς. Έτσι, όλο αυτό το διάστημα, αυτό έχει ήδη συμβαίνει. Αλλά τι υπαινίσσεται αυτό σε τώρα είναι ότι αν όλοι s έχει είναι ένας αριθμός στο εσωτερικό του, που είναι να σας σταματήσει, ο προγραμματιστής, από την τοποθέτηση οποιουδήποτε αριθμού σε κάθε μεταβλητή και μόνο άλμα σε αυτό το κομμάτι της μνήμης; Και πράγματι, θα δούμε αυτό είναι μια απειλή για την επόμενη φορά. Αλλά για τώρα, αυτό αισθάνεται ανεπαρκής. Αν λέω, πάρτε ένα string, θα μου δώσει Daven. Αλλά δεν πραγματικά να μου δώσετε Daven. Το μόνο που μου δίνουν είναι η διεύθυνση Daven του. Πώς μπορώ τότε γνωρίζουμε με βεβαιότητα όπου Daven αρχίζει και ends-- η ιστορία του να πάρει weird-- όπου Daven αρχίζει και τελειώνει, και, στη συνέχεια, η επόμενη κορδόνι στη μνήμη ξεκινά; Λοιπόν, εάν είστε μοιράζουν με την αρχή της Daven, κατ 'ουσίαν, πώς μπορώ να ξέρω όπου το τέλος του ονόματός του είναι; Αυτή η ειδική null χαρακτήρα, η οποία είναι το πιο σημαντικό τώρα αν χορδές κάτω από το κουκούλα είναι απλά προσδιορίζονται μοναδικά από τη θέση τους στη μνήμη. Έτσι, όλο αυτό το διάστημα, που είναι τι έχει γίνει. Έτσι, όταν εξετάζουμε τώρα ο κώδικας εδώ, εξηγούν αν θα το bug στην γραμμή 26. Γιατί είναι Zamyla και Zamyla διαφορετικό; Γιατί είναι Gabe και Gabe διαφορετικό; Ναι, στο πίσω μέρος. ΚΟΙΝΟ: Έχουν διαφορετικές διευθύνσεις. DAVID J. MALAN: Απλά επειδή έχουν διαφορετικές διευθύνσεις. Διότι όταν καλείτε GetString και πάλι, το οποίο θα κάνει γρήγορα εδώ, εάν αυτή είναι η δεύτερη γραμμή, κορδόνι t, όπως έκανα σε αυτό το πρόγραμμα, ισούται με μια άλλη κλήση σε GetString. Την επόμενη φορά που καλώ GetString, Πάω για να πάρετε ένα διαφορετικό κομμάτι της μνήμης. GetString επιτρέπεται να ζητήσει από το λειτουργικό συστήματος για όλο και περισσότερη μνήμη. Δεν πρόκειται να χρησιμοποιήσετε ξανά την ίδια έξι bytes κάθε φορά. Είναι πρόκειται να πάρει ένα νέο κομμάτι της μνήμης, η οποία σημαίνει t πρόκειται να πάρει κάποια άλλη αξία εδώ. Έτσι, όταν κάνω s ισούται με = t, δεν είστε συγκρίνοντας D ενάντια σε αυτό και ένα κατά αυτό και V ενάντια σε αυτό. Είσαι σύγκριση αυτή ενάντια σε αυτό, το οποίο ειλικρινά είναι αρκετά useful-- useless-- είναι αρκετά άχρηστο, γιατί ποιος πραγματικά νοιάζεται, όπου οι χορδές είναι στη μνήμη; Και πράγματι, δεν έχουμε. Και εμείς δεν πρόκειται να ξεκινήσει ιδιαίτερα φροντίδα. Μόνο στο βαθμό που μπορεί να προκύψουν σφάλματα και απειλές για την ασφάλεια μπορεί να προκύψουν βούληση μπορούμε πραγματικά να αρχίσουν να ενδιαφέρονται για αυτό. Ας διορθώσετε αυτό το πρόβλημα. Βγάζει, μπορείτε να το διορθώσετε σούπερ απλά. Και ας πραγματικότητα, πριν αποκαλύπτουν ότι και πάλι, τι θα κάνεις αν σε μια τάξη CS50, και θα έπρεπε να εφαρμόσουν μια σύγκριση σε σχέση με δύο χορδές. Μπορείτε προφανώς δεν μπορεί απλά να χρησιμοποιήσετε s ισούται = t. Αλλά ακριβώς λογικά, πώς Θα μπορείτε να συγκρίνετε αυτή τη σειρά έναντι αυτού του string χρησιμοποιώντας τον κωδικό C; Ναι. ΚΟΙΝΟ: Απλά κάνουμε το για βρόχο [δεν ακούγεται] DAVID J. MALAN: Perfect. ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Ναι. Απλά χρησιμοποιήστε ένα βρόχο ή ενώ βρόχο ή οτιδήποτε άλλο. Αλλά ακριβώς εφαρμόσει τη βασική ιδέα ότι, αν Αυτό είναι ένα κομμάτι της μνήμης ή μια σειρά και αυτό είναι, επαναλήψεις πάνω τόσο κατά την ίδια στιγμή. Και συγκρίνει μόνο τις επιστολές. Και έχετε να είναι ένα λίγο προσεκτικοί, γιατί Δεν θέλουμε ένα δάχτυλο για να πάει πέρα ​​από το άλλο επειδή ένα string είναι μακρύτερο από το άλλο. Έτσι θα πάμε να θέλουν να ελέγχουν για αυτή η ιδιαίτερη αξία στο τέλος, null. Αλλά είναι πραγματικά, στο τέλος, τόσο απλό. Και ειλικρινά, δεν χρειαζόμαστε να ανακαλύψουμε εκ νέου ότι η ρόδα. Εδώ είναι η έκδοση δύο. Και τι Πάω να πω εδώ είναι ότι αντί να συγκρίνει s ισούται = t, Είμαι αντί πρόκειται να πω, αν κορδόνι σύγκριση s κόμμα t ισούται με = 0. Τώρα, τι είναι κορδόνι συγκρίνετε; Αποδεικνύεται, είναι μια λειτουργία που έρχεται με C, των οποίων ο σκοπός στη ζωή είναι η σύγκριση δύο χορδές. Και ανακατέψτε συγκρίνετε, αν διαβάσουμε της σελίδα man ή έγγραφα ή CS50 αναφοράς, θα απλά να σας πω ότι η αναταραχή συγκρίνετε επιστρέφει είτε ένα αρνητικό αριθμό ή ένας θετικός αριθμός ή μηδέν, όπου το μηδέν σημαίνει ότι είναι ίσες. Έτσι απλά εικασίες. Τι μπορεί να σημαίνει αν ανακατεύετε σύγκριση αποδόσεων αρνητική τιμή ή θετική αξία; ΚΟΙΝΟ: Μεγαλύτερο ή μικρότερο. DAVID J. MALAN: Ναι, μεγαλύτερο ή μικρότερο από. Έτσι, αν θέλετε να ταξινομήσετε ένα ολόκληρο μάτσο χορδές σε ένα dictionary-- όπως θα είμαστε τελικά κάτω από το road-- τέλεια λειτουργία για να χρησιμοποιήσετε ενδεχομένως, επειδή πρόκειται να το κάνουμε αυτό Σύγκριση των strings για σας, και πείτε έχετε κάνει ένα έρχεται πριν b, ή δεν β έρθει πριν από ένα αλφαβητικά. Μπορούμε να κάνουμε ακριβώς αυτό. Και παρατηρήσετε έκανα ένα άλλο πράγμα σε αυτό το παράδειγμα. Τι άλλο έχει αλλάξει υψηλότερη σε αυτήν την κύρια λειτουργία; Char *. Και αυτό είναι ότι άλλο λευκό ψέμα. Όλο αυτό το διάστημα, όταν έχετε γράφει κορδόνι, έχουμε κρυφά ξαναγράφοντας εγχόρδων ως char * έτσι ώστε κλαγγή πραγματικότητα σας καταλαβαίνει. Με άλλα λόγια, σε CS50.h και όπως θα δούμε τελικά, κάναμε ένα συνώνυμο ονομάζεται κορδόνι ότι είναι το ίδιο πράγμα όπως char *. Και προς το παρόν, γνωρίζουμε μόνο ότι η *, Στο πλαίσιο αυτό, τουλάχιστον, σημαίνει τη διεύθυνση. Η διεύθυνση του τι; Λοιπόν, το γεγονός ότι είπα char *, και όχι int * ή επιπλέουν *, σημαίνει ότι char * είναι η διεύθυνση ενός χαρακτήρα. Έτσι, αυτό το μικρό κουτί εδώ, γνωστός και ως εγχόρδων, είναι πραγματικά από τον τύπο char *, το οποίο είναι απλώς ένα φανταχτερό τρόπο λέγοντας, σε αυτό το πλαίσιο θα πάνε μια διεύθυνση. Και τι σημαίνει ότι η διεύθυνση αναφέρεται σε; Προφανώς, μια χαρα. Αλλά θα μπορούσαμε απολύτως έχουν int * και άλλα πράγματα. Αλλά για τώρα, char * είναι πραγματικά το πιο απλή και ένα ενδιαφέρον. Έτσι ώστε αυτό το πρόβλημα συμβαίνει να αυξηθεί, όμως, και πάλι. Ας υποθέσουμε ότι έχω ανοίξει αυτό το πρόγραμμα. Ας δούμε τώρα αν μπορούμε να προβλέψουμε τι είναι λάθος με αυτόν τον κωδικό. Έτσι, σε αυτό το πρόγραμμα, αντιγραφή-0, είμαι πρόκειται να προχωρήσει και πάλι κλήση GetString και να αποθηκεύσει την τιμή s. Και τότε, γιατί το κάνω αυτό, ακριβώς όπως μια υπενθύμιση από εβδομάδες παρελθόν; Κάναμε πω ότι GetString μερικές φορές επιστρέφει null. Τι σημαίνει αυτό, αν GetString επιστρέφει null; Κάτι πήγε στραβά. Είναι ίσως σημαίνει ότι η τιμή είναι πάρα πολύ μεγάλο, από του υπολογιστή της μνήμης. Συμβαίνει super, super, super σπάνια, αλλά θα μπορούσε να συμβεί. Θέλουμε να ελέγξετε για αυτό, και αυτό είναι το μόνο που κάνουμε. Επειδή θα δούμε τώρα, αν δεν το κάνετε αρχίσετε να ελέγχετε συνήθως για πράγματα όπως null, ίσως στην πραγματικότητα αρχίζουν να πηγαίνουν σε διευθύνσεις μνήμης που δεν είναι έγκυρα. Και θα πάμε για να ξεκινήσει την πρόκληση όλο και περισσότερα σφάλματα κατάτμησης. Ή σε ένα Mac ή PC, απλά προκαλώντας έναν υπολογιστή για να κρεμάσετε ή ένα πρόγραμμα για να παγώσει, ενδεχομένως. Μέχρι τώρα, έχω αυτή την αξίωση στο αντίγραφο-0.c, ότι Πάω να αντιγράψετε αυτές τις χορδές με τρόπο της γραμμής 28. Και τότε, θα πάω με την αξίωση στο κάτω μέρος εδώ που είμαι θα να αλλάξει έναν από αυτούς. Έτσι παρατηρήσετε αυτό. Καλώ τον παλιό του φίλο strlen μας. Και απλά να εξηγήσει στα αγγλικά τι αυτή η γραμμή 34 κάνει; Τι κάνει t βραχίονα 0 αντιπροσωπεύουν την αριστερά. Ναι. ΚΟΙΝΟ: Ο πρώτος χαρακτήρας του t; DAVID J. MALAN: Ο πρώτος χαρακτήρας του t. Αυτό είναι. Ο πρώτος χαρακτήρας του t, θέλω να αναθέσει την κεφαλαία έκδοση του πρώτου χαρακτήρα στο t. Έτσι, αυτό είναι κεφαλαιοποίηση το πρώτο γράμμα. Και τότε, το τελευταίο πράγμα που θα κάνω σε αυτό το πρόγραμμα είναι ότι ισχυρίζονται εδώ το πρωτότυπο, s, και εδώ είναι το αντίγραφο, t. Όμως, με βάση την ιστορία που μόλις είπε σχετικά με το τι πραγματικά είναι χορδές, τι είναι η γραμμή 28 πραγματικά κάνει, και τι είναι η προκύπτουσα bug θα να είναι στην οθόνη; Έτσι, η πρώτη, η πρώτη ερώτηση, 28. Τι είναι το κορδόνι t = s κάνει πραγματικά; Αν έχουμε στην αριστερή πλευρά πλευρά εδώ συμβολοσειράς t = s? ότι μου δίνει ένα κουτί εδώ και ένα κουτί εδώ. Και ας υποθέσουμε ότι αυτή η διεύθυνση είναι 0x, ας πούμε, 50 αυτή τη φορά, αυθαίρετα. Τι κάνει εγχόρδων t = s κάνει κάτω από την κουκούλα; ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Αποθηκεύει τη μνήμη αντιμετωπίσει εκεί, έτσι 0x50 πάει εκεί. Έτσι, αν τώρα, πάω με την πρώτη χαρακτήρα σε t και κεφαλαία αυτό, τι είμαι πραγματικά κάνει να s; Είμαι πραγματικά κάνει το ίδιο πράγμα, σωστά; Γιατί αν Διεύθυνση 0x50-- και μόνο, εγώ Δεν έχει πολλά περιθώρια στον πίνακα εδώ, αλλά υποθέτουν ότι αυτό είναι 0x50 εδώ κάτω, κάπου στη μνήμη του υπολογιστή μου. Και έχω, για παράδειγμα, ο Gabe σε πεζά εδώ, όπως αυτό. Και έχω πει t βραχίονα 0 παίρνει κεφαλαιοποιούνται. Λοιπόν, t βραχίονα 0 είναι το πρώτο γράμμα t. Έτσι, λίγο g πρόκειται να γίνει μεγάλη G. Αλλά το πρόβλημα είναι, τι s επίσης δείχνουν; ΚΟΙΝΟ: Το ίδιο. DAVID J. MALAN: Το ίδιο ακριβώς πράγμα. Έτσι, μια απλή εξήγηση ίσως, ακόμη και αν η σύνταξη είναι λίγο περίεργο. Έτσι, ας κάνουμε αυτό. Κάντε copy-0 και στη συνέχεια ./copy-0. Πείτε κάτι: Gabe. Και δυστυχώς, και οι δύο από αυτές έχουν ήδη κεφαλαιοποιηθεί, αλλά ότι οι υποκείμενες λόγος για τον οποίο είμαστε απλά τώρα ασχολούνται με τις διευθύνσεις. Επομένως, πώς θα αρχίσουμε να address-- λογοπαίγνιο δεν intended-- πώς μπορούμε να αρχίσουμε να αντιμετωπίσει αυτό το συγκεκριμένο πρόβλημα; Λοιπόν, σε copy1.c, τα πράγματα πάνε για να πάρετε μια λίγο πιο περίπλοκη. Αλλά θα ήθελα να ισχυρίζονται ότι ένα εννοιολογικά απλή λύση. Έτσι, είναι δύσκολο να πάρει την πρώτη ματιά. Δεν πρόκειται να είναι εύκολο για την πρώτη φορά που θα πληκτρολογήσετε έξω, ίσως, αλλά αν το πρόβλημα είναι ότι απλά να κάνει t = s μόνο αντιγράφει τη διεύθυνση, τι, και πάλι, αν μπορώ να διαλέξω για εσάς, πρόκειται να είναι η λύση για να κάνει αντιγραφή ένα string; ΚΟΙΝΟ: Θα χρειαστεί κατά πάσα πιθανότητα χρησιμοποιήσετε ξανά ένα βρόχο. DAVID J. MALAN: Ναι. Έτσι θα πάμε να χρειαστεί και πάλι ένα βρόχο. Και επειδή αν θέλουμε να αντιγράψετε ένα string s σε ένα άλλο string, εμείς μάλλον θα θέλετε να το κάνετε χαρακτήρα προς χαρακτήρα. Αλλά το πρόβλημα είναι, εάν αυτό είναι αρχικά s, τώρα πρέπει να αρχίσουμε ρητά κατανομή μνήμης για t. Με άλλα λόγια, ας αναδιατυπώσει αυτό για μια τελευταία φορά. Αν αυτή είναι η συμβολοσειρά s = GetString. Και ας βάλουμε αυτό εδώ, καθώς και. Αυτό είναι GetString. Και στη συνέχεια, η εικόνα για κάτι όπως αυτό πρόκειται να είναι όπως και πριν, G-Α-Β-e- / 0. Αυτό φαίνεται λίγο κάτι σαν αυτό. Και s, ως εκ τούτου, καλούμε αυτό 0x50, και ότι πρόκειται να είναι 51, 52. Έτσι, αυτό είναι 0x50. Και στη συνέχεια, να κάνω κορδόνι t. Στη μνήμη του, ότι είναι ακριβώς πρόκειται να να μου δώσει μια μικρή πλατεία σαν αυτό. Έτσι, ποιο είναι το βασικό βήμα τώρα; Αν θέλετε να αντιγράψετε s στο t, τι κενό δεν θα πρέπει να συμπληρώσετε εδώ; Ή ό, τι χρειαζόμαστε για να κάνω σε υψηλό επίπεδο; Ναι; Κάποιος; Ναι. ΚΟΙΝΟ: Πρέπει να [δεν ακούγεται]. DAVID J. MALAN: Ναι, μπορούμε Πρέπει να συμπληρώσετε αυτό το κενό. Δεν μπορείτε να αντιγράψετε και, στη συνέχεια, κεφαλαιοποιήσει όνομα Gabe του μέχρι να ρωτήσω το λειτουργικό σύστημα για ένα άλλο κομμάτι της μνήμης ότι είναι τουλάχιστον τόσο μεγάλο όσο το πρωτότυπο. Και αυτό μας αφήνει με μια ερώτηση. Πώς μπορώ να ζητήσω το λειτουργικό σύστημα δεν μόνο για μια απλή μικρή pointer-- καθώς αυτό ονομάζεται, μια διεύθυνση, ένα δεν pointer-- για ένα απλό μικρό κουτί όπως αυτό που ονομάζεται ένα string; Πώς μπορώ να ζητήσω το λειτουργικό συστήματος για ένα μεγάλο κομμάτι της μνήμης; Μέχρι στιγμής, έχω πάρει μόνο το πίσω έμμεσα καλώντας GetString. Λοιπόν, πώς είναι GetString ακόμη και να πάρει τη μνήμη του; Λοιπόν, αποδεικνύεται ότι δεν υπάρχει αυτή η άλλη λειτουργία εδώ ότι θα αρχίσουν τώρα να χρησιμοποιήσετε. Τώρα, αυτό φαίνεται πολύ πιο αινιγματικά than-- και είμαι ο μόνος που μπορεί να δει it-- αυτή η γραμμή μοιάζει πολύ πιο αινιγματική τότε θα πρέπει με την πρώτη ματιά. Αλλά ας το πειράζω χώρια. Από την αριστερή πλευρά, έχω char * t. Έτσι, στα αγγλικά, ας αρχίσουμε να διατυπώσει σωστή ποινές σε τεχνική ορολογία. Έτσι, αυτό είναι μια κατανομή μεταβλητή τύπου char * ονομάζεται t. Τώρα, τι σημαίνει αυτό στην πράξη; Λοιπόν, αυτό σημαίνει ότι, ό, τι θα πάω να θέσει σε αυτή τη μεταβλητή που ονομάζεται t; Μια διεύθυνση ενός χαρακτήρα. Έτσι, αυτό είναι μόνο η απλούστερη, πιο λογικό τρόπο του περιγράφει την αριστερή πλευρά. Έτσι ώστε να δημιουργεί αυτό το κουτί εδώ μόνο. Έτσι ώστε η δεξιά πλευρά, κατά πάσα πιθανότητα, πρόκειται να διαθέσει ότι οι μεγαλύτερες κομμάτι της μνήμης πώς; Ας δώσουμε έμφαση αυτή χώρια. Είναι συντριπτική με την πρώτη ματιά, αλλά τι συμβαίνει εδώ μέσα; Πρώτον, υπάρχει malloc, η οποία είναι προφανώς ο νέος μας φίλος, "Μνήμη διαθέσει." Έτσι, αυτό είναι το επιχείρημα που πέρασε σε αυτό, γι 'αυτό είναι ένα αρκετά μεγάλο επιχείρημα. Ας δώσουμε έμφαση αυτή χώρια. strlen του s, φυσικά, αντιπροσωπεύει στο-- ΚΟΙΝΟ: Ο αριθμός των χαρακτήρων. DAVID J. MALAN: Ακριβώς το αριθμό των χαρακτήρων σε s. Έτσι ώστε το μήκος του s, η αρχική χορδή. Έτσι G-Α-Β-Ε. Έτσι είναι πιθανόν τέσσερις σε αυτή την περίπτωση. Γιατί να κάνω +1 μετά καλώντας strlen του s; ΚΟΙΝΟ: [δεν ακούγεται] DAVID J. MALAN: Για ότι ειδικό χαρακτήρα null. Αν με ρωτήσεις τι είναι το μήκος της Το όνομά Gabe του, εγώ είμαι πρόκειται να πω τέσσερα. Κάτω από το καπό, όμως, θα πρέπει ότι η πέμπτη byte για το null χαρακτήρα. Έτσι, γι 'αυτό κάνω το +1. Τώρα, μόνο σε περίπτωση που εκτελείτε αυτό πρόγραμμα σε έναν υπολογιστή, εκτός από, ας πούμε, η συσκευή CS50, όπου το μέγεθος ενός char μπορεί να είναι διαφορετικά από τη δική μου computer-- Αποδεικνύεται ότι μπορώ να καλέσω αυτό sizeof χειριστή, απλά ρωτήστε τον υπολογιστή, ποιο είναι το μέγεθος ενός char σε αυτό τον υπολογιστή; Και με τον πολλαπλασιασμό πέντε σε αυτό το παράδειγμα με το μέγεθος ενός char, το οποίο στους περισσότερους υπολογιστές θα απλά να είναι ένα, malloc πρόκειται να διατεθούν για μένα αυτό το μεγάλο κομμάτι της μνήμης εδώ στα δεξιά. Και πρόκειται να return-- είναι μια function-- έτσι είναι πρόκειται να επιστρέψει σε μένα αυτό; ΚΟΙΝΟ: Η διεύθυνση; DAVID J. MALAN: Η διεύθυνση του τι; ΚΟΙΝΟ: Από τη μνήμη που διατίθενται; DAVID J. MALAN: Από το μνήμης που διατίθενται. Έτσι, δεν έχω ιδέα, ειλικρινά, όπου αυτό πρόκειται να καταλήξει. Πάω να προτείνω πρόκειται να καταλήξει σε 0x88. Εντελώς αυθαίρετα, αλλά κάπου εκτός από 0x50, επειδή το λειτουργικό σύστημα, τι Windows και Mac OS κάνει για μένα, είναι βεβαιωθείτε ότι είναι δίνοντας με διαφορετικά κομμάτια της μνήμης RAM. Έτσι, αυτή είναι η αξία όπου αυτό κομμάτι της μνήμης μπορεί να καταλήξει. Έτσι, αυτό είναι αυτό που καταλήγει εδώ, 0x88. Μέχρι τώρα ξεκάθαρα, μπορώ να καταλάβω ότι αυτό δεν είναι το ίδιο με αυτό, επειδή είναι δείχνοντας διαφορετικά κομμάτια της μνήμης. Έτσι, αν τώρα πραγματικά θέλετε να αντιγράψετε αυτό σε, ας κάνουμε προτεινόμενη λύση σας. Ας πάμε, δημιουργούν ένα βρόχο, και να κάνουμε t βραχίονα i παίρνει s βραχίονα i. Επειδή τώρα μπορώ να χρησιμοποιήσω αυτός ο πίνακας-σαν συμβολισμός, διότι ακόμη και αν malloc πολύ γενικά μου διαθέτει μνήμη, μνήμη είναι απλά συνεχόμενα bytes. Byte, byte, byte, πλάτη με πλάτη με πλάτη. Μπορώ σίγουρα ως προγραμματιστής να το αντιμετωπίσουμε ως μια σειρά, η οποία σημαίνει ότι μπορώ να χρησιμοποιήσω αυτό το τέλος εξοικειωμένοι σημειογραφία μόλις μερικές αγκύλες. Επιτρέψτε μου λοιπόν να σταματήσετε εκεί, γιατί αυτό είναι πολύ μονομιάς, ακόμη αν και η βασική ιδέα για να ανακεφαλαιώσουμε είναι ότι η σειρά, όλο αυτό το διάστημα, δεν είναι ένας νέος τύπος δεδομένων per se. Είναι ακριβώς το λεγόμενο δείκτη, μια διεύθυνση ενός χαρακτήρα, που απλά σημαίνει ότι είναι ένας αριθμός ότι από την ανθρώπινη σύμβαση έχουμε την τάση να γράψει ως 0x κάτι. Αλλά αυτό είναι απλά ένας αριθμός, όπως 33 Oxford Street, η οποία συμβαίνει να είναι η Διεύθυνση CS κτιρίου. Οποιεσδήποτε ερωτήσεις σχετικά με αυτά τα στοιχεία; Ναι; ΚΟΙΝΟ: Γιατί ελέγχουμε για t ίση με null; DAVID J. MALAN: Γιατί ελέγξτε για t ίση με null; Αν διαβάσετε την documentation-- μεγάλη question-- για malloc, πρόκειται να πω σε ψιλά γράμματα, Μερικές φορές malloc να επιστρέψει null, ακριβώς όπως GetString. Και πράγματι, GetString επιστρέφει null εάν, με τη σειρά του, malloc επιστρέφει null, επειδή GetString χρησιμοποιεί malloc. Και αυτό μπορεί να συμβεί εάν το λειτουργικό σύστημα, Mac OS, Windows, οτιδήποτε άλλο, είναι απλά από τη μνήμη σας. Έτσι, αυτό είναι ό, τι συνέβη εκεί. Και επιτρέψτε μου να αποκαλύψει ένα άλλο πράγμα ότι θα μπορούσε να φυσήξει απλά το μυαλό σας ή εντελώς να είναι πολύ πάνω από τη γραμμή. Αλλά επιτρέψτε μου να σηκώσει το ίδια για βρόχο για αντιγραφή, το οποίο πριν από λίγο, ανάκληση ήταν αυτό. t βραχίονα i παίρνει s βραχίονα i. Ωραίο και φιλικό προς το χρήστη. Αίσθηση σαν Εβδομάδα Δύο ξανά. Αλλά αυτή η έκδοση πραγματικότητα μπορεί να είναι ξαναγραφεί όπως αυτό, το οποίο φαίνεται αινιγματικό. Είναι μια τεχνική που ονομάζεται δείκτης αριθμητική, αριθμητική διεύθυνση. Αλλά γιατί το κάνει αυτό το έργο; Τώρα ενοχλητικά, η συντάκτες της C αποφάσισε να χρησιμοποιήσει Το σύμβολο * για διαφορετικούς σκοπούς. Το έχουμε δει να χρησιμοποιούνται ήδη μια φορά, char *, που σημαίνει "να μου δώσει μια μεταβλητή ότι πρόκειται να περιέχει η διεύθυνση ενός χαρακτήρα. " Έτσι, char * σε αυτό το πλαίσιο σημαίνει «δώσε μου μια μεταβλητή." Δυστυχώς, αν χρησιμοποιείτε το * χωρίς μια λέξη μπροστά του, όπως char, αυτό που σήμερα λέγεται χειριστή dereference. Και θα δούμε περισσότερα από αυτό πριν από καιρό. Αλλά αυτό ακριβώς σημαίνει "πάει εκεί." Είναι σαν να λέμε, αν κάποιος μου έδωσε σε ένα κομμάτι χαρτί "33 Oxford Street," αν το κάνω "* 33 Oxford Street," που σημαίνει "Πάμε κάτω από το δρόμο προς το κτίριο CS." Έτσι, * ακριβώς σημαίνει να πάει εκεί, αν δεν υπάρχει λέξη μπροστά του. Έτσι τι είναι t, να είναι σαφές; t είναι η διεύθυνση του κομμάτι της μνήμης που δόθηκε πίσω σε μένα. s είναι η διεύθυνση του ό, τι, για να είναι σαφής, στο παράδειγμα που έχουμε συζητήσει, των πεζών Gabe; s είναι η διεύθυνση of-- ΚΟΙΝΟ: Το κορδόνι. DAVID J. MALAN: Από το αρχικό του όνομα Gabe του. Έτσι είναι η διεύθυνση του αυτό το κομμάτι της μνήμης. Έτσι, αν μπορώ να πω t + i-- i, ειδοποίηση, είναι απλά ο παλιός μας φίλος. Είναι απλά μια μεταβλητή δείκτη ότι είναι επανάληψη από το μηδέν μέχρι προς το μήκος της συμβολοσειράς s. Γι 'αυτό πρόκειται να είναι μηδέν, τότε, Στη συνέχεια δύο, στη συνέχεια, τρεις, τέσσερις, στη συνέχεια. Έτσι, ας συγκεντρώσει αυτά τα νέα Scratch-σαν κομμάτια του παζλ, αν θέλετε, μολονότι, και πάλι, η σύνταξη είναι πολύ πιο απόκρυφες από Scratch. Έτσι, t είναι μια διεύθυνση + i πρόκειται να μου δώσει ένας αριθμός, επειδή αυτά είναι όλα αριθμοί που έχουμε σχέδιο ως εξάγωνο. Αλλά είναι απλά αριθμοί. Έτσι, αν η διεύθυνση του t είπαμε ήταν 0x88, 0x88, τι είναι συν μηδέν. Ακόμα κι αν δεν είστε άνετα με εξάγωνο ακόμα, ρίξτε μια εικασία. ΚΟΙΝΟ: Το αρχικό. DAVID J. MALAN: Ακόμα 0x88. Έτσι τι * 0x88 σημαίνει; Σημαίνει, "εκεί" που σημαίνει αποτελεσματικά, "να βάλει το δάχτυλό σας εδώ." Και τώρα στην δεξιά πλευρά του αυτή η έκφραση, * και, στη συνέχεια, σε parens, s + i σημαίνει S, η οποία είναι η αντιμετωπίσει μέχρι εδώ από το μικρό g. s + 0 είναι, φυσικά, s, s ό, τι είναι. Μέχρι τώρα, αυτό είναι * s, η οποία ακριβώς όπως * 33 Oxford Street σημαίνει να πάει στη διεύθυνση s. Έτσι, εδώ είναι αυτό το δάχτυλο, το δεξί χέρι. Λοιπόν, τι θα πάω να αντιγράψετε σε τι; Το πράγμα σχετικά με το δικαίωμα, το οποίο είναι Gabe, λίγο g εδώ, μέσα εδώ. Και έτσι ώστε το αποτέλεσμα του ότι πρώτη επανάληψη του βρόχου, όπως προτείνεται, παρόλο που μοιάζει τρελό πιο περίπλοκη από ό, τι τίποτα έχουμε δει στο παρελθόν, απλά λέγοντας πηγαίνετε εδώ και αντιγράψτε τον χαρακτήρα αυτό εδώ. Αυτό σου δίνει ένα χάρτη με δύο θέσεις. Και θα δούμε πολύ περισσότερα από αυτό. Αλλά για τώρα, η ελπίδα είναι μόνο για να εισαγάγει κάποιες από αυτές τις βασικές ιδέες. Και πράγματι, ας δούμε ένα τελικό πρόγραμμα εδώ, και, στη συνέχεια, η υπόσχεση της πλαστελίνης, η οποία θα κάνει τα πάντα σωστά. Εντάξει. Έτσι, επιτρέψτε μου να ανοίξει up-- εκεί πάμε. Ας me-- θα έρθει πίσω σε αυτή την εικόνα πριν από καιρό. Επιτρέψτε μου να ανοίξουμε αυτό το τελευταίο παράδειγμα εδώ. Έτσι, εδώ είναι ένα super, super πρόγραμμα που θα επιτυγχάνει τίποτα στη ζωή που κάνει την ακόλουθη. Δηλώνει πρώτα δύο μεταβλητές, x και Υ, τα οποία δεν είναι αριθμοί αυτή τη φορά, per se. Δεν είναι ακέραιοι, per se. Είναι προφανώς int *. Έτσι απλά ο καθένας, τι σημαίνει αυτό εάν ο τύπος των δεδομένων σας, μεταβλητή σας, είναι τύπου int * αστέρων; Αυτή είναι η διεύθυνση ενός int. Έτσι, δεν έχω ιδέα πού είναι ακόμα. Είναι ακριβώς σημαίνει "που, τελικά, η διεύθυνση ενός int εδώ. " 0x50, 0x88, όπου αυτό είναι μνήμη, η διεύθυνση θα υπάρχει. Και αυτό είναι ό, τι y είναι πρόκειται να είναι, όπως καλά. Αν λέω τώρα x = malloc (sizeof (int)), Αυτό είναι ένα φανταχτερό τρόπο λέγοντας, hey λειτουργικό σύστημα, μέσω της malloc, να μου δώσει αρκετή μνήμη για το μέγεθος από έναν int, η οποία είναι πιθανώς πρόκειται να είναι 32 bits ή τεσσάρων bytes. Έτσι, ό, τι δεν επιστρέψει malloc; Malloc επιστρέφει μια διεύθυνση. Έτσι τι πρόκειται να πάρει αποθηκεύονται στο x; Η διεύθυνση του κομμάτι της μνήμη, τα τέσσερα bytes, η malloc Μόλις βρήκα για μένα, ζητώντας το λειτουργικό σύστημα. Τώρα, εν τω μεταξύ, η γραμμή τέσσερα εδώ, η * x = 42. Ακριβώς για να είναι σαφής, τι συμβαίνει εκεί κάτω; Από την αριστερή πλευρά, * x. αυτό είναι σαν * 33 Oxford Street. Έτσι * x σημαίνει αυτό; ΚΟΙΝΟ: Πηγαίνετε στο. DAVID J. MALAN: Πηγαίνετε σε αυτή τη διεύθυνση. Όπου αυτό κομμάτι της μνήμη είναι, πάμε σε αυτό. Και να τι υπάρχει, προφανώς; ΚΟΙΝΟ: 42. DAVID J. MALAN: 42. Εντάξει, * y, ίδια ιδέα. Πηγαίνετε στη διεύθυνση y. Βάλτε τον αριθμό 13 εκεί, αλλά αυτό είναι y αυτή τη στιγμή; ΚΟΙΝΟ: Δεν υπάρχει καμία μνήμη για το y. DAVID J. MALAN: Υπάρχουν είναι καθόλου μνήμη για το y. Έτσι, αυτό που κάνει y πιθανώς περιέχουν, όπως έχουμε πει; ΚΟΙΝΟ: Σκουπίδια. DAVID J. MALAN: Κάποια τιμή σκουπίδια. Τώρα, αξίας σκουπίδια είναι ακόμα ένας αριθμός. Μπορεί ακόμα να είναι λάθος για μια διεύθυνση. Είναι σαν κάποιος να γραμμένα κάτι προς τα κάτω, και ερμήνευσε εσφαλμένα την έννοια κάποια κτίριο κάτω από το δρόμο. Και αν απλά προσπαθήσουμε να πάμε σε ορισμένα κτίρια που δεν σας ανήκει, ή κάποιο κομμάτι της μνήμης που δεν έχουν ήταν δεδομένη, άσχημα πράγματα μπορεί να συμβούν. Υπολογιστής θα μπορούσε να συντριβή, ή κάποια άλλη ακαθόριστη συμπεριφορά μπορεί να συμβεί. Έτσι, η εισαγωγή, στη συνέχεια, να Binky είναι αυτό. Θυμάμαι ακόμα, 20 κάποιο περίεργο χρόνια αργότερα, όπου ήμουν όταν τελικά κατανοητό δείκτες. Ποια είναι να πούμε, αν αφήστε εδώ σε τρία λεπτά και νομίζω ότι δεν κατανοήσουν δείκτες, συνειδητοποιούν Έχω θυμόμαστε για 20 χρόνια για κάποιο τρελό λόγο πότε και γιατί τελικά βυθίστηκε σε, κάθεται με τη διδασκαλία μου τους συναδέλφους, Nishat Mehta στο πίσω από Eliot Hall Dining. Τώρα, έχω θυμήθηκε Αυτό επειδή αυτό ήταν ένα από τα θέματα που, σε Συγκεκριμένα, αγωνίστηκε με. Και τότε, επιτέλους κλικ, όπως και τολμώ να πω πολλά θέματα τελικά. Και τώρα, να αισθάνονται ότι όλα τα ευτυχέστερο και όλο και πιο πειστική, ας ρίξουμε μια τελευταία ματιά σε μας τρία τελευταία λεπτά εδώ στο Binky, από τον φίλο μας, Nick Parlante από το Στάνφορντ. [VIDEO PLAYBACK] Γεια σου, Binky. Ξυπνήστε! Ήρθε η ώρα για το δείκτη διασκέδαση. Τι είναι αυτό; Μάθετε σχετικά με τους δείκτες; Ω, ωραία! -Λοιπόν, Για να ξεκινήσετε, υποθέτω είμαστε Θα χρειαστείτε ένα ζευγάρι δείκτες. -εντάξει. Ο κωδικός αυτός διαθέτει δύο δείκτες, το οποίο μπορεί να δείξει σε ακέραιους αριθμούς. -εντάξει. Λοιπόν, βλέπω τους δύο δείκτες, αλλά δεν φαίνεται να δείχνουν σε τίποτα. -Ακριβώς. Αρχικά, οι δείκτες δεν δείχνουν τίποτα. Τα πράγματα δείχνουν να καλούνται pointees, και τους σύσταση του ένα ξεχωριστό στάδιο. Ω, σωστά, σωστά. Ήξερα ότι. Οι pointees είναι ξεχωριστή. Er, οπότε πώς να διαθέσει ένα pointee; -εντάξει. Λοιπόν, αυτός ο κώδικας διαθέτει μια νέα pointee ακέραιο, και αυτό το μέρος σύνολα x να επισημάνω σε αυτό. Γεια σου, που φαίνεται καλύτερα. Έτσι κάνετε το κάνετε κάτι. -εντάξει. Εγώ θα dereference το δείκτη x να αποθηκεύσετε τον αριθμό 42 σε pointee του. Για αυτό το τέχνασμα, θα χρειαστεί μου Magic Wand του dereferencing. -Σας Magic Wand της Καταργώντας την αναφορά; Αυτό-- αυτό είναι μεγάλη. -Αυτό Είναι ποιος είναι ο κωδικός μοιάζει. Εγώ απλώς θα δημιουργήσει τον αριθμό, και [POP] Γεια σου, κοίτα. Εκεί πηγαίνει. -Οπότε Κάνει μια dereference για x εξής το βέλος για να αποκτήσετε πρόσβαση pointee του. Σε αυτήν την περίπτωση, ένα κατάστημα 42 εκεί μέσα. Hey δοκιμάστε να τον χρησιμοποιήσετε για να αποθηκεύσετε τον αριθμό 13 διαμέσου του άλλου δείκτη, y. -εντάξει. Θα πάω πάνω από εδώ για να y, και να πάρει τον αριθμό 13 set up. Και στη συνέχεια, να λάβει το ραβδί του Καταργώντας την αναφορά και μόνο [BUZZ] Ω! Ω, hey! Αυτό δεν λειτούργησε. Ας πούμε, Binky, δεν νομίζω dereferencing y είναι μια καλή ιδέα, γιατί ξέρετε, τη σύσταση της pointee είναι ένα ξεχωριστό βήμα. Και δεν νομίζω ότι το κάναμε ποτέ. -Καλό σημείο. Ναι. Θα διατεθεί το δείκτη y, αλλά εμείς Ποτέ δεν είναι που να δείχνουν μια pointee. -Πολύ Παρατηρητικός. Γεια σου, ψάχνετε καλά εκεί, Binky. Μπορείτε να το διορθώσετε, έτσι ώστε y σημεία στην ίδια pointee ως x; -Βέβαια. Θα χρησιμοποιήσω το Magic Wand μου της Pointer Εκχώρηση. -Υπάρχει Ότι πρόκειται να είναι ένα πρόβλημα, όπως πριν; Όχι. Αυτό δεν έρχεται σε επαφή με τα pointees. Αλλάζει μόνο ένα δείκτη για να δείχνουν το ίδιο πράγμα όπως ένα άλλο. Ω, βλέπω. Τώρα y σημεία στο ίδιο σημείο με το x. Έτσι περιμένουμε. Τώρα, το Υ είναι σταθερό. Έχει ένα pointee. Έτσι, μπορείτε να δοκιμάσετε το ραβδί του Καταργώντας την αναφορά και πάλι να στείλετε το 13 πάνω. -UH, OK. Εδώ πηγαίνει. [POP] Γεια σου, κοίτα αυτό. Τώρα dereferencing έργα για y. Και επειδή οι δείκτες που μοιράζονται ότι ένα pointee, οι δύο δείτε το 13. Ναι. Sharing, οτιδήποτε. Έτσι θα πάμε να αλλάζουν θέσεις τώρα; Ω, κοιτάξτε. Είμαστε έξω από το χρόνο. -Μα -Απλά θυμηθείτε τους τρεις κανόνες δείκτη. Number One, η βασική δομή είναι ότι έχετε ένα δείκτη, και τα σημεία πάνω σε ένα pointee. Αλλά ο δείκτης και pointee είναι ξεχωριστή, και το κοινό λάθος είναι να δημιουργήσει ένα δείκτη, αλλά να ξεχάσετε να δώσετε ένα pointee. Αριθμός Δύο, δείκτης dereferencing ξεκινά από το δείκτη και ακολουθεί το βέλος του πάνω για να αποκτήσετε πρόσβαση pointee του. Όπως όλοι γνωρίζουμε, αυτή η λειτουργεί μόνο αν υπάρχει ένα pointee, η οποία είδος του παίρνει πίσω με το άρθρο Number One. Number Three, δείκτης ανάθεση παίρνει ένα δείκτη και αλλάζει σε σημείο να το ίδια pointee ως ένα άλλο δείκτη. Έτσι, μετά την ανάθεση, οι δύο δείκτες θα δείχνουν το ίδιο pointee. Μερικές φορές, αυτό ονομάζεται κοινή χρήση. Και αυτό είναι όλα υπάρχει σε αυτό, πραγματικά. Bye-bye τώρα. [ΤΕΛΟΣ VIDEO PLAYBACK] DAVID J. MALAN: Αυτό είναι για το CS50. Θα σας δούμε την επόμενη εβδομάδα.