[Παίζει μουσική] David J. Malan: Αυτό είναι σαν ένα σεμινάριο καινούριο σήμερα. ΕΝΤΆΞΕΙ. Έτσι, πολύ βροχερός έξω. Αυτό τείνει να συμβεί στις Τετάρτη, αλλά όλα τα πιο ευκαιρία Για ερωτήσεις σήμερα. Ας ξεκινήσουμε πραγματικά με την ταινία σε μια στιγμή. Αλλά θα ξεκινήσει μεγαλειωδώς όπως πάντα. Αυτό είναι CS50, και αυτό είναι το τέλος της εβδομάδας 4. Έτσι, αν έχετε παρακολουθήσει ποτέ Τηλεόραση ή μια ταινία, όπου υπάρχουν ορισμένοι ειδικοί ηλεκτρονικών υπολογιστών και η αστυνομία, ή FBI, ή κάποια οργάνωση προσπαθεί να πιάσει μερικά αντίπαλος, καλά, έχετε ακούσει την έκφραση "ενισχύσει" σύμφωνα με την οποία κατά κάποιο τρόπο ότι ο τεχνικός που μαγικά μεγεθύνει απείρως μακριά για να δείτε τους εγκληματίες ταυτότητας ή ο αριθμός της πινακίδας ακόμη και την λάμψη ενός καθρέφτη ή η λάμψη του μάτι κάποιου. Έτσι, πράγματι, ας ρίξουμε μια ματιά μερικές τέτοιες σκηνές από το Χόλιγουντ. [ΑΝΑΠΑΡΑΓΩΓΗ] -Εντάξει, Τώρα ας πάρει μια καλή ματιά σε σας. -Κρατα το. Εκτελέστε αυτή πίσω. -Περίμενε ένα λεπτό. Πήγαινε δεξιά. -Υπάρχουν, Το πάγωμα αυτό. -ΠΛΗΡΗΣ ΟΘΟΝΗ. -Εντάξει, Το πάγωμα αυτό. Καταστήσει αυστηρότερη επάνω σε αυτό, θα σας; -φορέα Σε αυτή τύπος από την πίσω τροχό. -Zoom Στο δεξί εδώ σε αυτό το σημείο. -Με Τον κατάλληλο εξοπλισμό, η εικόνα θα μπορούσε να διευρυνθεί και ακονισμένα. -Τι είναι αυτό? -Είναι Ένα πρόγραμμα για την ενίσχυση. -Μπορείς Να σαφές ότι μέχρι κανένα; -Δεν γνωρίζω. Ας το ενισχύσει. -Enhance Α6 ενότητα. -I Ενίσχυσε την λεπτομέρεια, and-- Νομίζω ότι υπάρχει αρκετά για να ενισχύσει, αφήστε το στην οθόνη μου. -I Ενίσχυσε την αντανάκλαση στο μάτι της. -Ας Τρέχει μέσα από αυτό βελτίωσης βίντεο. -Edgar, Μπορείτε να βελτιώσετε αυτό; -Περίμενε. -I've Ήδη εργάζονται σε αυτό τον προβληματισμό. Αντανάκλαση -Someone του. -Reflection. -Υπάρχει Είναι μια αντανάκλαση του προσώπου του ανθρώπου. -Η Προβληματισμό. -Υπάρχει Είναι μια αντανάκλαση. -Zoom Στο στον καθρέφτη. -Μπορείτε Να δείτε μια αντανάκλαση. -Μπορείς Να ενισχύσει την εικόνα από εδώ; -Μπορώ Να τον ενισχύσει εδώ; -Μπορώ Να το ενισχύσει; Μπορείτε να το βελτιώσετε; -Μπορεί Να ενισχύσουμε αυτό; -Μπορώ Να το ενισχύσει; -κατέχουν Σε μια δεύτερη, θα ενισχύσει. -Zoom Στην στην πόρτα. -Times 10. -Zoom. -Μετακίνηση Σε. -μεγαλύτερη. -Wait, Να σταματήσει. -stop. -Pause Αυτό. -Rotate Μας 75 βαθμούς γύρω από τον κατακόρυφο, παρακαλώ. -stop. Πηγαίνετε πίσω στο τμήμα σχετικά με την πόρτα, και πάλι. -Got Έναν ενισχυτή εικόνας που μπορεί bitmap; -Γεια Σου, ίσως μπορούμε να χρησιμοποιήσουμε το Pradeep Μέθοδος Sen να δούμε μέσα στα παράθυρα. -Αυτό Το λογισμικό είναι κατάσταση της τέχνης. -Το Ιδιοτιμή είναι απενεργοποιημένη. -Με Το δικαίωμα συνδυασμός algorithm-- -Αυτός Που λαμβάνονται εξάλειψη της αλγόριθμοι στο επόμενο επίπεδο, και μπορώ να τα χρησιμοποιούν για να να ενισχύσει αυτή τη φωτογραφία. -Lock Για μεγέθυνση και το z-άξονα. -Enhance. -Enhance. -Enhance. Πάγωμα της και να ενισχύσει. [Σταματήσετε την αναπαραγωγή] David J. Malan: Εντάξει, έτσι όλα αυτά είναι πραγματικά λόγια. Είναι απλά αρμαθιές μαζί σε ένα τρόπο που στην πραγματικότητα δεν είναι λογικό. Και, στην πραγματικότητα, μαθήματα CS50 και αρέσει τείνει να καταστρέψει πολλά από τηλεόραση και ταινίες για εσένα. Διότι όταν τους εμπειρογνώμονες υπολογιστών Οι κροτάλισμα από όρους και λέγοντας φανταχτερά πράγματα όπως ιδιοδιανύσματα, και το άξονα z, και οποιοδήποτε αριθμό άλλων στην πραγματικότητα πιο τεχνικούς όρους, από όπου και αν πραγματικά μόνο stringing λέξεις μαζί πολύ συχνά. Είναι ότι μία από τις ελπίδες μας είναι ότι, ως παρενέργεια της λήψης μαθημάτων όπως αυτό, θα περισσότερους ανθρώπους στην κόσμο είναι πράγματι σε θέση να ζυγίσει μέσα και μόλις πάντα τόσο λίγο να επηρεάσει το την ποιότητα και την ακρίβεια των εν λόγω ταινιών; Στην πραγματικότητα, ας ρίξουμε μια ματιά σε πραγματικότητα. Έτσι, εδώ είναι η φωτογραφία του προσωπικού της Mary, της διδασκαλίας μας υποτρόφων. Και ας υποθέσουμε ότι είναι ύποπτοι για κάτι. Και όμως, υπάρχει μια αχτίδα μερικά αποδεικτικό στοιχείο στο μάτι της, ή στην αντανάκλαση του γυαλιά της. Λοιπόν, αν κάνουμε ακριβώς όπως τα ταινίες προτείνει, όπου θα μεγεθύνετε και να «ενισχύσουν», αυτό είναι το πόσο πληροφορίες είναι στο πρόσωπό της Μαρίας όταν τραβάτε μια φωτογραφία με την εν λόγω αρχική ανάλυση. Και, στην πραγματικότητα, μπορείτε να δείτε αυτές τις τελείες. Και αυτά είναι ό, τι είναι ονομάζονται εικονοστοιχεία, Ρ-Ι-Χ-Ε-L-S, το οποίο απέχει μόλις ένα τετράγωνο τυπικά ότι είναι μια κουκίδα που συνθέτει μια εικόνα. Και πίσω στην ημέρα, και μάλιστα ακόμη Σήμερα με μερικές από τις τηλεοράσεις LED σημερινή ή τηλεοράσεις LCD, αν έχετε ένα στο δωμάτιό σας ή στο σπίτι, αν πάτε μέχρι σούπερ κοντά σε αυτό, και ειδικά αν πρόκειται για μια κάπως μεγαλύτερης ηλικίας τηλεόραση, μπορείτε πιθανώς να δείτε ακόμη και αυτά τελείες και αυτό είναι που συνθέτουν μια εικόνα. Και δεν υπάρχει πλέον πληροφορίες από αυτό. Θα μπορούσαμε να «ενισχύσουν», κατά την έννοια του εξομάλυνση πράγματα ξανά και το είδος του συνάγοντας είδος, το είδος αυτό χρώμα θα πρέπει να είναι δίπλα στο μάτι της Μαρίας έτσι ώστε στην πραγματικότητα δεν είναι τόσο pixelated. Αλλά αν συνεχίσουμε τη μεγέθυνση, υπάρχει είναι ο κακός στο μάτι της. Όπως και αυτό είναι όλο το πληροφορίες που έχουμε. Δεν μπορείτε να δημιουργήσετε πληροφορίες από το τίποτα. Υπάρχει μόνο ένα πεπερασμένο αριθμός των bits εκεί. Έτσι, σε σύνολο 4 Πρόβλημα, όπου έχετε την ευκαιρία για να παίξει με αυτό το είδος του κόσμου. Σε Πρόβλημα Σετ 4, θα διερευνήσει το κόσμο των γραφικών, και εγκληματολογία, και μάλιστα γράφουν κώδικα ότι ανακτά τις χαμένες εικόνες. Θα γράψετε κωδικό που χειρίζεται τις υπάρχουσες εικόνες και, τελικά, να κατανοήσουν τι είναι συμβαίνει κάτω από το καπό. Και, αποδεικνύεται, είναι πραγματικά δεν είναι όλα αυτά περίπλοκα. Για παράδειγμα, αν θέλαμε να αντιπροσωπεύουν ένα χαμογελαστό πρόσωπο στο οποίο με αυτά τα μαύρα εικονοστοιχεία, ή αυτές οι μαύρες κουκίδες, καλά, θα μπορούσαμε απλά να αντιπροσωπεύουν τους ως πραγματικά ένα bitmap. Και αν είχαν ακούσει ποτέ ότι bitmap έκφραση, ίσως αρχίζει τώρα να κάνει μια λίγο περισσότερο νόημα σήμερα. Γνωρίζουμε ήδη τι λίγο είναι. Είναι 0 ή 1. Και ένας χάρτης είναι μόνο κάτι σαν ένα κομμάτι χαρτί που σας δίνει κατευθύνσεις και έχει ίσως ένα πλέγμα x και y συντεταγμένες. Έτσι, εδώ είναι ένα bitmap. Είναι ένας χάρτης των μπιτ όπου ένα 1 είναι προφανώς πρόκειται να αντιπροσωπεύουν ένα λευκό pixel, και ένα 0 πρόκειται να αντιπροσωπεύουν ένα μαύρο πίξελ. Αλλά θα μπορούσαμε σίγουρα να αναστρέψετε γύρω. Δεν έχει τόση σημασία έτσι Όσο είμαστε συνεπείς. Και εδώ είναι το πώς, μέσα σε binary-- της μνήμης ενός υπολογιστή, ή ακόμα και μέσα από ένα αρχείο στο σκληρό σας drive-- θα μπορούσε να αποθηκεύσετε η απλούστερη από τις εικόνες smiley πρόσωπο. Αλλά αυτό που είμαστε, φυσικά, λείπει σε αυτή την εικόνα; Χρώμα, έτσι δεν είναι; Είναι ένα προφανές επόμενο βήμα ή εξάρτημα για να βελτιωθεί αυτό με το χρώμα. Έτσι, δυστυχώς, με ένα μόνο bit, μηδέν ή 1, θα μπορούσε να αντιπροσωπεύει το χρώμα. Αυτό θα μπορούσε να είναι κόκκινο ή μπλε, ή μαύρο, ή άσπρο ή πράσινο, ή ροζ, ή οποιαδήποτε ζεύγη των χρωμάτων. Αλλά για λόγους απλούστευσης, θα μόλις αναλάβει μαύρο και άσπρο. Έτσι, αυτό που λογικά χρειαζόμαστε αν θέλουμε θέλουν να εφαρμόσουν χρώμα σε μια εικόνα; Τι πρέπει να κάνουμε? Όπως και αν ο περιοριστικός παράγοντας εδώ είναι ότι με ένα κομμάτι μπορείτε μόνο αντιπροσωπεύουν τα δύο κράτη, 0 ή 1, λευκό ή μαύρο, τι θέλεις να κάνω; Κοινό: Περισσότερα στοιχεία. David J. Malan: Περισσότερες bits, Ναι περισσότερα δεδομένα, περισσότερα κομμάτια. Και, πράγματι, αυτό είναι ακριβώς το πώς Οι έγχρωμες εικόνες εκπροσωπούνται. Αντί να χρησιμοποιούν ένα ενιαίο κομμάτι, ένα 0 ή 1 για κάθε pixel, κάθε τελεία, μπορείτε απλά να χρησιμοποιήσετε πολλαπλά. Ίσως χρησιμοποιούν 8, ίσως, πιο συχνά χρησιμοποιήστε 24, και μάλιστα, στην Πρόβλημα Σετ 4, θα μπορείτε να παίξετε με ένα αρχείο μορφή που χρησιμοποιεί 24 bits συνήθως. Αλλά οι περισσότεροι από εσάς είστε πιθανώς εξοικειωμένοι με αρχεία JPEG. Αν έχετε πάρει ποτέ μια φωτογραφία στο κινητό σας, ή να ανεβάσει ή να δει κάτι σε Facebook, ή το Flickr, οποιοσδήποτε αριθμός της φωτογραφίας που βασίζεται ιστοσελίδες, έχετε πιθανότατα δει μια εικόνα JPEG πριν. Και αποδεικνύεται, αυτό είναι το αρχείο μορφή θα πάμε για χρήση σε PSET 4, σύμφωνα με την οποία πρόκειται να πρέπει να ανακτήσει τις εικόνες ότι έχω διαγραφεί κατά λάθος από ένα κατεστραμμένο κάρτα μνήμης στη φωτογραφική μηχανή, αν θέλετε. Και αποδεικνύεται ότι ακόμη και αν JPEG είναι αρκετά sophisticated-- είναι πολύ πιο εξελιγμένα από τα μαύρα και άσπρα στίγματα είδαμε πριν από λίγο, επειδή υπάρχει πραγματικά φανταχτερό αλγόριθμοι που χρησιμοποιούνται για τη συμπίεση ενός JPEG, έτσι ότι μπορείτε να έχετε μια πολύ ωραία, ποιότητα εικόνας, αλλά χρησιμοποιώντας σχετικά λίγα κομμάτια. Και θα επανέλθουμε συμπίεση πριν από καιρό. Αποδεικνύεται ότι η πρώτη τρία bytes σε ένα image-- JPEG δεν έχει σημασία τι έχετε λάβει μια φωτογραφία of-- είναι οι τιμές 255, 216, 255. Με άλλα λόγια, αν απλά δείτε αυτό το μοτίβο των bits, εκπροσωπούνται εδώ και τρεις bytes, ή 24 bit συνολικά, με μεγάλη πιθανότητα μπορείτε να συμπεράνετε ότι κοιτάτε το αυτό τρεις πρώτες bytes ενός JPEG. Και αυτό είναι αυτό που είναι γνωστό όπως την υπογραφή JPEG. Πολλές μορφές αρχείων από εκεί τείνουν να ξεκινήσει με ορισμένα πρότυπα από 0 και 1, έτσι ώστε τα Windows και Mac OS, και iOS, και Android γνωρίζουν τι είδος αρχείου που είναι, εκτός από την λεγόμενη αρχείο επέκταση ότι πολλά αρχεία έχουν. Αν έχετε .jpg, ότι είναι Μια άλλη ένδειξη στον υπολογιστή. Ας δούμε τώρα αυτό λίγο πιο τεχνικά. Γνωρίζουμε το δεκαδικό το σύστημα είναι 0 έως 9. Γνωρίζουμε δυαδικό είναι 0 και 1. Και αν νομίζετε ότι πίσω στο PSET 0, σας είχαμε παλέψει με, για λίγο, κάτι που ονομάζεται δεκαεξαδικό, όπου θα έχει 16 ψηφία, αντί του 10 ή αντί του 2. Και αυτά τα ψηφία, κατά συνθήκη, είναι 0 έως 9 και στη συνέχεια μια μέσω της f, όπου f αντιπροσωπεύει ό, τι δεκαδικός αριθμός, ακριβώς όπως μια γρήγορη λογική επιταγή; Έτσι, 15. Και πρέπει να αντιπροσωπεύουν το 10, μόνο με φύση της παραγγελίας που έχω δώσει. Είναι απλά μια αυθαίρετη σύμβαση, αλλά είναι αρκετά πρότυπο. Έτσι, αν κοιτάξουμε αυτό το μοτίβο των τριών bytes-- ας μόλις αρχίσει να το δει κανείς στην ένα τρόπο που να συνάδει με το πώς επιστήμονες της πληροφορικής γενικά δούμε και να σκεφτούμε σχετικά με τα αρχεία. Μπορείτε βεβαίως να σκεφτείτε αρχεία σε 0s, και 1 και δεκαδικά, αλλά στην πραγματικότητα, έχουμε την τάση να χρησιμοποιούν δυαδικό ή πιο τυπικά hexadecimal-- πίσω από το chipset 0. Έτσι, επιτρέψτε μου να προτείνω ότι 255, 216, και 255 είναι ακριβώς αυτά τα σχέδια από 0 και 1. Και μπορείτε να το ελέγξετε αν θέλουν να κάνουν τα μαθηματικά από την Εβδομάδα 0. Αλλά, για τώρα, μόλις αναλάβει ότι αυτό είναι πράγματι σωστή. Έχω μόλις ξαναγραφεί τρία δεκαδικά αριθμούς και τρεις δυαδικές τιμές. Τώρα τι Πάω να κάνουμε είναι να Απλά προσθέστε λίγο άσπρο διάστημα, μόνο για λόγους αναγνωσιμότητας του. Και ειδοποίηση, είμαι απλώς πρόκειται να κινηθούν τα πράγματα χώρια. Έτσι, πριν, μετά, πριν, μετά. Κάνω τίποτα ενδιαφέρον άλλων από ό, τι ακριβώς εξαπλώνεται τα πράγματα έτσι η προκήρυξη κάθε σύνολο οκτώ bits είναι τώρα δύο σετ των τεσσάρων bits. Αυτό είναι χρήσιμο επειδή δεκαεξαδικό είναι ιδιαίτερα της μόδας γιατί κάθε δεκαεξαδικό ψηφίο 0 έως f, ή πιο συγκεκριμένα από 0 έως 15, μπορούν να παρασταθούν με ακριβώς τέσσερα κομμάτια. Με άλλα λόγια, σε δεκαεξαδικό αν Θέλετε να αντιπροσωπεύουν 0, είναι ακριβώς 0000, τέσσερεις μηδενικά. Και αν θέλετε να αντιπροσωπεύουν το 15, Είναι 1111, το οποίο είναι τέσσερα δυαδικά ψηφία. Και αν το κάνετε τα μαθηματικά, αν αυτό είναι το μέρος αυτών, αυτό είναι το μέρος 16s, ότι πρόκειται να δώσει you-- μάλλον ότι πρόκειται to-- συγγνώμη, σε δυαδική μορφή, ότι πρόκειται να σας δώσω 15, αυτοί τόπο, δυάρια θέση, τέσσερα οκτάρια και τον τόπο. Έτσι, επιτρέψτε μου να προτείνω ότι Σετ από τέσσερα bits στα αριστερά είναι αυτό που πρόκειται να καλέσετε f. Είναι ο μεγαλύτερος αριθμός που μπορεί να αντιπροσωπεύουν με τέσσερα κομμάτια. Και γνωρίζουμε ήδη από το δεκαεξαδικό, f είναι η μεγαλύτερη σε δεκαεξαδικό ψηφίο. Έχουμε άλλο ένα στ εκεί, δύο ακόμα εκεί. Και για τώρα, μόλις λάβει την πίστη ότι έχω κάνει το σωστό μαθηματικά και ότι το αριστερό ήμισυ αυτών των bits, 1101, είναι το ίδιο πράγμα με το δ στο δεκαεξαδικό. Και το δεξί χέρι, 1000, είναι μόλις 8. Και για να δείτε ότι κάποιος είναι εύκολο, έτσι δεν είναι; Το 8 represents-- είναι σωστό κάτω από αυτό το μέρος οχτάρια. Έτσι έχουμε ένα στη στήλη οκτάρια και τίποτα στα τέσσερα, δυάρια ή αυτοί. Έτσι τώρα πιο συμβατικά, οι άνθρωποι τείνουν να γράψει δεκαεξαδικά ψηφία σαν αυτό, μπορείτε απλά να τους λιώσει μαζί, και στη συνέχεια να τα πρόθεμα 0x με. Αυτό δεν σημαίνει τίποτα άλλο από μια οπτική ένδειξη σε human-- έρχεται εδώ ένα δεκαεξαδικό επειδή value-- μπορεί να μην είναι προφανής διαφορετικά. Πράγμα που σημαίνει ότι, τελικά, ότι το μοτίβο από μηδενικά και μονάδες, ή το μοτίβο του δεκαεξαδικό ψηφία ισοδύναμα ότι είστε πρόκειται να αρχίσει να ψάχνει για Πρόβλημα στο σετ 4 είναι this-- και από τον προβληματισμό που 4 spec θα περπατήσει μπορείτε μέσω αυτού σε περισσότερες detail-- αλλά συνειδητοποιούν ως ένα είδος απόκρυφες ως Αυτό μπορεί να μοιάζει με την πρώτη ματιά, θα πάμε να αρχίσετε να βλέπετε αυτό το πολύ. Και στην πραγματικότητα, ακόμη και στην GDB, ο εντοπισμού σφαλμάτων που εισήγαγε τη Δευτέρα και Dan εισάγει στην PSET 3, θα για να σας δείξει συχνά δεκαεξαδικές τιμές μόνο και μόνο επειδή έχουν την τάση να είναι πιο συμβατική σχέση ή δυαδικά ψηφία στον κόσμο των υπολογιστών. Τώρα ας βάλουμε αυτό σε ένα ευρύτερο πλαίσιο. Πολλοί από εσάς μπορεί να θυμάστε αυτό εικόνα εδώ, το οποίο προήλθε από τι; Vista, έτσι ώστε ακόμη και νωρίτερα από ό, τι ότι, τα Windows XP έκανε αυτό το ντεμπούτο. Έτσι, αυτό είναι ένα όμορφο τοπίο. Και στην πραγματικότητα, αν σακί γύρω online-- Νομίζω ότι είναι ένα άρθρο της Wikipedia, όπου κάποιος πολύ εκπληκτικά βγήκε βρήκε θέση στον κόσμο που έχει συσταθεί του ή τη φωτογραφική της μηχανή σε ακριβώς το δικαίωμα place-- και αυτό σήμερα φαίνεται like-- αλλά Είναι ακριβώς το ίδιο σκηνικό. Αυτή η εικόνα, όμως, είναι σε ένα αρχείο μορφή που ονομάζεται bitmap, b-m-p. Και θα πάμε να πάρετε ένα σούπερ γρήγορη ματιά στο τι σημαίνει αυτό. Αλλά bitmap είναι απλά ένας διαφορετικός τρόπος εκπροσωπούν ακίνητες εικόνες χρησιμοποιώντας pixels σε 0 και 1, τελικά. Αλλά σε γρήγορη ματιά, έχει Μια πιο ενδιαφέρουσα υπογραφή στην αρχή του αρχείου. Δεν είναι μόνο τρεις bytes, μάλλον υπάρχει ένα σωρό σχέδια των bytes που έχουν ορισμένη σημασία. Για παράδειγμα, κάπου στο πρώτα bytes του μια εικόνα bitmap πρόκειται να είναι το μέγεθος του εικόνας, το πλάτος της εικόνας, το ύψος της εικόνας, έτσι χρήσιμο μεταδεδομένων, αν θέλετε. Χρήσιμες πληροφορίες ότι το Photoshop ή οποιαδήποτε γραφικά πρόγραμμα που χρησιμοποιείτε μπορεί στην πραγματικότητα να νοιάζονται για. Έτσι, περισσότερα για αυτό σε Πρόβλημα Σετ 4, αλλά αυτό είναι μόνο να πω ότι στο τέλος της μέρας όλες οι μορφές αρχείων που έχετε χρησιμοποιήσει για years-- αρχεία του Microsoft Word, Αριθμοί αρχεία, αρχεία Excel, οποιοσδήποτε αριθμός από μορφές αρχείων που θα μπορούσαν να έχουν κάποια γνωστή επέκταση αρχείου είναι μόνο 0 και 1 κάτω από το καπό. Και οι άνθρωποι έχουν αποφασίσει ποιες είναι οι συμβάσεις, Ποια μοτίβα από 0 και 1 αντιπροσωπεύουν ένα αρχείο Word σε σχέση με ένα αρχείο Excel, σε σχέση με οποιοδήποτε αριθμό άλλων μορφών αρχείων. Έτσι, σε PSET 4, θα έχετε ένα ευκαιρία να παίξουν με αυτό. Αλλά τι σημαίνει να έχει ένα struct. Αυτό είναι πραγματικά ένα ωραίο segue τώρα σε C, η οποία έχει μόνο ένα ζευγάρι από πρόσθετα χαρακτηριστικά που δεν έχουμε εξετάσει ακόμα. Είναι ένα αρκετά μικρό γλώσσας και ένα από τα τα ωραία χαρακτηριστικά για το C είναι ένα struct. Για παράδειγμα, εάν ήθελε να represent-- ας πείτε οτι θέλετε να έχετε μια μεταβλητή που αντιπροσωπεύει ένα μαθητή σε κάποιο πρόγραμμα. Ίσως γράφατε ένα μάθημα πρόγραμμα εγγραφής, ή πυρήνα ψώνια εργαλείο, ή κάτι τέτοιο. Τι είναι τα κομμάτια των δεδομένων που αφορούν σε ένα μαθητή που έρχονται στο μυαλό; Όπως ένας μαθητής είναι εκπροσωπείται με ποιες τιμές; Ναι; Έχετε ένα όνομα ως φοιτητής. Τι άλλο κάνει ένας τυπικός φοιτητής έχει; Κοινό: [δεν ακούγεται] David J. Malan: Έτσι, συγνώμη. Κοινό: Ηλικία. David J. Malan: Μια ηλικία ή γενέθλια ισοδύναμα, Ναι. Τι άλλο? Κοινό: αριθμό ταυτότητας; David J. Malan: Έτσι ένας αριθμός ταυτότητας, ίσως έναν αριθμό τηλεφώνου, ίσως ένα dorm, ή το σπίτι, ή κολέγιο, ή κάτι τέτοιο. Οποιοσδήποτε αριθμός των τεμαχίων των δεδομένων που μπορεί να έχετε στη λίστα επαφών σας Είναι ό, τι θα μπορούσε να ορίσει ένα μαθητή. Έτσι, αν θέλαμε να το κάνουμε αυτό, στον κώδικα, θα μπορούσαμε να κάνουμε κάτι απλό σαν αυτό. Μπορεί να έχουμε ένα πρόγραμμα έτσι ώστε έχει ας πούμε, int main (void). Και αν θέλω να αντιπροσωπεύουν φοιτητής θα μπορούσε να έχει, για παράδειγμα, μια σειρά που ονομάζεται όνομα για το συγκεκριμένο μαθητή, μια σειρά που ονομάζεται κοιτώνα για το συγκεκριμένο μαθητή, ίσως μια int που ονομάζεται ID για το συγκεκριμένο μαθητή. Και επειδή είμαι με τη χρήση εγχόρδων, Ι Πρέπει να πάμε πίσω και να θέσει CS50.h. Ίσως Πάω να χρειάζονται stdio.h. Έτσι, επιτρέψτε μου να κάνω προληπτικά εκείνα και είμαι Θα καλέσετε αυτό student.c για τώρα και να αποθηκεύσετε αυτό. Και τώρα μπορώ να κάνω κάτι με αυτές τις μεταβλητές. Και είμαστε ακριβώς πρόκειται να γράψω ότι ως σχόλιο σε ψευδο-κώδικα, γιατί δεν είναι ενδιαφέρουσα τι κάνουμε τώρα. Εντάξει, έτσι αυτό είναι ένα πρόγραμμα που κατά κάποιο τρόπο αποθηκεύει έναν μαθητή. Τι θέλω να κάνω αν θέλετε να αποθηκεύσετε δύο φοιτητές; Έτσι, το πρώτο μου ένστικτο πρόκειται να είναι όλα σωστά, περιμένετε ένα λεπτό, αν έχω ένα άλλο μαθητή γιατί δεν μπορώ να απλά κάνουμε όνομα συμβολοσειράς 2, εγχόρδων dorm 2, int id2. Και έχουμε κάνει φύγει προς αυτή την κατεύθυνση πριν και ποια ήταν η λύση μας για ό, τι φαίνεται να είναι το είδος της πάστας hackish αντίγραφο δουλειά εδώ; Κοινό: Μια σειρά. David J. Malan: Ναι, θα μπορούσαμε να χρησιμοποιήσουμε μια σειρά. Δεξιά αυτό πολύ γρήγορα γίνεται δυσκίνητο. Θα πρέπει να ταξινομήσετε αυθαίρετα ξεκινήσετε την ονοματοδοσία όλες αυτές τις μεταβλητές. Και εσείς, ο άνθρωπος, πρέπει να κρατήσει παρακολουθείτε που αντιστοιχεί NAME2 OK με dorm2 αντιστοιχεί με id2. Γίνεται απλά ένα χάος. Γι 'αυτό είναι πολύ πιο εύκολο, ανάκληση από τους πριν από λίγες εβδομάδες, απλά χρειάζεται να ονομάζεται ονόματα χορδή και ίσως να μας δώσει τρεις από αυτούς. Και τότε ίσως έχουμε κοιτώνες string και έχουν τρεις από αυτούς, ή με μια σταθερή, int ταυτότητες και έχουν τρεις από αυτούς. Αλλά ακόμα και τώρα αυτό αισθάνεται λίγο ατημέλητη, δεξιά. Μιλάμε για φοιτητές και ακόμη Είμαι πραγματικά κατοικία στο χαμηλό επίπεδο λεπτομέρειες εφαρμογής. Ο μαθητής είναι ένα όνομα και ένα κοιτώνα και ταυτότητας. Γιατί δεν μπορώ απλά να δηλώσει μια μεταβλητή κάλεσε μαθητή και να το ονομάσουμε s. Και αν θέλω άλλο μαθητή, γιατί δεν μπορώ να το αποκαλούν απλά t. Ή αν θέλω ένα σωρό των μαθητών, γιατί δεν μπορώ να κάνω μόνο πω ότι έχω μια ολόκληρη τάξη φοιτητές, και είναι τρεις από αυτούς. Με άλλα λόγια, γιατί δεν μπορώ να έρθω με το δικό μου τύπο δεδομένων, που ονομάζεται Οι μαθητές, μέσα από τα οποία είναι ένα όνομα, είναι ένα αναγνωριστικό, είναι ένα dorm, είναι οποιοσδήποτε αριθμός από άλλους τομείς. Και αποδεικνύεται σας μπορεί να κάνει ακριβώς αυτό. Έτσι C έχει αυτό το χαρακτηριστικό που ονομάζεται struct. Αυτό είναι ένα χαρακτηριστικό γλώσσα που μας επιτρέπει να κάνουμε ακριβώς αυτό. Πάω να πάει μπροστά και να ανοίξει structs.h όπου θα πάμε να δούμε το ακόλουθος ορισμός ενός φοιτητή. Βγάζει - και αυτό είναι ακόμη είναι απλούστερη από εκείνη που περιλαμβάνει ένα αναγνωριστικό πριν από λίγο. Αν θέλετε να καταλήξουμε σε σπιτικό τύπος δεδομένων σας, και επιπλέον να int και char και επιπλέουν και όλα αυτά τα άλλα που υπάρχουν, μπορείτε να το κάνετε από κυριολεκτικά γράφοντας typedef struct, στη συνέχεια κάποιες άγκιστρα, μέσα από τα οποία μπορείτε απαριθμεί τις μεταβλητές που θέλετε να συνδέουν με το νέο αυτό έθιμο δεδομένων πληκτρολογήστε ένα όνομα όπως και σε κοιτώνα, και στη συνέχεια, μετά τα άγκιστρα θα δώσουμε ένα όνομα για το νέο τύπο δεδομένων. Έτσι, για παράδειγμα, των σπουδαστών. Και τι είναι καλό για αυτό τώρα είναι ότι αν κοιτάξουμε τον αντίστοιχο κωδικό, Η σύμβαση, η πρώτη απ 'όλα, είναι να θέσει αυτό σε ένα αρχείο που ονομάζεται κάτι dot h, ένα αρχείο κεφαλίδας, το οποίο δεν έχουμε άρχισαν να χρησιμοποιούν τους εαυτούς μας πάρα πολύ. Αλλά θα πάμε για να ξεκινήσετε χρησιμοποιώντας αρκετά τώρα. Και τι μπορούμε να κάνουμε με αυτό, εν τέλει, σε αυτές τις λίγες γραμμές κώδικα έχει δηλώσει ακριβώς αυτό τύπο δεδομένων, ένας φοιτητής. Και τώρα ας το χρησιμοποιήσει. Πάω τώρα να υπεισέλθω σε ένα αρχείο που ονομάζεται structs1.c. Και ας ρίξουμε μια ματιά σε ένα μερικά χαρακτηριστικά εδώ. Έτσι, τα πράγματα εδώ είναι ως επί το πλείστον γνωστά, και θα επανέλθω σε αυτό που δεν είναι γνωρίζει ακριβώς σε μια στιγμή. Αυτό φυσικά συμπεριλαμβανομένης της δικής μου αρχείο επικεφαλίδας, η οποία είναι νέα, καθώς, εκτός από το chipset 3, όπου, ανάκληση, έχουμε helpers.h. Έτσι, μπορείτε να ανακαλέσετε #include helpers.h. Γιατί αν και είμαι χρησιμοποιώντας εισαγωγικά αντί της γωνίας παρένθεση; Πότε μπορώ να επιλέξω μεταξύ τους; Σχεδόν πάντα μου φαίνεται να χρησιμοποιήσει γωνιακές παρενθέσεις. Και τότε, ξαφνικά σε γραμμή έξι Είμαι χρησιμοποιώντας διπλά εισαγωγικά. Γιατί μπορεί να συμβαίνει αυτό; Ναι; Κοινό: [δεν ακούγεται] David J. Malan: Αυτή είναι μια πραγματική, τι; Κοινό: Αυτό είναι σε IDE σας. David J. Malan: Ναι, που είναι στην πραγματική μου IDE. Και ας μην σταθώ στο IDE, επειδή αυτό είναι απλά ένα εργαλείο που είμαι με τη χρήση. Αυτό είναι στην τρέχουσα μου κατάλογο, συγκεκριμένα. Έτσι structs.h είναι το δικό μου αρχείο δεν έχει εγκατασταθεί στο IDE, στο ίδιο το λειτουργικό σύστημα, μάλλον είναι στο τρέχοντα κατάλογο μου. Έτσι, η σύμβαση είναι, αν θέλετε να συμπεριλάβετε το δικό σας αρχείο κεφαλίδας, μπορείτε να χρησιμοποιήσετε μόνο διπλά εισαγωγικά. Τι λέμε αυτό το πράγμα γραμμή 8, σε γενικές γραμμές; Αυτό είναι ό, τι; #define κάτι. Αυτό αντιπροσωπεύει σταθερές, έτσι δεν είναι; Αν θέλετε να έχετε μια αξία στο πρόγραμμά σας ότι μπορείτε να χρησιμοποιήσετε ένα ολόκληρο αρκετές φορές, είναι καλή σύμβαση να συνυπολογίσει, κηρύξει με το σύμβολο δίεσης ορίζουν, κατόπιν, κατά συνθήκη, σε όλες τις κεφαλαία word-- αν και δεν είναι είναι απολύτως απαραίτητο, αλλά Είναι ανθρώπινο σύμβαση να αξιοποιήσει σταθερές έτσι ώστε να πηδούν έξω σε σας visually-- χώρο και τότε η τιμή που θέλετε να ισοδύναμο με το όνομα εκείνου σταθεράς. Όχι ερωτηματικό, αλλά απλά ακολουθήστε αυτό το μοτίβο εκεί. Λοιπόν, τι κάνω σε αυτόν τον πραγματικό κώδικα. Έτσι, ας ρίξουμε μια ματιά το κύριο πρόγραμμα εδώ. Στη γραμμή 12, γιατί έχουν συμπεριλάβει structs.h, Τώρα έχω μαγικό μου διάθεση ενός νέου τύπου δεδομένων. Δεν έχω μόνο την πρόσβαση στο int, και char, float και, και εγχόρδων, και μπλε και άλλα. Δεν έχω πλέον πρόσβαση σε ένας τύπος δεδομένων των μαθητών. Έτσι, στη γραμμή 12, είμαι συνδυάζοντας δύο ideas-- ένα έθιμο το είδος των δεδομένων και των δύο, χρησιμοποιώντας μια συστοιχία. Και έτσι σε αυτό το πρόγραμμα, εάν Θέλω να υποστηρίξω πραγματικότητα τρεις διαφορετικούς μαθητές στο πρόγραμμά μου, μπορεί απλά να πω να μου δώσει μια μεταβλητή ονομάζεται μαθητών, καθεμία από τις οποίες είναι φοιτητές τύπου, η οποία μου είναι προσαρμοσμένο τύπο δεδομένων. Και, συγκεκριμένα, να μου δώσει τρεις από αυτούς σε σειρά μου. Και τώρα τι κάνουμε σε αυτό το πρόγραμμα; Εδώ είναι μόνο ένα βρόχο για την επανάληψη από μηδέν έως 3, επειδή αυτό είναι ποια είναι η αξία των φοιτητών είναι. Είμαι απλά ζητώντας από το χρήστη δώσε μου το όνομα του μαθητή. Και στη συνέχεια, γραμμή 17, που έχουν ως επί το πλείστον οικεία γραμμή. Έχουμε παλιός φίλος μας GetString στα δεξιά. Και τι κομμάτι της σύνταξης είναι προφανώς νέα, εάν δεν έχετε προγραμματίσει σε C πριν, και δεν έχουν χρησιμοποιήσει ποτέ το structs; Ναι; ΚΟΙΝΟ: Η .name. David J. Malan: Η .name. Αλλά αυτό δεν είναι πάρα πολύ από ένα άλμα, επειδή τώρα οι μαθητές βραχίονα I σας δίνει την i-th μαθητή. Και αν θέλετε να βουτήξετε εντός της εν λόγω δομής, μπορείτε απλά να χρησιμοποιήσετε μια μόνο περίοδο και τότε το όνομα της μεταβλητής μέσα, ή το ακίνητο μέσα που Θέλετε να αποκτήσετε πρόσβαση. Ομοίως, στη συνέχεια, αν το ζητήσει, στη συνέχεια, χρήστη, δώσε μου dorm του μαθητή, Ομοίως μπορείτε να αποθηκεύσετε ότι κορδόνι στη μεταβλητή κοιτώνα εσωτερικό της εν λόγω δομής των φοιτητών. Και τώρα τα πράγματα παίρνουν λίγο φανταχτερό. Και αυτό πρόκειται να δούμε ίσως σε ένα πολύ πολύ σύντομα. Αλλά θα δείτε αυτό το πολύ περισσότερο σε PSET 4, οπότε ας ρίξουμε μια ματιά τώρα. Αποδεικνύεται ότι στην γραμμή 23 μέσω 38, τι νομίζεις ότι είμαι ίσως κάνει; Έχω αφαιρεθεί τα σχόλια για σήμερα, αλλά η έκδοση του κώδικα για την απευθείας σύνδεση αναφοράς έχει όλα τα σχόλια. Τι μπορώ να φαίνεται να κάνει; Κοινό: Αποθήκευση του αρχείου με όλες τις οι πληροφορίες που μπήκε ο χρήστης. David J. Malan: Ναι, ακριβώς, αυτό είναι ένας νέος τρόπος ότι βλέπουμε δύο, ένα άλλο χαρακτηριστικό των C, σύμφωνα με την οποία μπορώ να δημιουργήσω τη δική μου αρχεία. Μέχρι στιγμής, σχεδόν κάθε πρόγραμμα έχετε γράψει είναι απάτριδες. Από τη στιγμή που έχει κάνει τρέξιμο, αυτό είναι όλο. Δεν υπάρχει καμία μνήμη ή ανάμνηση του. Δεν υπάρχει αποθηκευμένο αρχείο. Αλλά αν θέλετε να αποθηκευτεί η καταχώριση που έχει συνέβη, όπως και σε ένα παιχνίδι ή ένα πρόγραμμα όπως αυτό, αποδεικνύεται μπορούμε να το κάνουμε. Και θα δείτε αυτό περισσότερο σε PSET 4 και στο τμήμα. Αλλά αυτή η γραμμή 23, κατ 'ουσίαν δημιουργεί ένα αρχείο που ονομάζεται students.csv. Και μπορεί να έχετε δει αυτό πριν. Ακόμα κι αν δεν έχετε σπουδάσει CS πριν, CSV είναι διαχωρισμένες με κόμμα μεταβλητές. Είναι σαν ένα πολύ φτωχού έκδοση ενός αρχείου του Excel, πράγμα που σημαίνει ότι θα μπορούσε να ανοίξει στο Excel και σε αριθμούς της Apple, και έχει σειρές και στήλες. Αλλά δεν είναι ένα ιδιόκτητο μορφή όπως η Microsoft ή της Apple. Είναι ακριβώς κόμματα που χωρίζει το αξίες που θα δούμε σε λίγο. Και απλά ρίξτε μια εικασία. Στην γραμμή 23, το πολύ τέλος, το δεύτερο επιχείρημά μου σε αυτή τη νέα λειτουργία που ονομάζεται στ ανοιχτά για το άνοιγμα του αρχείου είναι w. Τι μπορεί να σημαίνουν w; Ναι; Κοινό: Σας επιτρέπει να γράφετε στο αρχείο; David J. Malan: Σας επιτρέπει μπορείτε να γράψετε στο αρχείο. Έτσι, υπάρχει ένα ζευγάρι των παραλλαγών ότι μπορούμε να συνδέσετε εδώ. Αλλά αν απλά θέλετε να διαβάσετε το αρχείο, δηλαδή το δει κανείς και να το διαβάσετε στη μνήμη, μπορείτε απλά χρησιμοποιήστε απόσπασμα εισαγωγικά "r". Αν θέλετε να γράψετε για το αρχείο, μπορείτε να χρησιμοποιήσετε απόσπασμα εισαγωγικά "W". Υπάρχουν, επίσης, και επισυνάπτει μερικά άλλα πράγματα αν θέλετε να τροποποιήσετε τα υπάρχοντα αρχεία. Τώρα θα πάμε να κρατήσει βλέποντας αυτό πράγμα, τότε θα έρθει πάλι προς τη γραμμή 24. Null, αποδεικνύεται, είναι μια ιδιαίτερης αξίας που μπορούν να επιστραφούν από ορισμένες λειτουργίες αν κάτι έχει πάει wrong-- αν το αρχείο δεν υπάρχει, αν έχετε ξεμείνει από μνήμη, ή ένα σωρό άλλα σφάλματα. Αλλά για τώρα, ας υποθέσουμε ότι αυτή η Είναι ακριβώς συμβατικό έλεγχο σφαλμάτων. Εδώ στην γραμμή 26, είμαι επανάληψη 0-3 πάνω από όλους τους μαθητές μου. Και αυτό είναι το είδος του είδους μιας νέας λειτουργίας, fprintf, αλλά απλά να πάρουν μια εικασία. Αν printf είναι ακριβώς εκτύπωσης ένα μορφοποιημένο string, τι fprintf πιθανώς σημαίνει; Κοινό: Εκτύπωση σε αρχείο. David J. Malan: Εκτύπωση διαμορφωμένη κλωστή σε ένα αρχείο. Γι 'αυτό το πρόσθετο στ μέσο είναι αρχείο. Και η νέα πρώτο επιχείρημα πρέπει να είναι η μεταβλητή που αντιπροσωπεύει το αρχείο σας. Στη συνέχεια, έχουμε μόνο μια μορφή κορδόνι ακριβώς όπως printf. Και ακόμα κι αν αυτό σύνταξη είναι νέο, αυτό ακριβώς σημαίνει συνδέστε το όνομα του μαθητή, plug-in του μαθητή κοιτώνα, και στη συνέχεια, με fclose, κλείστε το αρχείο. Και τότε lastly-- αυτό είναι το νέο και θα επανέλθουμε σε αυτό πριν long-- είμαι απελευθέρωση ο σπουδαστής για λόγους ότι συνέβη εκεί επάνω. Αλλά θα επανέλθουμε ότι πριν να long-- αυτό είναι λόγω του τρόπου που είναι GetString στην πραγματικότητα εργάζονται κάτω από την κουκούλα. Ας ρίξουμε μια γρήγορη ματιά εδώ. Αν ήμουν πληκτρολογήστε ls στον κατάλογο μου, παρατηρήσετε ότι εγώ δεν κάνω ένα αρχείο που ονομάζεται students.csv, απλά δεν υπάρχει, δεν υπάρχει. Αν λοιπόν τώρα την κατάρτιση του προγράμματος αυτού, κάνει structs-1,. / structs-1, και Πάω να πάει μπροστά και πληκτρολογήστε Andi, ο οποίος ζει στο Μπέρκλεϊ στο Yale. Εμείς πάμε για να έχουμε Rob που Ζει σε Thayer αυτές τις μέρες. Και ας έρθει επάνω με το πού είναι, νομίζω, η Μαρία είναι σε Mather, αν έχω θυμήθηκε σωστά. Έτσι, τίποτα δεν φαίνεται να συμβαίνει. Αλλά αν τύπου LS τώρα, υπάρχει students.csv. Ας πάμε μπροστά και ανοιχτή students.csv. Αυτό είναι πάλι ένα πολύ ελαφριά μορφή αρχείου. Αλλά έχω απλώς ενέκρινε σύμβαση ότι έχω δύο γραμμές και στήλες εδώ. Η πρώτη στήλη είναι πρώτα τα ονόματα των ανθρώπων. Η δεύτερη στήλη είναι το μαθητή dorm, ή κολέγιο, ή το σπίτι, ή οτιδήποτε. Και τώρα έχω σωθεί αυτό μόνιμα σε ένα αρχείο. Έτσι δεν είναι και τόσο ενδιαφέρουσα. Αλλά αυτό είναι μόνο ένα σκαλοπάτι τώρα να είναι σε θέση να επιμείνουν πληροφορίες μόνιμα. Ας δούμε τώρα τι περισσότερο μπορούμε κάνουμε με αυτά και άλλα χαρακτηριστικά. Αλλά πρώτα, οποιεσδήποτε ερωτήσεις; Αυτό ήταν ένα πολύ, και αυτό ήταν γρήγορη. Αλλά θα δείτε πολλά περισσότερο PSET 4, καθώς και. Ναι; Κοινό: Υπάρχει τρόπος να υπάρχει να συνεχίσει την προσθήκη ονομάτων σε αυτό το αρχείο; David J. Malan: Καλή ερώτηση. Είναι ένας τρόπος για να συνεχίσει εκεί προσθήκη ονομάτων σε αυτό το αρχείο; Ναι. Και, στην πραγματικότητα, αν έχετε σκοπό μέχρι την εκ νέου άνοιγμα του αρχείου, θα πρέπει να χρησιμοποιήσετε απόσπασμα εισαγωγικά "α" για προσάρτησης, η οποία θα προσθέσει απλώς μια νέα γραμμή, η νέα γραμμή ξανά και ξανά, ακριβώς. Καλή ερώτηση. Άλλες ερωτήσεις; Ναι; Κοινό: Εάν εκτελέσατε το πρόγραμμα και πάλι τώρα, Θα κρατήσουμε την προσθήκη ονομάτων για το αρχείο ή θα ανοίξει ένα νέο αρχείο; David J. Malan: Αχ, καλή ερώτηση. Αν έτρεξε και πάλι σωστά το πρόγραμμα τώρα, ίσως πληκτρολογήσει σε νέα ονόματα, Θα το προσθέσουμε στο αρχείο ή να αντικαταστήσετε το αρχείο; Το τελευταίο, επειδή είμαι δεν χρησιμοποιούν τη λειτουργία προσάρτησης. Και επειδή είμαι απλά τυφλά το άνοιγμα του αρχείου για εγγραφή, είναι ακριβώς πρόκειται να αντικαταστήσετε το αρχείο. Γι 'αυτό θα πρέπει πράγματι να γίνει είναι να προσαρτηθεί, αν θέλω να έχουν πραγματικά ένα μακροπρόθεσμο βάσης δεδομένων. Τώρα CSV είναι χρήσιμο, ειλικρινά, ακόμα και για ομοειδή αν είστε writing-- και θα δούμε τελικά αυτό αργότερα στο εξάμηνο, όταν χρησιμοποιούμε CSVS για άλλους σκοπούς. Αν θέλετε να αποθηκεύσετε όλους τους ανθρώπους που έχουν εγγραφεί σε κάποια εκδήλωση, ή υπογράψει σύμβαση για το μαθητή σας ομάδα, ή κάτι τέτοιο, αποθήκευση των δεδομένων σε αυτό το είδος του μορφή είναι εξαιρετικά βολικό. Διότι στην κυριολεξία, αν μου ήταν για να κατεβάσετε αυτό το αρχείο. Θα μπορούσα να double-- και ας προσπαθήσουμε πραγματικά αυτό αν έχω το Excel ή Αριθμοί εδώ. Πάω να κάντε δεξί κλικ ή Control-κλικ στο αρχείο μου. Ωχ. Κάντε δεξί κλικ ή control-κλικ στο αρχείο μου. Έλα, το ποντίκι μου δεν συνεργάζεται. Download-- Πάω να κατεβάσετε όλα τα αρχεία εδώ έτσι μόνο έτσι μπορώ να αρπάξει αυτό. Και ας δούμε αν αυτό λειτουργεί students.csv-- πρώτη φορά Έχω ενεργοποιηθεί. Τώρα θέλουν να δουν τις επαφές μου. Τώρα, θα πρέπει να εγγραφείτε. Δείτε πόσο εύκολο είναι να χρησιμοποιήσετε CSVS; Ναι, να το κρατήσει μέχρι και σήμερα. Εντάξει, τώρα είμαστε έτοιμοι για την κατηγορία. Εντάξει, ω, τι νέο υπάρχει; Εντάξει, κοντά. Αυτό ήταν μαγικό. Εντάξει, τώρα πρέπει να ενημερώσετε. Και τώρα, τι ξέχασε Έχω καταθέσει αρχικά άνοιξε, αλλά τι a-- εκεί πάμε. Εντάξει, έτσι τώρα έχουμε ένα αρχείο Excel. Ευχαριστώ. Εντάξει, οπότε αυτό που έκανα ήταν το εύκολο μέρος. Φυσικά θα μπορούσα να έχω προεγκατεστημένο Excel, ή Αριθμοί, ή οτιδήποτε άλλο πρόγραμμα. Αλλά αυτό είναι ωραίο, διότι τώρα μπορώ να χειραγωγήσουν τα δεδομένα σε τυποποιημένη μορφή. Πλαίσιο λοιπόν τώρα ας μεταβείτε στο σημείο όπου είχαμε μείνει την τελευταία φορά που ήταν να ξεκινήσει να απογειωθεί βοηθητικές ρόδες. Αλλά πρώτα, δεν το έκανες δείτε την προηγούμενη γεύμα πάλι συμβαίνει εδώ στο πυρκαγιάς και Πάγος στο Cambridge, Σιτάρ στο New Haven. Εγγραφείτε στην ιστοσελίδα CS50s ASAP για να ενωθεί με τους φοιτητές και το προσωπικό CS50. Έτσι πήραμε ρόδες μακριά τη Δευτέρα ως follows-- στοιχειοσειράς έχει κηρυχθεί σε CS50s βιβλιοθήκη για κάποιο χρονικό διάστημα. Και είναι ωραίο, διότι επιτρέπει μας να μιλήσουμε για τις μεταβλητές ως ολόκληρες λέξεις και φράσεις και πολλά άλλα. Αλλά τελικά χορδών δεν υπάρχει. Αυτό είναι απλά ένα συνώνυμο, ή ένα ψευδώνυμο, ότι έχουμε δημιουργήσει για κάτι που στην πραγματικότητα είναι λίγο πιο τεχνική που ονομάζεται char *. Και πράγματι, είδαμε ένα παράδειγμα του προγράμματος, τη Δευτέρα ότι δεν συμπεριφέρονται τόσο περιμέναμε. Αυτό ήταν το αρχείο, να συγκρίνουν-0. Και υπενθυμίζουν ότι compare-0, εάν Έχω μεταγλωττίσετε ξανά το πρόγραμμα της Δευτέρας και τρέχουν να συγκρίνετε-0 και πληκτρολογήστε τη μαμά στο πεζά, και η μαμά με πεζά και πάλι. Το πρόγραμμα επέμενε να Τύπος διαφορετικά πράγματα, έστω και αν η μαμά, όλα σε πεζά, είναι πανομοιότυπο οπτικά. Λοιπόν, τι ήταν η σύντομη απάντηση για τους οποίους ο υπολογιστής νομίζει οι δύο χορδές είναι διαφορετικά; Ναι; Κοινό: [δεν ακούγεται] David J. Malan: Σωστά. Έτσι, μαμά, η πρώτη φορά Μου πληκτρολογήσετε, είναι να είναι αποθηκεύεται κάπου στην του υπολογιστή μου μνήμη αλλά σε μια διαφορετική θέση από τη δεύτερη φορά που πληκτρολογείτε στη μαμά. Τώρα σίγουρα θα μπορούσε να βελτιστοποιηθεί. Ο υπολογιστής θα μπορούσε να είναι έξυπνος και επίτευξη αυτών των δύο χορδές, hey, ότι είναι πανομοιότυπα. Επιτρέψτε μου να μην πλεονασμό το αποθηκεύσετε. Αλλά οι υπολογιστές δεν το κάνουμε αυτό βελτιστοποίηση εκτός και αν τους πω να. Έτσι, από προεπιλογή, είναι ακριβώς πρόκειται να καταλήξει σε δύο διαφορετικές θέσεις στη μνήμη. Και έτσι να είναι πιο σαφής, όταν συγκρίναμε τις δύο χορδές, Η πρώτη ήταν ονομάζεται s, το δευτερόλεπτο ονομαζόταν t, τι ακριβώς ήμουν συγκρίνοντας εδώ στη γραμμή 13; Ναι. Κοινό: Είναι η θέση στη μνήμη ότι η μεταβλητή θα δείχνει. David J. Malan: Ακριβώς, ήμουν συγκρίνοντας τη θέση στη μνήμη ότι οι μεταβλητές επεσήμανε. Έτσι, ειδικότερα, αν η μαμά ήταν σε Αριθμός byte 1, και 2, και 3, και 4-- γιατί θυμάμαι την ανάστροφη κάθετο 0 πρέπει να είναι όλος ο τρόπος στο τέλος. Και το άλλο παράδειγμα της μητέρας, m-o-m, ήταν στη διεύθυνση 10, 11, 12, και 13. Ήμουν συγκρίνοντας 1, ότι η διεύθυνση, ότι θέση στη μνήμη, κατά 10, η οποία είναι προφανώς δεν είναι το ίδιο. 1 δεν είναι 10. Έτσι, αυτό είναι ωραίο το γεγονός ότι είναι αρκετά απλή. Αλλά είναι προβληματική στο βαθμό που δεν φαίνεται να μπορεί να συγκρίνει χορδές. Έτσι fundamentally-- και σε αυτό το χαμηλό επίπεδο, αν ήθελε να εφαρμόσει ένα πρόγραμμα για να συγκρίνετε δύο ξεχωριστές λέξεις που η χρήστης έχει πληκτρολογήσει για την ποιότητα, μήπως παρατάξει για char char, μόνο σε γενικές γραμμές, τι πρέπει να κάνουμε, προφανώς; Δεν είναι αρκεί απλώς να ματιά σε αυτά τα δύο διευθύνσεις. Τι πρέπει να κάνουμε; Ναι; Κοινό: διέτρεξε το string [δεν ακούγεται]. David J. Malan: Ναι, ας επαναλάβει μέσω του string. Ας χρησιμοποιήσουμε ένα for loop, ένα βρόχο while, ή ό, τι είστε πιο άνετα. Και αν έχουμε δύο χορδές κάπου στη μνήμη, ας ρίξουμε μια ματιά σε κάθε του πρώτο χαρακτήρα, τότε το κάθε δευτερόλεπτο είναι χαρακτήρας, τότε το τρίτο, και τέταρτο, και το πέμπτο, μέχρι να χτυπήσει τι ιδιαίτερη αξία φρουρού; Κοινό: [δεν ακούγεται] David J. Malan: Ναι, η ανάστροφη κάθετο μηδέν, σημείο κατά το οποίο είτε εγχόρδων μπορούμε να αποφασίσουμε ότι είναι. Έχουμε συμφωνημένα κάθε χαρακτήρα; Αν όχι, επιστρέφει false. Αν ναι, να επιστρέψει αλήθεια. Και έτσι αυτό είναι ακριβώς ό, τι αυτή η έκδοση του προγράμματος συγκρίνετε-1.γ κάνει. Είναι πανομοιότυπο με αυτό που κοίταξε Δευτέρα, εκτός του ότι έχω πάρει απαλλαγούμε από τη λέξη string-- αν ότι δεν έχει καμία λειτουργική impact-- όλα Κάνω τώρα είναι η αφαίρεση ορισμένες ζάντες εκπαίδευση εξ όψεως, αλλά για να δούμε ξεκάθαρα ότι s και t είναι διευθύνσεις. Και αυτό είναι ό, τι το αστέρι, ο αστερίσκος αντιπροσωπεύει είναι μια διεύθυνση, αλλιώς γνωστή περισσότερα τεχνικά ως δείκτης. Έτσι, όταν δηλώνω σχετικά με γραμμή 9 και να πω char * s, αυτό δεν σημαίνει ότι μου δίνουν ένα string. Αυτό σημαίνει να μου δώσει μια μεταβλητή της οποίας σκοπός στη ζωή είναι να αποθηκεύσετε μια διεύθυνση. Επειδή είμαι έτοιμος να θέσει το διεύθυνση ενός string σε αυτό. Και πράγματι, GetString, να είναι σαφείς, δεν επιστρέφει ένα string. Αυτό δεν θα επιστρέψει η μαμά ανάστροφη κάθετο μηδέν, per se. Τι σημαίνει συγκεκριμένα GetString και ακριβώς να επιστρέψει; Κοινό: [δεν ακούγεται] David J. Malan: Η διεύθυνση, η τη διεύθυνση του πρώτου χαρακτήρα σε κάποιο κορδόνι που έχει πάρει. Και έτσι τώρα βλέπουμε μια ειδική λέξη-κλειδί ξανά. Και, αναφέρθηκα σε αυτό νωρίτερα. Αυτό πρόκειται να είναι καλή σύμβαση ότι θα δούμε ξανά και ξανά τώρα. Φεύγω για να βεβαιωθείτε ότι s δεν είναι μηδέν και t δεν είναι null. Επειδή βασίζονται σε πραγματικά μου γρήγορη αναφορά νωρίτερα, τι μπορεί να σημαίνει αν GetString δεν επιστρέφει μια διεύθυνση αλλά Ν-U-L-L, η οποία είναι και πάλι, κάποια ιδιαίτερη αξία; Κοινό: Σφάλμα. David J. Malan: Είναι ένα λάθος. Κάτι πήγε στραβά. Και ό, τι συνήθως μπορεί να συμβεί, ιδίως strings-- με την οποία μπορεί να είναι αγνώστου μήκους σε advance-- ίσως οι υπολογιστές » έξω από τη μνήμη, ίσως έχετε πληκτρολογήσει σε μια τέτοια μακρά λέξη ή φράση ή επικολληθεί ένα τέτοιο τεράστιο δοκίμιο υπάρχει όχι μόνο αρκετή μνήμη. Και έτσι GetString δεν μπορούν να επιστρέψουν η διεύθυνση του όλου πράγματος, έτσι ώστε να επιστρέφει ακριβώς τίποτα. Και λέει έχει συμβεί ένα σφάλμα επιστρέφοντας την ειδική τιμή null. Είναι η διεύθυνση μηδέν, να το πω έτσι. Τώρα αποδεικνύεται C έρχεται με ένα λειτουργία που κάνει την εν λόγω επανάληψη. Δεν έχουμε να εφαρμόσουμε με ένα για το βρόχο ή ένα βρόχο, ενώ οι ίδιοι. Μπορούμε να χρησιμοποιήσουμε μια συνάρτηση, που ονομάζεται συνοπτικά, ανακατεύετε δείγμα, ή σύγκρισης συμβολοσειράς, του οποίου η σκοπός στη ζωή είναι να κάνει ακριβώς αυτό. Μπορείτε να δώσετε δίποντα, δύο διευθύνσεις, και θα πάει σε αυτές τις διευθύνσεις και στη συνέχεια συγκρίνει επιστολή για επιστολή για την επιστολή για την ποιότητα, σταματώντας μόνο όταν αυτό είναι αλήθεια; Όταν διαισθητικά θα πρέπει να ανακατεύετε δείγμα σταματήσετε την επανάληψη, ακριβώς για να είναι σαφές; Όταν χτυπά μια ανάστροφη κάθετο 0 είτε κορδόνι, σε ποιο σημείο μπορεί να αποφασίσει έχει τα πάντα ταιριάζουν, ή υπήρξε μια διαφορά; Έτσι, αν τρέξουμε αυτό τώρα και δοκιμάστε το μικρό μας παιχνίδι κεφαλαιοποίησης, έτσι ώστε να συγκρίνουν-1, ./compare-1, και Τύπος μαμά με πεζά και τις δύο φορές. Τώρα είναι το ίδιο πράγμα. Και αν το κάνω και πάλι με πεζά και κεφαλαία τότε ίσως. Τώρα διακρίνει πράγματι μεταξύ πεζά και κεφαλαία. Έτσι, δεν είναι όλα τόσο δύσκολο ή μαγικό, αλλά δεν εξηγεί τώρα τι συμβαίνει κάτω από το καπό. Έτσι, ό, τι περισσότερο μπορούμε να εξαγάγετε από αυτό το είδος του μαθήματος; Έτσι, ας ρίξουμε μια ματιά σε αυτό. Πάω να πάει μπροστά και να γράψει ένα γρήγορο πρόγραμμα εδώ ονομάζεται copy-0. Και τώρα ας προχωρήσουμε και μάλιστα ας κάνουμε this-- με copy-0, ρίξτε μια ματιά σε αυτό που έχω εδώ. Θέλω πρώτα να λένε στο χρήστη, να πω κάτι. Τότε θα πάρετε ένα string και μου αποθηκεύονται σε s. Τότε μπορώ να ελέγξω αν s ισούται ισούται με NULL, μόλις επιστρέψει 1. Έτσι, αυτό είναι μόνο τυπική έλεγχο σφαλμάτων. Τίποτα ενδιαφέρον έχει συμβεί. Και στην πραγματικότητα, αν μπορούμε να απαλλαγούμε από την πλάνη τον έλεγχο, αυτό μοιάζει εβδομάδα 1 Κωδικός αυτή τη στιγμή. Αλλά έχω αρχίσει να πάρει ένα λίγο καλύτερα για αυτό. Τώρα στην γραμμή 16, πριν από μία εβδομάδα, ίσως ημέρες ακόμα και ένα ζευγάρι ή λεπτά πριν, θα μπορούσε να πει γραμμή 16 είναι δημιουργώντας μια μεταβλητή που ονομάζεται t και αντιγραφή s σε αυτό. Και αυτό είναι μια τέλεια λογικές πακέτο. Αλλά είναι πιο ακριβής τώρα. Αυτό που συμβαίνει στην γραμμή 16; Τι γίνεται όλο και αντιγράφεται από δεξιά προς τα αριστερά; Ναι; Κοινό: είναι τ να πάρει μια διεύθυνση του s; David J. Malan: Ακριβώς, t είναι να πάρει τη διεύθυνση του s. Έτσι για να είναι σαφές τώρα, αν πάω πίσω σε εκείνο το προηγούμενο παράδειγμα και ήθελα να επιστήσω την πράγμα που έχω πληκτρολογήσει. Και ό, τι έχω πληκτρολογήσει in-- εδώ είναι s, και εδώ Είναι ό, τι έχω πληκτρολογήσει κάπου μνήμη, η μαμά και στη συνέχεια μια ανάστροφη κάθετο 0 που προστίθεται για μένα. Αυτό που αποθηκεύονται εδώ, θυμάμαι, αυτό είναι στη θέση 1, 2, 3, 4, Αυτό είναι ό, τι είναι σήμερα s. Έτσι, αν στη γραμμή 16, λέω να μου δώσει μια άλλη μεταβλητή που ονομάζεται t και αποθήκευση σε αξία του s, τι παίρνει αποθηκεύονται εδώ δεν θα μαμά αλλά μόνο ο αριθμός 1. Έτσι, αν κοιτάξουμε μπροστά σε αυτό το πρόγραμμα τώρα, τι πρόκειται να συμβεί; Έτσι, παρατηρούμε ότι υπάρχει Αυτή η λειτουργία ίσως έχουν χρησιμοποιήσει αυτό πριν από λίγο καιρό για Καίσαρα, ή Vigenere, ή ίσως και καθόλου. Ισχυρίζομαι με printf μου, είμαι πρόκειται να κεφαλαιοποιήσει το αντίγραφο t. Πρώτη στη γραμμή 19, γρήγορο λογική ελέγξτε, strlen ελέγχους το μήκος του t. Επειδή δεν θέλω να να προσπαθήσει να αξιοποιήσει κάτι αν δεν υπάρχει κορδόνι εκεί. Εάν ο χρήστης απλά να πατήσετε το Enter, δεν υπάρχει τίποτα για να επωφεληθούμε. Έτσι, δεν θέλω να κάνω γραμμή 21. Έτσι, γραμμή 21 κεφαλαιοποιεί η οποία επιστολή, προφανώς, στο t; Κοινό: m; David J. Malan: Φαίνεται όπως είναι η αντιγραφή ποια; Κοινό: m. David J. Malan: Χμ, m. Εντάξει, έτσι η πρώτη m, γιατί προειδοποίηση ότι είμαι περνώντας toupper, η οποία αν δεν έχετε δει ότι είναι απλά μια λειτουργία για να κεφαλαιοποιήσει στην είσοδο αυτού. t βραχίονα μηδέν σημαίνει να δώσει μένα το μηδέν χαρακτήρα του t. Και ναι, πώς το κάνει αυτό Αλλαγή εικόνας, να είναι σαφές; Τι χρειάζεται για να ξαναγραφεί ή να αλλάξει σε σχέση με το s και t και η μαμά ανάστροφη κάθετο μηδέν. Κοινό: [δεν ακούγεται] David J. Malan: Ναι, έτσι αυτό εδώ απλά πρέπει να πάρει αλλάξει to-- καθορίσει this-- χρειάζεται για να μετατραπεί σε κεφάλαιο m. Αλλά τώρα, να δούμε αργότερα στο πρόγραμμα, αν τυπώσω s και t όπως έχω καθαρίσει εδώ, προσέχετε τι είναι πρόκειται να συμβεί εκτύπωση s και t. Έτσι κάνετε copy-0, ./copy-0. Επιτρέψτε μου να πάω μπροστά και πληκτρολογήστε στη μαμά σε όλα τα πεζά. Παρατηρήστε τόσο το πρωτότυπο και το αντίγραφο έχουν κεφαλαιοποιηθεί. Γιατί; Λοιπόν, s και t είναι και τα δύο δείχνουν προς, αν θέλετε, το ίδιο κομμάτι της μνήμης. Και ειλικρινά, αυτό είναι όλο uninteresting-- πραγματικά το γεγονός ότι είμαστε χρησιμοποιώντας την διεύθυνση μηδέν εδώ. Θέλω να πω, εγώ δεν ενδιαφέρονται πραγματικά όπου τα πράγματα είναι στη μνήμη. Συγγνώμη Είμαι διαγράφοντας ένα μικρό πάρα πολύ. Αλλά δεν με νοιάζει όπου τα πράγματα είναι στη μνήμη. Και έτσι, πράγματι, ό, τι προγραμματιστές τείνουν να σκεφτούμε είναι ότι όταν μιλάμε για μια διεύθυνση ή ένα δείκτη, ποιος νοιάζεται όταν είναι στη μνήμη. Δεν με νοιάζει αν είναι σε byte ένα ή ένα δισεκατομμύριο. Απλώς με νοιάζει ότι αυτό μεταβλητή είναι αποτελεσματικά δείχνει σε εκείνο το κομμάτι της μνήμης. Και έτσι, πλέον, και όχι υπεκφυγή πάνω από αυθαίρετες διευθύνσεις μνήμης, ας μόλις αρχίσει να επιστήσει δείκτες ως δείκτες, όπως τα βέλη. Έτσι τι s και t είναι πραγματικά, σύμφωνα με το πρόγραμμα αυτό, λόγω του τρόπου που δημιούργησα t, είναι ακριβώς δύο ξεχωριστές μεταβλητές δείχνοντας το ίδιο κομμάτι της μνήμης. Και δεν με νοιάζει πού βρίσκονται. Έτσι μπορούμε να αφηρημένη μακριά εκείνη την λεπτομέρεια. Λοιπόν, πώς μπορώ να το διορθώσω αυτό; Αν θέλω να γράψω μια έκδοση του αντιγράφου πρόγραμμα που στην πραγματικότητα αντιγράφει τη συμβολοσειρά και αξιοποιεί μόνο το αντίγραφο, μόνο διαισθητικά, τι πήρε να είναι μια συστατικό για λύση μας; Κοινό: [δεν ακούγεται] David J. Malan: Χρειαζόμαστε τι; Κοινό: Κομμάτι της μνήμης. David J. Malan: Χρειαζόμαστε ένα άλλο κομμάτι της μνήμης, έτσι δεν είναι; Δεν ξέρουμε πώς να το κάνει ακόμα, είναι απαραίτητα. Αλλά εγώ το είδος πρέπει να συμβεί αυτό, έτσι ότι η αρχική μαμά σε πεζά καταλήγει σε αυτό το επιπλέον κομμάτι της μνήμης. Και στη συνέχεια, όταν αλλάζω το αντίγραφο, Ι Δεν θέλουν να αλλάξουν αυτό το αντίγραφο εδώ. Θα αντί να θέλετε να αλλάξετε μόνο αυτό Αντίγραφο έτσι ώστε η αρχική παραμένει αμετάβλητο. Έτσι, ας δούμε πώς μπορούμε να το κάνουμε αυτό. Στο αντίγραφο-1, το οποίο έχει ήδη απογυμνωθεί από το σχόλιο, αλλά σχολίασε σε απευθείας σύνδεση. Εμείς αντί να κάνουμε το following-- αυτά γραμμές είναι ίδιες, φέρε μου ένα string και να το ονομάσουμε s. Αλλά τώρα ας δούμε ένα από τα πιο μας περίπλοκοι, αλλά η τελευταία της πολυπλοκότητας για λίγο, γραμμή 16 κάνει ακριβώς αυτό. Έτσι, αν σας άνετα με το εικόνα που μόλις drew-- να μου δώσει ένα νέο κομμάτι της μνήμης, αντιγράψετε τα πάντα σε αυτό, Ας δούμε πώς μπορούμε να το μεταφράσουμε κώδικα. Έτσι γραμμή 16, στην αριστερή πλευρά, char * t μου δίνει αυτό το πλαίσιο εδώ. Αυτό είναι το μόνο που κάνει. Στη δεξιά πλευρά, m alloc, ή malloc, Είναι εκχώρηση μνήμης, σούπερ φανταχτερό, ένα κρυπτικό τρόπο ακριβώς λέει να μου δώσει ένα κομμάτι της μνήμης. Πόση μνήμη χρειαζόμαστε; Λοιπόν, είναι το είδος της μια μεγάλη έκφραση. Αλλά ας δούμε τι λέει εδώ. Έτσι αυτό, φυσικά, είναι να δώσει Μου το μήκος της συμβολοσειράς s. Έτσι, η μαμά θα πρέπει να είναι αυτό; Έτσι μόνο τρεις, έτσι δεν είναι; Η μαμά είναι τρεις χαρακτήρες. Δεν μετράνε οι ανάστροφη κάθετο μηδέν όταν μιλήσουμε για το μήκος μιας χορδής είναι στην πραγματικότητα τα ανθρώπινα ορατό γράμματα. Έτσι, μαμά, οπότε αυτό μου δίνει 3. Αλλά περιμένετε ένα λεπτό, τώρα είμαι προσθέτοντας 1. Γιατί πραγματικά θέλουν να Διαθέτουμε 4 bytes και όχι μόνο 3; Ναι; Κοινό: Για την αξία φρουρού; David J. Malan: Ακριβώς, για τη συγκεκριμένη τιμή φρουρού. Για την ανάστροφη κάθετο μηδέν, Χρειάζομαι 4 bytes συνολικά. Γι 'αυτό χρειάζεται το μήκος της σειράς συν 1. Και τότε μόνο για καλό measure-- μολονότι σε αυτό το σύστημα, ότι πάντα θα είναι 1-- λέω πολλαπλασιάζουμε με το μέγεθος ενός char. Βγάζει sizeof είναι μια επιχείρηση σε c που απλά σας το λέει τον αριθμό των bytes που είναι που απαιτείται για έναν ορισμένο τύπο δεδομένων. Δεν δουλεύει για συστοιχίες, συνήθως, μερικές φορές κάνει. Αλλά στη γενική περίπτωση, όχι. Αλλά θα μου πείτε πόσα bytes α char είναι, η οποία αποδεικνύεται ότι είναι πάντα 1. Έτσι, αυτό είναι σαν τον πολλαπλασιασμό κατά 1. Έτσι σούπερ αινιγματικά αναζητούν γραμμή κώδικα. Αλλά το μόνο που κάνει είναι να δίνει μου ένα κομμάτι της μνήμης. Αλλά δεν φαίνεται να αντιγράφει τίποτα σε αυτήν τη μνήμη; Όχι ακόμα. Και ναι, τι μπορώ να κάνω στη γραμμή 22, και 23, 24, 25, καλά, εγώ απλά κάνω αυτό. Και αυτό είναι το είδος του παλιά πράγματα σχολείο τώρα. Αυτό είναι σαν το chipset 2, όπου είστε ακριβώς κινείται πράγματα γύρω στη μνήμη, ή μάλλον σε χορδές. Έτσι είμαι επανάληψη από το 0 έως το το μήκος της συμβολοσειράς s. Και είμαι αντιγράφοντας το i-οστό χαρακτήρα σε s στο i-οστό χαρακτήρα t. Και επειδή εγώ, ο προγραμματιστής, έκανε Φροντίστε να διαθέσει ακριβώς όπως πολλά bytes όπως έχω ανάγκη, είναι τέλειο το ένα-προς-ένα σχέση. Και μπορώ να αντιγράψω μαμά σε πεζούς στο νέο. Και έπειτα, τέλος, να κάνω αυτή τη γραμμή. Και έτσι το αποτέλεσμα είναι μόνο να κεφαλαιοποιήσει αυτή την t εδώ. Έτσι, πολλά να απορροφήσει, αλλά αν απλά να εξετάσει τι πραγματικά συμβαίνει στο κάτω από το καπό Είναι ακριβώς αυτά που διακινούνται bytes γύρω, όλα αυτά είναι απαραίτητη για την επίλυση αυτού του προβλήματος είναι απλά να μας δώσει αυτό το κομμάτι της μνήμης. Τώρα, με κίνδυνο συντριπτική, επιτρέψτε μου να δείχνουν ένα άλλο παράδειγμα που είναι σχεδόν πανομοιότυπα, εκτός από αυτό γραμμή κώδικα. Έτσι, αυτό είναι η έκδοση χάκερ του εν λόγω προγράμματος, αν θέλετε. Αλλά ας απόσταξη ότι σε ό, τι συμβαίνει. Γραμμή 24 χρησιμοποιείται για να είναι αυτό το t βραχίονα I παίρνει s βραχίονα i. Τώρα, αλλάζω αυτό να η πιο αινιγματικά αστέρι t συν 1 ισούται με το άστρο συν 1. Έτσι τι συμβαίνει και γιατί έχουμε ένα αστέρι χαρακτήρα; Έχουμε δει το αστέρι πριν, και αυτό είναι που χρησιμοποιείται με διαφορετικό τρόπο εδώ. Είδαμε προηγουμένως char *, τώρα βλέπω Ένα αστέρι στην αρχή, και αυτό είναι εντάξει. Επειδή αποδεικνύεται εμείς μπορεί να συναχθεί το είδος του μόλις από εκείνες τις πρώτες αρχές τι συμβαίνει. Έτσι, ακριβώς για να είναι σαφές, τι είναι s; Την περασμένη εβδομάδα, ήταν ένα string. Αυτό δεν αρκεί πια. Τι είναι το s, συγκεκριμένα; Κοινό: [δεν ακούγεται] David J. Malan: Είναι ένας δείκτης. Είναι η διεύθυνση του πρώτος χαρακτήρας που πληκτρολογήσατε. Εντάξει, τι είναι τ; Κοινό: [δεν ακούγεται] David J. Malan: Η τη διεύθυνση του πρώτου byte σε t, ότι κομμάτι της μνήμης ανακατανεμηθούν. Έτσι αποδεικνύεται ότι όταν επαναλήψεις από 0 μέχρι του εγχόρδων length-- πρώτα απ 'όλα, ξεκινά στο 0, επειδή του αυτό το παλιό σχολείο για κάτι βρόχο. Έτσι απλά για λόγους απλότητας, ας υποθέσουμε ότι η πρώτη γραμμή του κώδικα είναι πραγματικά ακριβώς αυτό, σωστά. Αν το i είναι μηδέν, προσθέτοντας μηδέν σε κάτι πιθανώς δεν πρόκειται να έχει αποτέλεσμα. Λοιπόν, τι είναι αυτό το ρητό; Αποδεικνύεται ότι το αστέρι χειριστής στο πλαίσιο αυτό είναι η dereference διαχειριστής, ο οποίος είναι απλώς ένα φανταχτερό τρόπο λέγοντας πάτε στην ακόλουθη διεύθυνση. Έτσι, αν το s είναι η διεύθυνση του πρώτου χαρακτήρα σε αυτό το κομμάτι της μνήμης, * s μέσα πάει εκεί. Και επειδή έχουμε ζωγραφίσει η εικόνα με τον τρόπο αυτό, μπορείτε να υιοθετήσετε το παρακάτω νοητικό μοντέλο. Αν αυτή είναι η s, και λέτε * s, s * κάτι σαν υδατοπτώσεις και τις σκάλες, αν θυμάστε το παιχνίδι από την παιδική ηλικία, Είναι σαν να ακολουθήσουν αυτό το βέλος και να πάει στη διεύθυνση. * t είναι το ίδιο πράγμα. Έτσι, ξεκινούν εδώ, πηγαίνετε στο κομμάτι της. Δεν μπορώ να αντλήσει από Αυτή η οθόνη με αυτόν τον τρόπο. * t σημαίνει να πάτε εδώ. Και τότε, ο βρόχος for είναι ακριβώς λέγοντας μετακινήσετε αυτό το χαρακτήρα εδώ, μετακινήσετε αυτό το χαρακτήρα εδώ, μετακινήσετε αυτό το χαρακτήρα εδώ. Αλλά πώς μπορώ να το κάνω και προσαύξηση; Πρέπει να αναιρέσετε αυτό που μόλις διαγραφεί. Αυτό είναι ό, τι γενικά ονομάζεται αριθμητικής δεικτών, η οποία σημαίνει μαθηματικά με διευθύνσεις. Αν, σ 'αυτό για βρόχο, Κρατάω προσαύξηση i, και s είναι μια διεύθυνση και το t είναι ένας διεύθυνση, αν θέλω απλώς να συνεχίσουμε να προσθέτουμε 1, αυτό σημαίνει απλά να κρατήσει κινείται προς τα εμπρός, και διαβιβάζει, και διαβιβάζει στη μνήμη. Είναι σαν την Oxford Street, το δρόμο που το κτίριο είναι σε CS. Τα κτίρια CS είναι 33 Oxford Street. Έτσι, εάν επρόκειτο να κάνουμε 33 Η Oxford Street συν 1, που σας φέρνει σε 34 Οξφόρδη Οδός, στη συνέχεια, 35 Oxford Street, Στη συνέχεια 36 Oxford Street, ανεξάρτητα από εκείνα κτίρια στην πραγματικότητα είναι - αν υπάρχουν. Και έτσι, αυτό είναι όλο που κάνουμε εδώ με το δείκτη αριθμητικής. Γι 'αυτό είναι ένας έξοχος τρόπος απόκρυφες εκφράζει τον εαυτό μας. Αλλά όλα αυτά που συμβαίνουν κάτω από την κουκούλα Είναι ακριβώς μετά από αυτές τις διευθύνσεις, όπως μετά από ένα χάρτη, αν θέλετε, ή μετά από τα βέλη όπως έχουμε ζωγραφίσει στην οθόνη. Εντάξει, πολλά για να χωνέψει. Οποιαδήποτε ερώτηση σχετικά με τη σύνταξη, τις έννοιες, δείκτες, malloc, ή τα παρόμοια. Ναι, εδώ για πρώτη φορά. Κοινό: Έτσι όταν η λέει * t ισούται με toupper * t, είναι ότι πρόκειται να κεφαλαιοποιήσει Όλα τα γράμματα ή just-- David J. Malan: Αχ, πολύ καλή ερώτηση. Έτσι, σε αυτή τη γραμμή εδώ, 31, είναι αυτή η μετάβαση να κεφαλαιοποιήσει το πρώτο γράμμα ή το σύνολο των γραμμάτων. Ας απαντήσω ότι με τη μετάβαση πίσω στις πρώτες αρχές. Και τις πρώτες αρχές εδώ εννοώ πήγαινε στους βασικούς ορισμούς του τι παίζεται. Έτσι toupper είναι μια συνάρτηση ότι αξιοποιεί μια χαρα. Αυτά. * t σημαίνει να πάει στο first-- μεταβείτε στη διεύθυνση που αναφέρεται στο t. Έτσι, στην εικόνα, εάν αυτό είναι το κομμάτι της μνήμης που διατίθενται με malloc, και αυτό είναι t, t * σημαίνει πηγαίνετε εδώ. Εν τω μεταξύ, είστε περνώντας η αξία, πεζά m να toupper, παίρνετε πίσω κεφάλαιο Μ, όπου μπορείτε να το θέτει; Είσαι το θέτει στην ίδια θέση. Και έτσι με αυτή τη λογική εκείνων βασικοί ορισμοί είναι μόνο κεφαλαιοποιώντας το πρώτο γράμμα εκτός και αν επαναλάβει με το i ή για βρόχο ή ένα βρόχο while, δεν πρόκειται να κάνει τίποτα περισσότερο από ό, τι ζητήσει. Καλή ερώτηση. Ναι; Κοινό: Γιατί να χρησιμοποιήσετε το dereference μέθοδο παρά η σειρά; David J. Malan: Αχ, καλή ερώτηση. Γιατί θα χρησιμοποιήσετε το dereference μέθοδο αντί της μεθόδου πίνακα; Όχι ιδιαίτερος λόγος, για να είμαι ειλικρινής. Και, στην πραγματικότητα, για το σκοπό αυτό είδους παράδειγμα, το δικαίωμα, Είμαι ακριβώς το επιχείρημα να καταστεί η πρόγραμμα πιο περίπλοκη, Τα πιο πάνω τα μάτια τζάμια, οι άνθρωποι να ελέγξει έξω γιατί αυτό φαίνεται σούπερ απόκρυφες, αλλά ακόμα κι αν κάνει το ίδιο πράγμα. Και έτσι, ειλικρινά, αυτό είναι ένα άσκοπα οπτικά περίπλοκη λύση στο πρόβλημα. Είναι ακόμα καλό σχεδιασμό, σύνολο των πέντε για το σχεδιασμό, είτε είναι στο βραχίονα σημειογραφία ή ο συμβολισμός δείκτη. But-- ειδικά όταν παίρνουμε αργότερα κατά την πορεία στο PSET 5 όταν θα εφαρμόσει αυτό το λεξικό που Έχω αναφερθεί ένα ζευγάρι των times-- θα πραγματικά νοιάζονται για το διευθύνσεις μνήμης χαμηλού επιπέδου ότι καταλαβαίνουμε πραγματικά τι συμβαίνει. Αλλά, για τώρα, αποδεικνύεται ότι αυτή η γραμμή κώδικα εδώ αγκύλες δεν υπάρχουν πραγματικά. Είναι αυτό που λέμε συντακτική ζάχαρη, η οποία είναι απλά μια αλλόκοτα δροσερό τρόπο του λέγοντας ότι η compiler μετατρέπει αγκύλες για να είναι ότι μαθηματική έκφραση. Έτσι είναι μια ανθρώπινη σύμβαση να είναι σε θέση να γράψει μόνο Αυτά τα πολύ φιλικό προς το χρήστη παρένθεση. Αλλά τι ο compiler, κλαγγή, κάνει πραγματικά οποιαδήποτε στιγμή μπορείτε να γράψετε ό, τι τονίζεται στην γραμμή 24, κάτω από την κουκούλα είναι πραγματικά μετατροπή του σε αυτό. Είναι λίγο πιο ευχάριστο όσο ένα ανθρώπινο να διαβάζουν και να γράφουν κώδικα όπως γραμμή 24. Αλλά τελικά εκείνες ρόδες πάρα βγει όταν το δικό άνεση ενός ατόμου γίνεται ισχυρότερη. Εντάξει, έτσι θυμούνται τότε ότι αυτό Ήταν το είδος του μεγαλύτερο πρόβλημα τρέξαμε μέσα. Και αυτό είναι που προκάλεσε όλη αυτή την βλασφημία συζήτηση σχετικά με τους δείκτες, και τις διευθύνσεις, καθώς και η αντιγραφή πράγματα. Ήταν γιατί σκόνταψε πάνω αυτή η ηλίθια, ηλίθια θέμα, σύμφωνα με την οποία Θα εφαρμοστεί logically-- με Lauren εδώ για το demo και το χυμό πορτοκαλιού στην milk-- μια τέλεια αλγοριθμικά σωστή λειτουργία για την εναλλαγή δύο μεταβλητές ' τιμές, αλλά το πράγμα βλασφημίας δεν είχε καμία επίμονη, ή μόνιμο αποτέλεσμα επί τον κωδικό μου. Και γιατί έγινε αυτό; Με λίγα λόγια, γιατί είναι αυτό εφαρμογή της ανταλλαγής λογικά σωστό, αλλά δεν έχει καμία επίπτωση σχετικά με τις μεταβλητές που έχουν περάσει σε αυτό, όπως x και y για τα κύρια; Ποια ήταν η ουσία του θέματος; Ναι; Κοινό: Επειδή γίνεται μεταβλητή αντίγραφα της μεταβλητής στο πέρασμα μέσα από τη λειτουργία. David J. Malan: Ακριβώς, όταν περνάτε μεταβλητές σε λειτουργία, ή επιχειρήματα σε λειτουργία, είναι πέρασε από αντίγραφο, το οποίο σημαίνει ότι μπορείτε να πάρετε το ίδιο ψάχνετε πρότυπο δυαδικών ψηφίων για τις δύο x και y, που ονομάζεται εδώ a και b. Και μπορείτε να κάνετε τίποτα θέλετε με αυτά τα αντίγραφα, αλλά πρόκειται να έχει καμία επίδραση στη λειτουργία κλήσης. Και, στην πραγματικότητα, ότι επέστησε εικόνα στην οθόνη, ανάκληση τελευταία φορά, σύμφωνα με την οποία αν Πραγματικά σκεφτείτε τι είναι συμβαίνει κάτω από το hood-- εάν Αυτή είναι η μνήμη του υπολογιστή σας, και εδώ κάτω είναι το κομμάτι της μνήμης που χρησιμοποιούνται για την κύρια, αυτό είναι το κομμάτι της μνήμης που χρησιμοποιείται για την ανταλλαγή, και έτσι ακόμα και αν ο κύριος έχει δύο μεταβλητών Χ και Υ, ανταλλαγής θα μπορούσαν να έχουν πανομοιότυπες ψάχνετε αξίες, και οι δύο εκ των οποίων είναι 1 και 2, αλλά είναι εντελώς διαφορετικά κομμάτια της μνήμης. Έτσι, χρειαζόμαστε μια λύση γι 'αυτό. Και ειλικρινά, φαίνεται ότι είμαστε τώρα έχουν μια λύση σε αυτό το πρόβλημα, σωστά. Αν τώρα έχουμε τη δυνατότητα να χειριστείτε τα πράγματα με τον τρόπο διευθύνσεων και το είδος των υδατοπτώσεις και σκάλες στυλ, ακολουθήστε τα βέλη και πάμε οπουδήποτε θέλουμε στη μνήμη, δεν θα μπορούσαμε λύσει αυτό το πρόβλημα με περνώντας από την κύρια να ανταλλάξουν όχι οι αξίες που θέλουμε να swap, αλλά μόνο διαισθητικά τι θα μπορούσαμε να περάσουν για να ανταλλάξουν αντ 'αυτού; [Παρεμβολή ΦΩΝΕΣ] David J. Malan: Γιατί δεν το κάνουμε εμείς απλά δώσετε τις διευθύνσεις, έτσι δεν είναι; Γιατί δεν δίνουμε μια συμφωνία ανταλλαγής χάρτη θησαυρού, αν θέλετε, ότι οδηγεί στην πραγματικές τιμές x και y. Ας swap, στην πραγματικότητα, αλλάζουν οι εν λόγω πρωτότυπο bits, αντί απλά περνώντας αντίγραφα των bits. Και έτσι, στην πραγματικότητα, αυτό είναι ό, τι είναι πρόκειται να είναι η λύση. Αυτή η έκδοση είναι εδώ σαφώς κακό και προβληματικό. Και τώρα, με την πρώτη ματιά, φαίνεται ακριβώς σαν να προστεθεί ένα μάτσο αστέρια τυχαία και διέσχισε τα δάχτυλά μας ότι θα μεταγλωττίσετε. Όμως, θα ήταν τώρα να μεταγλωττίσετε. Αλλά ας δούμε τι σημαίνουν αυτά τα πράγματα. Και, δυστυχώς, οι συντάκτες του C θα μπορούσε να έχει επιλέξει άλλο σύμβολο για να κάνουν αυτό μια μικρή σαφέστερη, αλλά ο χειριστής αστέρι έχει διαφορετικό νόημα στην δύο διαφορετικά πλαίσια. Και έχουμε δει και τα δύο, αλλά ας διακρίνουν. Έτσι, στην κορυφή εκεί, όταν έχω αλλάξει a και b από το να είναι int στην κακή έκδοση σε int αστέρια, Α και Β, προηγουμένως, ήταν ακέραιοι. Ποιες είναι οι α και β τώρα το καλό, πράσινη εκδοχή; Είναι διευθύνσεις. Διευθύνσεις τι, να είναι σαφές; Διευθύνσεις των ακεραίων. Έτσι, το γεγονός ότι είμαι λέγοντας μέσα int αστέρων αυτή είναι η διεύθυνση του ένας ακέραιος, συγκεκριμένα. Έτσι, σήμερα παρατηρούμε ότι στις γραμμές του κώδικα, κάτι άλλο έχει αλλάξει πάρα πολύ. tmp παραμένει το ίδιο, διότι είναι ακριβώς η προσωρινή ακέραιο, κανένα μαγικό μνήμη εκεί. Αλλά μια τώρα χρειάζεται ένα αστέρι. Και, στην πραγματικότητα, κάθε άλλα μνεία των a και b, παρατηρήσετε ότι όλα αυτά είναι αλλάζει από κόκκινο σε πράσινο είναι ότι είμαι προτάσσοντας εκείνες οι μεταβλητές με αστέρια. Επειδή δεν θέλω να αντιγράψετε α και β. Γιατί αν εγώ απλά αντιγράψτε a και b και ανταλλαγής α και β, τι είμαι εγώ πραγματικά αλλάζουν; Απλά διευθύνσεις, θέλω να ανταλλάξουν τι είναι σε αυτές τις διευθύνσεις. Θέλω να πάω εκεί. Και έτσι ο χειριστής αστέρι στο εσωτερικό της λειτουργίας μου, όχι μέσα της λίστας παραμέτρων, σημαίνει ότι θα πάει σε αυτές τις διευθύνσεις και πραγματικά να αλλάξει αυτές τις αξίες. Έτσι, αυτό που κάνει την εικόνα τώρα μοιάζουν αντ 'αυτού. Λοιπόν, αν αντί να περνώ in για το Α και Β δεν 1 και 2-- Εγώ πραγματικά πρέπει να προσθέσετε ένα άλλο ορισμό εδώ. Έτσι, ας υποθέσουμε ότι αυτό το κομμάτι της μνήμης είναι στη θέση 10. Αυτό είναι στη θέση 11, αλλά αυτό Είναι ένα κομμάτι της απλοποίησης, Τώρα έχω δύο επιλογές έχω περάσει x και y ή μπορώ να περάσει τις διευθύνσεις τους; Αν έχω περάσει τις διευθύνσεις τους όπως αυτό, εγώ απλά τώρα πρέπει να εφαρμόσουν ανταλλαγής ανά τον πράσινο κώδικα έτσι ώστε όταν βλέπει μια και πότε β βλέπει, δεν απλά να αντιγράψετε α και β και μετακινήστε το γάλα και το χυμό πορτοκαλιού. Το γάλα και χυμό πορτοκάλι αλληγορία σπάει τώρα κάτω, επειδή αυτά είναι φλιτζάνια του υγρού και όχι χάρτες. Εμείς αντί να πρέπει να πάει για την αντιμετώπιση των 10 και Πρέπει να πάμε να αντιμετωπίσουν 11, και στη συνέχεια να εκτελέσει αυτή τη λογική εναλλαγή. Έτσι, η λογική είναι η ίδια, αλλά χρειαζόμαστε έναν ελαφρώς διαφορετικό τρόπο της πρόσβασης σε αυτές τις μεταβλητές. Και έτσι στο τέλος, ποια είναι η το πρόγραμμα θα πρέπει να μοιάζει με αυτό είναι. Σε swap.c κυριολεκτικά αντιγραφεί και επικολληθεί το πράσινο έκδοση. Αλλά θέλω να κάνω μια αλλαγή. Δεν είναι μόνο αρκεί για να αλλάξει swap. Τι άλλο γραμμή κώδικα χρειάζομαι να αλλάξω; Ναι; Κοινό: Όταν παίρνει τα επιχειρήματα. David J. Malan: Πού παίρνει τη θέση της. Έτσι, αν μετακινηθείτε προς τα επάνω στο κύριο, εγώ Δεν μπορούμε απλά να περάσει στο x και y, και, υπόσχομαι, το τελευταίο κομμάτι της νέας σύνταξης σήμερα. Θα χρειαστεί να περάσει δεν είναι x και y αλλά η διεύθυνση του x και y. Και αποδεικνύεται, το σύμβολο ότι οι συντάκτες της Γ επέλεξε είναι αν χρησιμοποιείτε ένα εμπορικό και εδώ, για να μην πρέπει να συγχέεται με την bitwise ampersand, αν χρησιμοποιείτε ένα εμπορικό εδώ και ένα σύμβολο και εδώ, αυτό υπολογίζει για σας, ποια είναι η διεύθυνση του x, ίσως είναι 10, ποια είναι η διεύθυνση y, ίσως είναι 11, και περνά αυτές αντ 'αυτού. Έτσι, πολλά για να απορροφήσει όλα με τη μία. Αλλά ας δούμε τώρα γρήγορα μας υπόλοιπα τέσσερα λεπτά όπου τα πράγματα μπορούν να πάνε στραβά. Και, παρεμπιπτόντως, στην πραγματικότητα Πήρα αυτή την εικόνα, TF πήρε αυτή την εικόνα από ένα χρόνο ή δύο χρόνια πριν. Έτσι, αυτό είναι το πίσω γωνία του Έλιοτ τραπεζαρία. Δείκτες είναι ίσως το πιο δύσκολο θέμα που θα καλύψουμε σε CS50. Έτσι, αν ανησυχείτε το είδος της κλίσης είναι, όπως ίσως είναι περισσότερο από ένα ραβδί χόκεϋ όπως αυτό, να συνειδητοποιήσουν είμαστε το είδος του πλησιάζει στο ανώτατο σημείο όρους της εννοιολογικής πολυπλοκότητας. Και φέρνω μέχρι αυτό το φωτογραφία, γιατί ορκίζομαι στο θεό, το φθινόπωρο του 1996, όταν πήρα CS50 με τη διδασκαλία τους συναδέλφους μου, Nishat Mehta, μου κάθισε στο γωνιά του Έλιοτ Δ Hall τη διάρκεια του γεύματος, ή το δείπνο σας, ή να δοκιμάσετε κάτι για να με βοηθήσει να καταλάβω δείκτες. Και αυτό είναι όπου ήμουν εβδομάδες μετά εισήχθη στη διάλεξη, όταν Κατάλαβα τελικά δείκτες. Και είμαι αισιόδοξος ότι αυτή η θα χτυπήσουν πολύ νωρίτερα για εσάς. Αλλά αυτό είναι απολύτως συνειδητοποιήσει μεταξύ τα πιο εξελιγμένα θέματα έχουμε κοίταξε. Αλλά είναι από τα πιο ισχυρά. Και όταν το πάρετε, είναι πραγματικά όλα ακριβώς πρόκειται να έρθει τελικά από κοινού. Έτσι, να είστε σίγουροι ότι δεν πρέπει σε όλα τα νεροχύτη στο σήμερα. Έτσι, εδώ είναι το τελευταίο πρόγραμμα θα πάμε να δούμε. Και θα πάμε να καταλήξετε με ένα γρήγορη τρία λεπτά πλαστελίνης έκανε ο φίλος μας, ο Nick Parlante. Εδώ είναι ένα πρόγραμμα, ότι για τα δύο υψηλότερα γραμμές δηλώνει μια μεταβλητή x και y. Και οι δύο από τις οποίες είναι οι διευθύνσεις ακεραίων, γνωστός και ως δείκτες. Εμείς στη συνέχεια κατανέμουν αρκετά μνήμη για την αποθήκευση μιας int και να αποθηκεύσει τη διεύθυνση της μνήμης στο x. Έτσι, είναι ακόμα πιο απλό από το παράδειγμα πριν. Δώστε μου τέσσερα bytes της μνήμης, αυτό είναι το μέγεθος ενός int, και να θέσει σε αυτή τη διεύθυνση x. Αυτή η γραμμή σημαίνει εδώ μεταβείτε στη διεύθυνση του x και να θέσει την έννοια της ζωής, ο αριθμός 42 εκεί. Αλλά αυτή η γραμμή με ανησυχεί. Αστέρι y σημαίνει να πάει στη διεύθυνση του y, και να θέσει τον άτυχο αριθμό 13 εκεί. Γιατί είναι επικίνδυνο, σε αυτό το σημείο στις story-- αν και ταχέως είπε στα τελευταία λεπτά μας here-- γιατί είναι κακό για μένα να πω, πηγαίνετε στη διεύθυνση του y; Κοινό: Δεν έχετε [δεν ακούγεται]. David J. Malan: Δεν έχω βάζετε τίποτα στο y. Έτσι ποια είναι η τιμή του y, σε αυτό το σημείο στην ιστορία; Δεν έχουμε ιδέα. Είναι κάποια αξία σκουπίδια και ούτε γνωρίζουν Binky. Αν θα μπορούσαμε να καταλήξουμε σε αυτή τη σημείωση. [ΑΝΑΠΑΡΑΓΩΓΗ] -Γεια Σου, Binky, ξυπνήστε. Ήρθε η ώρα για το δείκτη διασκέδαση. -Τι είναι αυτό? Μάθετε για τους δείκτες; Ω, Goody. -Λοιπόν, Για να ξεκινήσετε, υποθέτω είμαστε Θα χρειαστείτε ένα ζευγάρι δείκτες. -ΕΝΤΆΞΕΙ. Αυτός ο κωδικός διαθέτει δύο δείκτες η οποία μπορεί να δείξει σε ακέραιους αριθμούς. -Εντάξει, Αλλά βλέπω το δίποντα, αλλά δεν φαίνεται να είναι δείχνοντας οτιδήποτε. -Σωστά. Αρχικά Δείκτες δεν δείχνουν τίποτα. Τα πράγματα που δείχνουν να είναι κάλεσε pointees και συγκρότησή τους είναι ένα ξεχωριστό βήμα. -ΟΗ, Δεξιά, δεξιά. Το ήξερα. Οι pointees είναι ξεχωριστή. Έτσι, πώς να διαθέσει ένα pointee; -Εντάξει, Και αυτό κωδικό διαθέτει η ένα νέο pointee ακέραιος, και αυτό το μέρος σύνολα Χ να επισημάνω σε αυτό. -Γεια Σου, αυτό φαίνεται καλύτερα. Έτσι, βεβαιωθείτε ότι κάνετε κάτι. -Εντάξει, Θα dereference το δείκτη χ να αποθηκεύσετε τον αριθμό σε 42 pointee της. Για αυτό το τέχνασμα, θα χρειαστεί μου μαγικό ραβδί της εύρεση τιμών. -Σας Μαγικό ραβδί της εύρεση τιμών; Χμ, αυτό, αυτό είναι υπέροχο. -Αυτό Είναι ποιος είναι ο κωδικός μοιάζει. Εγώ απλώς θα δημιουργήσει τον αριθμό and-- [POP SOUND] -Γεια Σου, κοίτα εκεί πηγαίνει. Έτσι, κάνει μια dereference για x εξής το βέλος για να αποκτήσετε πρόσβαση pointee του. Σε αυτή την περίπτωση, για την αποθήκευση 42 εκεί. Γεια σου, δοκιμάστε να χρησιμοποιήσετε για να αποθηκεύσετε τον αριθμό 13 μέσα από τον άλλο δείκτη, y. -ΕΝΤΆΞΕΙ. Θα πήγαινε εδώ για να y, και να πάρετε τον αριθμό 13 που έχει συσταθεί. Και στη συνέχεια να λάβει το ραβδί του εύρεση τιμών και just-- [BUZZER ΗΧΟΥ] -ΟΗ, Hey ότι δεν λειτούργησε. Ας πούμε, εεε, Binky, δεν το κάνω σκεφτείτε εύρεση τιμών y είναι μια καλή ιδέα, επειδή τον καθορισμό πάνω στο pointee είναι ένα ξεχωριστό βήμα. Και δεν νομίζω ότι το κάναμε ποτέ. -Hmm, Καλό σημείο. -Ναι, Θα διατεθεί το δείκτη, y, αλλά Εμείς ποτέ δεν θα οριστεί να οδηγεί σε ένα pointee. -Hmm, Πολύ παρατηρητικός. -Γεια Σου, ψάχνετε καλά εκεί, Binky. Μπορείτε να το διορθώσετε, έτσι ώστε y σημεία στην ίδια pointee με το x. -Sure, Μπορώ να χρησιμοποιήσω μαγικό ραβδί μου εκχώρησης δείκτη. -Είναι Ότι πρόκειται να είναι μια πρόβλημα, όπως και πριν; -Όχι, Αυτό δεν αγγίζει τις pointees. Αλλάζει μόνο ένα δείκτη να υποδείξει το ίδιο thing-- [Ξερό ήχο] --as άλλο. -Α κατάλαβα. Τώρα y σημεία στο ίδιο σημείο με το x. Έτσι, περιμένουμε, τώρα y είναι σταθερή. Έχει pointee. Έτσι, μπορείτε να δοκιμάσετε το ραβδί του εύρεση τιμών και πάλι να στείλετε το 13 πάνω. ΟΗ, ΟΚ, εδώ πηγαίνει. -Γεια Σου, κοίτα. Τώρα εύρεση τιμών έργα στην ομάδα. Και επειδή οι δείκτες που μοιράζονται ότι ένα pointee, οι δύο δείτε το 13. -Ναι, Κοινή χρήση, εεε, οτιδήποτε. Έτσι, θα μπορέσουμε να αλλάζουν θέσεις τώρα; -ΟΗ, Κοίτα είμαστε έξω από το χρόνο. -But-- -Ακριβώς Θυμάστε τις τρεις κανόνες δείκτη. Αριθμός 1, η βασική δομή είναι ότι έχετε ένα δείκτη, και επισημαίνει πάνω σε ένα pointee. Αλλά και ο δείκτης pointee είναι ξεχωριστή. Και το κοινό λάθος είναι να δημιουργήσει ένα δείκτη αλλά να ξεχάσετε να δώσετε ένα pointee. Αριθμός 2, δείκτης εύρεση τιμών ξεκινά από το δείκτη και ακολουθεί το βέλος πάνω της για να αποκτήσετε πρόσβαση pointee του. Όπως όλοι γνωρίζουμε, αυτό λειτουργεί μόνο εάν υπάρχει είναι ένα pointee, που το είδος της παίρνει πίσω να αποφανθεί αριθμός 1. Αριθμός 3, δείκτης ανάθεση παίρνει ένα δείκτη και αλλάζει στο σημείο να το pointee ίδιο με κάποιο άλλο δείκτη. Έτσι, μετά την ανάθεση, οι δύο δείκτες θα δείχνουν προς την ίδια pointee, μερικές φορές αυτό ονομάζεται κοινή χρήση. Και αυτό είναι όλα υπάρχει σε αυτό, πραγματικά. Αντίο τώρα. [Σταματήσετε την αναπαραγωγή] David J. Malan: Αυτό είναι για CS50. Χάρη στον καθηγητή Νικ Parlante. Θα σας δούμε την επόμενη εβδομάδα. [ΗΛΕΚΤΡΟΝΙΚΗ μουσική να παίζει]