DAVID MALAN: Γεια σας και καλωσορίσω πίσω στο CS50. Έτσι, αυτό είναι το τέλος των τεσσάρων εβδομάδων. Μόλις μία ανακοίνωση πρώτα. Έτσι, η λεγόμενη πέμπτη Δευτέρα είναι έρχεται την προσεχή Δευτέρα. Αυτή είναι η ευκαιρία να αλλάξει από SAT / ακόρεστων σε ένα γράμμα βαθμού ή από γράμμα βαθμού SAT / ακόρεστων. Ενοχλητικά, αυτή η διαδικασία απαιτεί μια υπογραφή, γιατί θα πρέπει να συμπληρώσετε , μια από τις ροζ add / drop μορφές. Επειδή από τεχνική άποψη, η SAT / ακόρεστων έκδοση και η έκδοση γράμμα βαθμού έχουν διαφορετικές αριθμούς καταλόγου. Αλλά δεν είναι μεγάλη υπόθεση. Μόλις έρθει σε μένα ή στον Rob ή σε Lauren σε οποιοδήποτε σημείο. Ή στείλτε μας email, αν δεν έχετε το είδος των εγγράφων που χρειάζεστε σήμερα, και εμείς θα είναι σίγουρος για να σας βοηθήσει να πάρετε φροντίδα του ότι πριν από τη Δευτέρα. Εντάξει, έτσι και σήμερα - στην πραγματικότητα, υπάρχει ένα κομμάτι της ηχούς. Μπορούμε να τον τόνο μου κάτω από ένα κομμάτι; OK. Έτσι, σήμερα, έχουμε εισαγάγει ένα θέμα γνωστή ως δείκτες. Και εγώ θα παραδεχτώ ότι αυτό είναι ένα από τα πιο πολύπλοκα θέματα που έχουμε την τάση να καλύπτουν σε αυτή την κατηγορία, πραγματικά ή οποιαδήποτε εισαγωγικό μάθημα που χρησιμοποιεί C. Αλλά πάρτε τη λέξη μου για αυτό, ιδιαίτερα Αν το μυαλό σας αισθάνεται λίγο πιο λυγισμένο σήμερα και τις επόμενες εβδομάδες. Δεν είναι αντιπροσωπευτική της να πάρει χειρότερη σε αυτό, σημαίνει απλά ότι είναι ένα ιδιαίτερα εξελιγμένο θέμα που υπόσχομαι, λίγες εβδομάδες Ως εκ τούτου, θα φαίνονται όλα πολύ εντυπωσιακά απλή εκ των υστέρων. Θυμάμαι ακόμα σε αυτήν την ημέρα. Καθόμουν στο Elliott Dining Hall, κάθεται δίπλα TF μου Nishat Mehta, ο οποίος ήταν κάτοικος του Elliott σπίτι. Και για κάποιο λόγο, η παρούσα θέμα χτυπά ακριβώς. Ποια είναι να πω ότι και εγώ αγωνίστηκα με αυτό για κάποιο χρονικό διάστημα, αλλά θα κάνω το καλύτερό μου για να βοηθήσει να αποφύγει οποιαδήποτε τέτοια αγώνα με ένα θέμα που τελικά είναι αρκετά ισχυρό. Στην πραγματικότητα, ένα από τα θέματα που θα συζητήσουμε στις επόμενες εβδομάδες είναι ότι της ασφάλειας, και πώς μπορείτε πραγματικά να εκμεταλλεύονται μηχανές με τρόπους Όμως, δεν είχαν ως στόχο. Και αυτές οι εκμεταλλεύσεις είναι τυπικά το αποτέλεσμα των λαθών σφάλματα, ότι εμείς οι άνθρωποι κάνουν με το να μην την κατανόηση ορισμένων του υποκείμενου υλοποίησης στοιχεία μέσω των οποίων τα προγράμματα γίνονται. Τώρα, για να κάνουν αυτό φαίνεται όλο και περισσότερο στον χρήστη φιλικό, σκέφτηκα ότι θα παίξει 10 δεύτερη προεπισκόπηση λίγο πλαστελίνης φιγούρα που ονομάζεται Binky που έφερε στο ζωή από έναν φίλο μας στο Πανεπιστήμιο του Στάνφορντ, καθηγητής Nick Parlante. Έτσι, επιτρέψτε μου να σας δώσω αυτό teaser της Binky εδώ. [PLAYBACK VIDEO] -Γεια σου, Μπίνκι. Ξυπνήστε. Ήρθε η ώρα για διασκέδαση δείκτη. -Τι είναι αυτό; Μάθετε για δείκτες; Ω, goodie. [PLAYBACK VIDEO END] DAVID MALAN: Αυτό είναι Stanford επιστήμη των υπολογιστών. Έτσι, περισσότερα για αυτό να έρθει. [Χειροκρότημα] DAVID MALAN: Συγγνώμη, Νικ. Έτσι, υπενθυμίζουν ότι η τελευταία φορά που έληξε στις Αυτό πραγματικά συναρπαστικό δραματική στιγμή σύμφωνα με την οποία αυτή η λειτουργία απλά δεν δούλεψε. Τουλάχιστον διαισθητικά, αισθάνθηκε όπως θα πρέπει να λειτουργεί. Απλά αλλάζουν τις τιμές δύο ακεραίων. Αλλά να θυμόμαστε ότι όταν θα εκτυπωθεί η αρχικές τιμές σε βασικά, μιας και δύο, ήταν ακόμα ένα και δύο και όχι μία και δύο. Επιτρέψτε μου λοιπόν να στραφούν στην πραγματικότητα πάνω στη συσκευή. Και έγραψα ένα κομμάτι του σκελετικού κώδικα εκ των προτέρων εδώ, όπου ισχυρίζονται ότι x θα είναι 1, y θα είναι 2. Στη συνέχεια εκτυπώνει δύο τους τιμές με f εκτύπωσης. Στη συνέχεια υποστηρίζουν ότι εδώ κάτω θα πάμε να τους swap. Άφησα ένα κενό σημείο εδώ για μας να συμπληρώστε σήμερα ακριβώς σε μια στιγμή. Στη συνέχεια, Πάω να ισχυρίζονται ότι η Οι δύο μεταβλητές που έχουν ανταλλαχθεί. Στη συνέχεια, Πάω να εκτυπώσετε τα έξω και πάλι. Και έτσι ελπίζω, θα πρέπει να βλέπετε 1, 2. 2, 1. Αυτό είναι το εξαιρετικά απλό Στόχος τώρα. Επομένως, πώς θα πάει για εναλλαγή δύο μεταβλητές; Λοιπόν, αν προτείνω εδώ ότι αυτά τα κύπελλα μπορεί να αντιπροσωπεύει τη μνήμη σε έναν υπολογιστή. Αυτό είναι μερικές δαγκώματα, αυτό είναι ένα άλλο μερικά τσιμπήματα. Θα μπορούσαμε να είχαμε εθελοντής έλα και αναμειγνύεται μας μερικά ποτά, αν γνωρίζει; Ανέβα. Ποιο είναι το όνομά σου; JESS: Jess. DAVID MALAN: Jess; Έλα πάνω, Τζες. Αν δεν σας πειράζει, θα πρέπει να θέσει το Google Glass σε σας ώστε να μπορούμε να απαθανατίσουν αυτό. OK, γυαλί. Καταγράψτε ένα βίντεο. Και Εντάξει, είναι καλό να πάει με Jess εδώ. Εντάξει. Χάρηκα για τη γνωριμία. Έτσι, αυτό που θα ήθελα να κάνω εδώ - αν μπορούσε, πολύ γρήγορα - απλά χύνει μας μισό ποτήρι πορτοκάλι χυμών και μισό ποτήρι γάλα, αντιπροσωπεύουν αποτελεσματικά τους αριθμούς 1 σε ένα φλιτζάνι και 2 στο άλλο κύπελλο. Αυτό πρόκειται να είναι καλές σκηνές. JESS: Συγγνώμη. DAVID MALAN: Όχι, όχι. Είναι εντάξει. Νίκαια. Εντάξει, έτσι έχουμε τέσσερα bytes Αξίζει χυμό πορτοκαλιού. Θα αποκάλεσε την τιμή 1. Τώρα, άλλα τέσσερα bytes αξίας του γάλακτος. Θα το ονομάσουμε τιμή 2. Έτσι, τα Χ και Υ, αντίστοιχα. Εντάξει, τώρα αν το έργο στο χέρι - για σας, Jess, μπροστά σε όλους από τους συμμαθητές σας - είναι να ανταλλάξουν τις τιμές των x και y, όπως ότι θέλουμε το χυμό πορτοκαλιού με το άλλο κύπελλο και το γάλα σε αυτό το κύπελλο, πώς μπορεί να σας - πριν να κάνετε αυτό - πάει για να κάνει αυτό; OK, σοφή απόφαση. Έτσι, θα πρέπει να έχετε λίγο περισσότερη μνήμη. Ας διαθέσει ένα προσωρινό κύπελλο, αν θέλετε. Και τώρα να προχωρήσει για να ανταλλάξουν x και y. Εξαιρετικό. Έτσι, πολύ καλά κάνει. Σας ευχαριστώ πολύ, Τζες. Ορίστε. Ένα μικρό ενθύμιο. Εντάξει, οπότε προφανώς, εξαιρετικά απλή ιδέα. Εντελώς διαισθητικά ότι χρειαζόμαστε λίγο περισσότερο χώρο αποθήκευσης - σε αυτή τη μορφή, ένα φλιτζάνι - εάν θέλουμε πραγματικά να ανταλλάξουν αυτές τις δύο μεταβλητές. Οπότε ας κάνουμε ακριβώς αυτό. Μέχρι εδώ στο μεταξύ εκεί που ισχυρίζονται ότι είμαι πρόκειται να κάνει κάποια εναλλαγή, εγώ θα να προχωρήσει και να κηρύξει temp. Και εγώ θα το θέσει ίσο με, ας πούμε, x. Στη συνέχεια, Πάω να αλλάξετε την τιμή της x όπως ακριβώς Jess έκανε εδώ με το γάλα και χυμό πορτοκάλι να είναι ίσο με το y. Και Πάω να αλλάξει y είναι ίση να μην x, γιατί τώρα θα ήμασταν κολλήσει σε ένα κύκλο, αλλά μάλλον Temp. Εκεί που προσωρινά - ή όταν Jess τεθεί προσωρινά το χυμό πορτοκαλιού πριν clobbering ότι κύπελλο με το γάλα. Έτσι, επιτρέψτε μου να πάει μπροστά τώρα και να κάνουν αυτό. Λέγεται noswap.c. Και τώρα επιτρέψτε μου να τρέξει χωρίς swap. Και πράγματι βλέπω, αν μπορώ να επεκτείνουν το παράθυρο λίγο, ότι το χ είναι 1, το Υ είναι 2. Και τότε το χ είναι 2, το γ είναι 1. Αλλά υπενθυμίζουν ότι τη Δευτέρα κάναμε τα πράγματα λίγο διαφορετικά με την οποία θα αντί να εφαρμόσει μια λειτουργία βοηθός, αν θέλετε, αυτό ήταν στην πραγματικότητα άκυρη. Κάλεσα το swap. Έδωσα δύο παραμέτρους, και κάλεσα τους μια και κάλεσα τους b. Ειλικρινά, θα μπορούσα να τους αποκαλούν x και y. Δεν υπάρχει τίποτα να σταματήσει μου να το κάνει. Αλλά θα έλεγα ότι είναι συνέχεια λίγο ασαφής. Επειδή η ανάκληση για τη Δευτέρα ότι ισχυρίστηκε ότι αυτές οι παράμετροι είχαν αντίγραφα των αξιών πέρασαν μέσα Γι 'αυτό ακριβώς βάζει με σας νου, νομίζω ότι, αν χρησιμοποιείτε ακριβώς τις ίδιες μεταβλητές. Γι 'αυτό θα αντί να καλέσει τους ένα και Β, μόνο για λόγους σαφήνειας. Αλλά θα μπορούσαμε να τους αποκαλούν οι περισσότεροι ό, τι θέλουμε. Και Πάω να αντιγράψετε και να επικολλήσετε αποτελεσματικά αυτός ο κώδικας από εκεί ψηλά κάτω στο εδώ. Επειδή μόλις είδα ότι λειτουργεί. Έτσι ώστε να είναι σε αρκετά καλή κατάσταση. Και θα αλλάξει x μου σε ένα, x μου με a, y μου να β και γ μου σε b. Έτσι, με άλλα λόγια, ακριβώς την ίδια λογική. Το ίδιο ακριβώς πράγμα που Jess έκανε. Και τότε το μόνο πράγμα που έχω να κάνω μέχρι Εδώ, βέβαια, είναι να επικαλεστεί τώρα αυτό λειτουργία, ή να καλέσετε τη συνάρτηση αυτή. Γι 'αυτό και θα καλέσει αυτή τη λειτουργία με δύο εισόδους, x και y, και το χτύπημα Αποθήκευση. Εντάξει, τόσο θεμελιωδώς το ίδιο πράγμα. Στην πραγματικότητα, έχω κάνει πιθανώς το πρόγραμμα άσκοπα περίπλοκες από γράφοντας μια λειτουργία που είναι απλώς πιάνουν περίπου έξι γραμμές κώδικα, ενώ εγώ στο παρελθόν είχε εφαρμόσει αυτό σε μόλις τρεις. Επιτρέψτε μου λοιπόν να προχωρήσει τώρα και remake αυτό, δεν κάνουν swap. Εντάξει, έχω μαντάρα εδώ. Αυτό πρέπει να είναι ένα λάθος που ίσως δείτε όλο συνήθως ως σας προγράμματα γίνονται πιο πολύπλοκα. Αλλά υπάρχει μια εύκολη λύση. Επιτρέψτε μου να μετακινηθείτε προς τα πίσω μέχρι εδώ. Και ποιο είναι το πρώτο λάθος που βλέπω; Σιωπηρή δήλωση. Τι σημαίνει ότι συνήθως υποδηλώνει; Α, ξέχασα το πρωτότυπο. Ξέχασα να διδάξει τον compiler ότι η ανταλλαγή πρόκειται να υφίστανται έστω και αν ο ίδιος δεν υπάρχει στην αρχή του προγράμματος. Έτσι, είμαι απλώς πρόκειται να πω άκυρη, swap, int, ένας int b, τελεία. Έτσι, δεν είμαι πρόκειται να το Νέα υλοποίηση. Αλλά τώρα ταιριάζει με αυτό που είναι εδώ κάτω. Και ανακοίνωση, η απουσία ερωτηματικό εδώ, η οποία δεν είναι απαραίτητη όταν εφαρμογής. Έτσι, επιτρέψτε μου να ξανακάνω αυτό, δεν κάνουν swap. Πολύ καλύτερη κατάσταση. Εκτελέστε κανένα swap. Και γαμώτο. Τώρα είμαστε πίσω στο σημείο που ήταν τη Δευτέρα, όπου το πράγμα δεν ανταλλάξουν. Και ποια είναι η διαισθητική εξήγηση για το γιατί συμβαίνει αυτό; Ναι; ΦΟΙΤΗΤΗΣ: [δεν ακούγεται]. DAVID MALAN: Ακριβώς. Έτσι, α και b είναι αντίγραφα των x και y. Και στην πραγματικότητα, κάθε φορά που έχετε καλώντας μία συνάρτηση του μέχρι στιγμής ότι περνά μεταβλητές όπως ints - ακριβώς όπως το swap περιμένει εδώ - εσείς έχουν περνώντας σε αντίγραφα. Τώρα αυτό σημαίνει ότι παίρνει λίγο του χρόνου, ένα κλάσμα του δευτερολέπτου, για την υπολογιστή για να αντιγράψετε τα κομμάτια από το ένα μεταβλητή σε τα δυαδικά ψηφία του άλλου. Αλλά αυτό δεν είναι μια τέτοια μεγάλη υπόθεση. Αλλά είναι παρ 'όλα αυτά ένα αντίγραφο. Και έτσι και τώρα, στο πλαίσιο της ανταλλαγής, Είμαι στην πραγματικότητα με επιτυχία αλλαγή ενός και b. Στην πραγματικότητα, ας κάνουμε μια γρήγορη λογική έλεγχο. Στ Εκτύπωση είναι% i, νέα γραμμή. Και plug ας σε ένα αρχείο. Τώρα ας κάνουμε το ίδιο πράγμα με το b. Και ας κάνουμε το ίδιο πράγμα εδώ. Και τώρα, επιτρέψτε μου να αντιγράψετε τις ίδιες γραμμές και πάλι στο κάτω μέρος της συνάρτησης μετά από τρεις γραμμές μου ενδιαφέροντα θα μπορούσε να εκτελεστεί, και εκτύπωση a και b για άλλη μια φορά. Έτσι, τώρα ας κάνουν αυτό, δεν κάνουν swap. Επιτρέψτε μου να κάνω το παράθυρο τερματικού α λίγο ψηλότερα, έτσι ώστε να μπορούμε να δούμε περισσότερο από αυτό ταυτόχρονα. Και δεν διατρέχουν κανέναν swap. το χ είναι 1, το Υ είναι 2. α είναι 1, το b είναι 2. Και στη συνέχεια, το α είναι 2, το b είναι 1. Γι 'αυτό λειτουργεί, όπως ακριβώς Jess έκανε εδώ μέσα swap. Αλλά φυσικά, αυτό είναι που έχουν καμία επίδραση σχετικά με τις μεταβλητές σε κύριες. Έτσι, είδαμε ένα τέχνασμα το οποίο μπορούμε θα μπορούσε να το διορθώσετε αυτό, έτσι δεν είναι; Όταν είστε αντιμέτωποι με αυτή την οριοθέτηση του πεδίου εφαρμογής θέμα, θα μπορούσατε απλά να punt και να κάνει x και y το είδος των μεταβλητών αντ 'αυτού; Θα μπορούσατε να τους παγκόσμια. Βάλτε τους στην κορυφή του αρχείου όπως κάναμε, ακόμη και στο παιχνίδι του 15. Χρησιμοποιούμε μια καθολική μεταβλητή. Αλλά στο πλαίσιο του παιχνιδιού 15, είναι λογικό να έχουμε μια παγκόσμια μεταβλητή που αντιπροσωπεύει το διοικητικό συμβούλιο, διότι το σύνολο των 15.c είναι όλα για την εφαρμογή του εν λόγω παιχνιδιού. Αυτό είναι ό, τι το αρχείο υπάρχει να κάνει. Αλλά σε αυτήν την περίπτωση εδώ, είμαι καλώντας μια ανταλλαγή λειτουργία. Θέλω να ανταλλάξουν δύο μεταβλητές. Και θα πρέπει να αρχίσετε να αισθάνεστε λίγο ατημέλητη Εάν το διάλυμα σε όλα μας προβλήματα όταν τρέχει σε πεδίο ζητήματα είναι να είναι παγκόσμια. Επειδή πολύ γρήγορα το πρόγραμμά μας είναι πρόκειται να γίνει αρκετά ένα χάος. Και το κάναμε αυτό με μεγάλη φειδώ ως αποτέλεσμα 15.c. Αλλά αποδεικνύεται ότι υπάρχει μια καλύτερο τρόπο εντελώς. Επιτρέψτε μου να πραγματικά να πάμε πίσω και να διαγράψετε το εκτύπωση της f, απλά για να απλοποιήσει τον κωδικό αυτό. Και επιτρέψτε μου να προτείνω Αυτό, πράγματι, είναι κακή. Αλλά αν αντί να προσθέσετε σε κάποια αστερίσκους και τα αστέρια, μπορώ να γυρίσει αντί για αυτό λειτουργία σε ένα που είναι πραγματικά λειτουργική. Έτσι, επιτρέψτε μου να επιστρέψω εδώ και να παραδεχτούμε λέγοντας αστερίσκους είναι πάντοτε δύσκολη, γι 'αυτό θα πω αστέρια. Εγώ απλώς θα fess μέχρι εκείνο το ένα. Εντάξει. Και τώρα, τι θα πάω να κάνει αντ 'αυτού; Έτσι, πρώτα απ 'όλα, Πάω να καθορίσετε ότι αντί να διέρχεται μια int σε η λειτουργία εναλλαγής, είμαι αντ 'αυτού της πρόκειται να πω int αστέρι. Τώρα, τι κάνει το αστέρι αναφέρει; Αυτή είναι η έννοια του δείκτη που Binky, ο χαρακτήρας claymation, ήταν αναφερόμενος σε μια στιγμή πριν. Έτσι, αν λέμε int αστέρι, η έννοια της Αυτό είναι τώρα ότι δεν πρόκειται να πέρασε από την τιμή του. Δεν πρόκειται να αντιγραφεί μέσα Αντίθετα, η διεύθυνση του a είναι πρόκειται να περάσει μέσα Έτσι υπενθυμίσουμε ότι στο εσωτερικό του υπολογιστή σας Είναι ένα σωρό μνήμη, αλλιώς γνωστή ως μνήμη RAM. Και ότι η μνήμη RAM είναι απλά μια σωρό bytes. Έτσι, αν το Mac ή το PC σας έχει δύο gigabytes, έχετε 2 δισεκατομμύριο bytes της μνήμης. Τώρα, ας υποθέσουμε ότι ακριβώς για να κρατήσει τα πράγματα ωραία και ομαλή, μπορούμε εκχωρήσετε μια διεύθυνση - ένας αριθμός - σε κάθε byte της μνήμης RAM στον υπολογιστή σας. Το πρώτο byte αυτών των 2 δισ. ευρώ είναι με αριθμό μηδέν. Το επόμενο byte είναι νούμερο ένα, νούμερο δύο, σε όλη τη διαδρομή επάνω, dot dot dot, με περίπου 2 δισ. ευρώ. Έτσι, μπορείτε να τον αριθμό των bytes της μνήμης στον υπολογιστή σας. Ας υποθέσουμε ότι αυτό είναι ό, τι εννοούμε με μια διεύθυνση. Έτσι, όταν βλέπω αστέρι int a, τι συμβαίνει να περάσει σε ανταλλαγή τώρα είναι η διεύθυνση της a. Δεν έχει την αξία του, αλλά ό, τι ταχυδρομικών της διεύθυνσης είναι, να το πω έτσι - θέση του στη RAM. Και ομοίως για b, Πάω να πούμε το ίδιο πράγμα. Int, αστέρι, b. Ως μέρος, από τεχνική άποψη το αστέρι θα μπορούσε να πάει σε άλλες τοποθεσίες. Αλλά θα τυποποιήσουν το αστέρι είναι ακριβώς δίπλα από τον τύπο δεδομένων. Έτσι ανταλλάξουν υπογραφή σημαίνει τώρα, να μου δώσει η διεύθυνση ενός int και η κλήση που αναφέρονται σε ένα. Και να μου δώσει άλλη διεύθυνση του εξουσιοδοτημένου int και να καλέσετε ότι η Β διεύθυνσης. Αλλά τώρα τον κωδικό μου εδώ πρέπει να αλλάξει. Διότι, αν δηλώνω int temp - η οποία εξακολουθεί να είναι τύπου int - αλλά έχω αποθηκεύσει σε ένα, τι είδους σχέση; Για να είμαι σαφής, είμαι θέτοντας ένα με ο κώδικας όπως γράφεται τώρα; Βάζω την τοποθεσία σε ένα αρχείο. Αλλά εγώ δεν νοιάζονται για το θέση τώρα, έτσι δεν είναι; Θερμοκρασία υπάρχει μόνο τρίτο κύπελλο Jess » υπήρχε, για ποιο σκοπό; Για να αποθηκεύσετε μια τιμή. Γάλα ή χυμό πορτοκαλιού. Για να μην αποθηκεύουν στην πραγματικότητα τη διεύθυνση του κανένα από αυτά τα πράγματα, τα οποία αισθάνεται λίγο παράλογο σε αυτό το πραγματικό παγκόσμιο πλαίσιο ούτως ή άλλως. Έτσι, πραγματικά, αυτό που θέλω να θέσει σε temp δεν είναι η διεύθυνση της α, αλλά ο περιεχόμενα ενός αρχείου. Έτσι, αν το α είναι ένας αριθμός όπως 123, αυτό είναι η 123η byte της μνήμης ότι μια δίκαιη συμβαίνει να είναι κατοχική, ότι η αξία σε ένα συμβαίνει να είναι κατοχική. Αν θέλω να πάω σε αυτή τη διεύθυνση, Θέλω να πω ένα αστέρι. Παρομοίως, εάν επρόκειτο να αλλάξει ό, τι είναι στη διεύθυνση Α, μπορώ να αλλάξω Αυτό για να ξεκινήσετε μια. Αν θέλω να αποθηκεύουν σε ό, τι είναι στο θέση ένα με ό, τι υπάρχει στο σημείο στο b, b αστέρι αστέρι. Έτσι, εν ολίγοις, έστω και αν αυτό δεν είναι αρκετά βυθίζεται σε ακόμη - και δεν θα περίμενε ότι θα ήταν τόσο γρήγορα - συνειδητοποιούν ότι το μόνο που κάνω είναι πρόθεμα αυτά τα αστέρια σε μεταβλητές μου, ρητό δεν αρπάξει τις τιμές. Μην αλλάξετε τις τιμές. Αλλά μάλλον, να πάει σε αυτές τις διευθύνσεις και να πάρει την τιμή. Πηγαίνετε σε αυτή τη διεύθυνση και την αλλαγή η αξία εκεί. Έτσι, τώρα επιτρέψτε μου να μετακινηθείτε προς τα πίσω μέχρι την κορυφή, μόνο για να καθορίσει αυτή τη γραμμή εδώ, για να αλλάξετε το πρωτότυπο για να ταιριάζει. Αλλά τώρα πρέπει να κάνουμε ένα άλλο πράγμα. Διαισθητικά, αν έχω αλλάξει τους τύπους των επιχειρημάτων που ανταλλαγής αναμένει, Τι άλλο πρέπει να κάνω για να αλλαγή στον κώδικά μου; Όταν καλώ swap. Διότι αυτή τη στιγμή, αυτό που είμαι I περνώντας να ανταλλάξουν ακόμα; Η τιμή x και η τιμή του y, ή το γάλα και το χυμό πορτοκαλιού. Αλλά δεν θέλω να το κάνω αυτό. I αντί να θέλουν να περάσουν σε ό, τι; Η θέση του χ και η θέση του y. Ποιες είναι οι ταχυδρομικές διευθύνσεις τους, να το πω έτσι. Για να συμβεί αυτό, υπάρχει ένα σύμβολο. Ampersand είδος των ήχων όπως η διεύθυνση. έτσι n, ampersand, η διεύθυνση του x, καθώς και η διεύθυνση του y. Έτσι είναι σκόπιμη που χρησιμοποιούμε συμπλεκτικά σύμβολα όταν καλείτε τη λειτουργία, και τα αστέρια κατά τη δήλωση και πότε εφαρμογή της συνάρτησης. Και σκεφτείτε εμπορικό και το διεύθυνση του φορέα εκμετάλλευσης, και το αστέρι, όπως η εκεί φορέα - ή, πιο σωστά, η χειριστή dereference. Έτσι, αυτό είναι ένα σωρό λέξεις μόνο για να πω ότι τώρα, ελπίζω, το swap θα να είναι σωστή. Επιτρέψτε μου να προχωρήσει και να κάνει - ας μετονομάσετε πραγματικά το αρχείο, μήπως Το πρόγραμμα αυτό εξακολουθεί να ονομάζεται δεν swap. Ισχυρίζομαι ότι θα τον λέμε swap.c τώρα. Έτσι κάνετε, swap. Dot, slash, swap. Και τώρα πράγματι, το χ είναι 1, το Υ είναι 2. Και στη συνέχεια, το χ είναι 2, το γ είναι ένα. Λοιπόν ας δούμε αν δεν μπορούμε να κάνουμε αυτή την λίγο διαφορετικά ως προς το τι είναι συμβαίνει εδώ. Κατ 'αρχάς, επιτρέψτε μου να κάνετε ζουμ σε μας αντλώντας οθόνη εδώ. Και επιτρέψτε μου να προτείνω για μια στιγμή - και κάθε φορά που ήθελα να επιστήσω εδώ θα πρέπει να αντικατοπτρίζεται εκεί τώρα - επιτρέψτε μου να προτείνω εδώ είναι ένα σωρό της μνήμης, ή RAM, στο εσωτερικό του υπολογιστή μου. Και αυτό θα είναι ο αριθμός δάγκωμα, ας πούμε, 1. Αυτό θα είναι bytes αριθμό 2. Και θα κάνω ένα σωρό άλλα, και τότε μια δέσμη των dot τελείες dot να δείχνουν ότι υπάρχει 2 δισ. από αυτά τα πράγματα. 4, 5, και ούτω καθεξής. Έτσι, υπάρχουν τα πρώτα πέντε bytes της μνήμης του υπολογιστή μου. Εντάξει; Πολύ λίγοι από 2 δισ. ευρώ. Αλλά τώρα είμαι πρόκειται να προτείνει η ακόλουθη. Πάω να προτείνω x πρόκειται να αποθηκεύσει τον αριθμό 1, και y πρόκειται να αποθηκεύσετε τον αριθμό 2. Και επιτρέψτε μου να προχωρήσει τώρα και αντιπροσωπεύει οι τιμές αυτές ως εξής. Ας το κάνουμε ως εξής. Δώσε μου ένα δευτερόλεπτο. Ένα δευτερόλεπτο. OK. Θέλω να κάνω αυτό το λίγο - ας το κάνουμε πάλι. Διαφορετικά Πάω να και τη χρήση του ίδιους αριθμούς, άθελά τους, πολλές φορές. Έτσι ακριβώς έτσι έχουμε διαφορετικούς αριθμούς για να μιλήσουμε για, ας ονομάσουμε αυτό byte αριθμό 123, 124, 125, 126, και dot dot dot. Και επιτρέψτε μου να ισχυρίζονται τώρα ότι είμαι πρόκειται να θέσει την τιμή 1 εδώ, και την τιμή 2 εδώ, αλλιώς γνωστή ως x και y. Έτσι, αυτό ακριβώς συμβαίνει, έτσι ώστε Αυτό είναι x, y αυτό είναι. Και μόνο από κάποιο τυχαίο, η υπολογιστή, το λειτουργικό σύστημα, συνέβη να βάλει στη θέση x αριθμό 123. Και y καταλήξαμε στη θέση 124 - γαμώτο. Θα έπρεπε να καθοριστεί αυτό. Ω άνθρωπος, θέλω πραγματικά να το κάνετε αυτό; Ναι, θέλω να διορθώσω αυτό και β κατάλληλη γι 'αυτό σήμερα. Δυστυχώς, νέος σε αυτό. 127, 131, και δεν ήθελα να είναι αυτό πολύπλοκες, αλλά γιατί δεν μπορώ να αλλάξω το αριθμοί είναι εκεί; Επειδή θέλω να τα ints στην πραγματικότητα είναι τέσσερα bytes. Οπότε ας είναι σούπερ πρωκτικό γι 'αυτό. Έτσι ώστε αν συμβεί 1 που πρέπει να αντιμετωπιστούν 123, το 2, πρόκειται να είναι στη διεύθυνση 127 γιατί είναι μόλις 4 αποχαιρετισμός μακριά. Αυτό είναι όλο. Και θα ξεχάσουμε όλα τα άλλες διευθύνσεις στον κόσμο. Έτσι, το χ είναι στην θέση 123, γ είναι στη θέση 127. Και τώρα, τι μπορώ να κάνω πραγματικότητα θέλετε να κάνετε; Όταν καλώ ανταλλαγής τώρα, τι είναι πραγματικά συμβαίνει; Λοιπόν, όταν καλώ swap, είμαι περνώντας τη διεύθυνση των χ και η διεύθυνση του y. Έτσι, για παράδειγμα, εάν αυτά τα δύο τεμάχια χαρτιού αντιπροσωπεύουν σήμερα τα δύο επιχειρήματα α και β να ανταλλάξουν, τι είμαι πρόκειται να γράψω για το πρώτο από αυτά, που Πάω να καλέσω αναφέρονται ως ένα; Ακριβώς, 123. Έτσι, αυτό που ισχυρίζονται είναι ένα. Αυτή είναι η παράμετρος a. Βάζω την διεύθυνση του x εκεί. Τι είναι αυτό; Τι είναι αυτό; Όχι, όχι. Αυτό είναι εντάξει. Ακόμα καλό, εξακολουθεί να είναι καλή. Έτσι, αυτό είναι ένα. Και τώρα για το δεύτερο κομμάτι χαρτί, Αυτό πρόκειται να είναι b, και τι είμαι εγώ πρόκειται να εγγράφως σχετικά με αυτό το κομμάτι χαρτί; 127. Έτσι, το μόνο πράγμα που έχει αλλάξει από προηγούμενη αφήγηση μας από αυτή την ιστορία είναι, όχι κυριολεκτικά 1 και 2, είμαι πρόκειται να περάσει το 123 και το 127. Και είμαι τώρα πρόκειται να θέσει αυτά τα μέσα από αυτό το κουτί, εντάξει; Έτσι ώστε μαύρο κουτί αντιπροσωπεύει τώρα η λειτουργία εναλλαγής. Εν τω μεταξύ, ας ρίξουμε τώρα κάποιος εφαρμόσουν τη λειτουργία εναλλαγής. Θα μπορούσε κάποιος εδώ επιθυμούσατε να προσφέρετε εθελοντικά; Ανέβα. Ποιο είναι το όνομά σου; Τσάρλι. Εντάξει, Τσάρλι. Ανέβα. Έτσι, ο Τσάρλι πρόκειται να παίξει ο ρόλος του μαύρου κουτιού μας. Και ο Τσάρλι, τι θα ήθελα να κάνω τώρα είναι να εφαρμόσει ανταλλαγής με τέτοιο τρόπο ότι, δεδομένου οι δύο διευθύνσεις, θα ήταν στην πραγματικότητα πρόκειται να αλλάξετε τις τιμές. Και εγώ θα ψιθυρίσω στο αυτί σας πώς να τρέξει την τηλεόραση εδώ. Έτσι προχωρήστε, και είσαι το μαύρο κουτί. Φτάσετε εκεί. Ποιες αξίες βλέπετε για μια, και ποιες αξίες βλέπεις για το β? CHARLIE: α είναι 123 και το b είναι 127. DAVID MALAN: OK, ακριβώς. Τώρα παύση εκεί για μια στιγμή. Το πρώτο πράγμα που πρόκειται να κάνουμε τώρα, σύμφωνα με τον κώδικα - η οποία Θα τραβήξει μέχρι τώρα στην οθόνη - θα είναι να διαθέσει λίγο κομμάτι της μνήμης που ονομάζεται temp. Έτσι, Πάω να προχωρήσει και να σας δώσει ότι μνήμης. Έτσι, αυτό πρόκειται να είναι μια τρίτη μεταβλητή ότι έχετε πρόσβαση καλέσατε temp. Και τι πρόκειται να γράψω στο κομμάτι θερμοκρασία του χαρτιού; CHARLIE: Δείκτες, έτσι δεν είναι; DAVID MALAN: Εντάξει, δεν είναι καλά κατ 'ανάγκην δείκτες. Έτσι, η γραμμή του κώδικα που έχω τονίζεται στη δεξιά πλευρά, ας ξεκινήσουμε από εκεί. Λέει ένα αστέρι. Έτσι, ένα είναι επί του παρόντος την αποθήκευση ο αριθμός 123. Και μόνο διαισθητικά, τι έκανε αστέρων 123 σημαίνει; Αλλά ειδικά, εάν α είναι 123, ένα αστέρι σημαίνει τι; Η τιμή του a. Ή πιο άνετα, πάω εκεί. Έτσι, επιτρέψτε μου να προτείνω ότι, κρατώντας το ένα στο το χέρι σας, να προχωρήσει και να αντιμετωπίζει αυτό το σαν να είναι ένας χάρτης. Και τον εαυτό σας με τα πόδια πάνω στον υπολογιστή μνήμης, και μας βρείτε ό, τι είναι στη θέση 123. Ακριβώς. Έτσι βλέπουμε στη θέση 123 είναι αυτό, προφανώς; Εντάξει, έτσι τι αξία πλέον είσαι πρόκειται να τεθεί σε temp; Ακριβώς. Έτσι προχωρήστε και να το κάνουμε αυτό. Και γράψτε τον αριθμό 1 για το κομμάτι του το χαρτί που είναι επί του παρόντος με τίτλο temp. Και τώρα το επόμενο βήμα που θα πάμε να εφαρμόσει πρόκειται να είναι αυτό. Λοιπόν, στη δεξιά πλευρά του επόμενη γραμμή κώδικα είναι αστέρι b. Β, του Φυσικά, αποθηκεύει μια διεύθυνση. Ότι οι διευθύνσεις 127. Star B σημαίνει αυτό, ανέμελα μιλώντας; Πηγαίνετε σε αυτήν τη θέση. Έτσι προχωρήστε και να μας βρείτε τι είναι στη θέση 127. OK. Φυσικά, στη θέση 127, εξακολουθεί να είναι η τιμή 2. Λοιπόν, τι θα πας τώρα στο κατάστημα Όποια και αν είναι σε θέση σε ένα; Έτσι αστέρι μέσο μεταβείτε στη θέση ενός. Ποια είναι η θέση ένα; Ακριβώς. Έτσι τώρα, αν θέλετε να αλλάξετε τι είναι σε αυτή τη θέση - Θα πάω μπροστά και να τρέξει Η γόμα είναι εδώ. Και βάζουμε τώρα πίσω στο πινέλο. Τι αριθμό θα πας να γράψετε σε αυτό το κενό πλαίσιο τώρα; Ακριβώς. Έτσι, αυτή η γραμμή του κώδικα, να είναι σαφές - αφήστε Θέλω να διακόψω τι Τσάρλυ κάνουν και επισημάνω εδώ, τι ακριβώς γίνεται είναι γράφουν στο κουτί στη θέση 123 η τιμή που ήταν προηγουμένως σε b. Και έτσι έχουμε τώρα υλοποιούνται όντως Αυτή η δεύτερη γραμμή του κώδικα. Τώρα, δυστυχώς, δεν υπάρχει ακόμα μια γραμμή που απομένουν. Τώρα τι είναι temp, κυριολεκτικά; Είναι προφανές ότι το νούμερο ένα. Αυτό δεν είναι μια διεύθυνση. Είναι απλά ένας αριθμός, το είδος των μια μεταβλητή από την πρώτη εβδομάδα. Και τώρα, όταν λέτε αστέρι b, αυτό σημαίνει ότι πηγαίνετε στο Β διεύθυνση, η οποία είναι Φυσικά εδώ. Έτσι, τη στιγμή που θα φτάσετε εκεί - Θα πάω μπροστά και να διαγράψει ό, τι είναι στην πραγματικότητα εκεί - και τι είσαι πρόκειται να γράψω τώρα στο 127 θέση; CHARLIE: Θερμοκρασία, η οποία είναι μία. DAVID MALAN: Temp, το οποίο είναι ένα. Και τι συμβαίνει με temp στο τέλος; Λοιπόν, πραγματικά δεν ξέρω. Εμείς δεν ενδιαφέρονται πραγματικά. Κάθε φορά που έχουμε εφαρμόσει μια λειτουργία μέχρι σήμερα, κάθε τοπικές μεταβλητές που έχετε είναι πράγματι τοπικό. Και απλά εξαφανίζονται. Είναι ανακτηθεί από το λειτουργικό σύστημα τελικά. Έτσι, το γεγονός ότι η θερμοκρασία εξακολουθεί να έχει το τιμή 1 είναι είδος θεμελιωδώς πληκτικός μας. Εντάξει, έτσι ώστε το χειροκρότημά του αν μπορούσαμε για τον Charlie. Πολύ καλά κάνει. Εντάξει, έτσι τι κάνει περισσότερα Αυτό σημαίνει ότι μπορούμε να κάνουμε; Έτσι, αποδεικνύεται ότι έχουμε ήδη λέει μερικά λευκά ψέματα για αρκετό καιρό. Πράγματι, αποδεικνύεται ότι μια σειρά, όλα αυτού του χρόνου, δεν είναι πραγματικά ένα ακολουθία χαρακτήρων per se. Το είδος του είναι ότι διαισθητικά. Αλλά από τεχνική άποψη, η σειρά είναι τύπο δεδομένων που δηλώνονται μέσα από το CS50 βιβλιοθήκη για να απλοποιήσει τον κόσμο για τις πρώτες λίγες εβδομάδες της κατηγορίας. Τι string είναι πραγματικά η διεύθυνση ενός χαρακτήρα κάπου στη RAM. Ένα string είναι πραγματικά ένας αριθμός, όπως 123 ή 127, που συμβαίνει να οριοθετήσει όπου μια σειρά ξεκινά μνήμη του υπολογιστή σας. Αλλά αυτό δεν αντιπροσωπεύει το συμβολοσειρά, per se, μόνη της. Και μπορούμε να δούμε αυτό ως εξής. Επιτρέψτε μου να προχωρήσει και να ανοίξει ο κώδικας που υπάρχει μεταξύ των πηγή σήμερα παραδείγματα κώδικα. Και Πάω να πάει μπροστά και να ανοίξει up, ας πούμε, να συγκρίνουν-0.c. Αυτό είναι ένα buggy πρόγραμμα που πρόκειται να εφαρμοστεί ως εξής. Πρώτον. Πάω να πω κάτι. Στη συνέχεια, Πάω να προχωρήσει και πάρετε μια σειρά από τον χρήστη σε αυτό επόμενη γραμμή. Στη συνέχεια, Πάω να το πω και πάλι. Στη συνέχεια, Πάω να πάρετε ένα άλλο συμβολοσειρά από το χρήστη. Και ανακοίνωση, δείχνω ένα από τα χορδές σε μια μεταβλητή που ονομάζεται s, και άλλη από αυτές τις χορδές σε μια μεταβλητή ονομάζεται t. Και τώρα πάω να διεκδικήσει, πολύ ευλόγως, ότι αν s ισούται ισούται με t, οι χορδές είναι το ίδιο. Πληκτρολογείτε το ίδιο πράγμα. Αλλιώς, είναι οι χορδές δεν είναι το ίδιο πράγμα. Μετά από όλα, αν είσοδο δύο ints, δύο χαρακτήρες, δύο πλωτήρες, δύο δίκλινα, οποιοδήποτε από τους τύπους δεδομένων που έχουμε μιλήσει για μέχρι στιγμής να τα συγκρίνει - ανάκληση κάναμε πολύ σαφές πριν από λίγο καιρό ότι δεν το κάνετε αυτό, επειδή ένα ενιαία ίσον είναι φυσικά ο φορέας ανάθεσης. Έτσι, αυτό θα ήταν ένα bug. Χρησιμοποιούμε την ίση ίσον, η οποία μάλιστα συγκρίνει πράγματα για την πραγματική ισότητα. Αλλά εγώ ισχυρίζονται ότι αυτό είναι προβληματικό. Αν πάω μπροστά και να συγκρίνουν το μηδέν, και στη συνέχεια κάντε dot κάθετο συγκρίνουν το μηδέν. Και τύπου Ι σε, ας πούμε, γεια. Και τότε ας πούμε γεια και πάλι. Κυριολεκτικά το ίδιο πράγμα, ο υπολογιστής ισχυρισμοί θα πληκτρολογήσει διαφορετικά πράγματα. Τώρα, ίσως πληκτρολογήσατε λάθος κάτι. Θα πληκτρολογήστε το όνομά μου αυτή τη φορά. Θέλω να πω, γεια σου. Γεια σας. Είναι διαφορετικό κάθε φορά. Λοιπόν, γιατί συμβαίνει αυτό; Τι πραγματικά συμβαίνει κάτω από την κουκούλα; Λοιπόν, τι πραγματικά συμβαίνει κάτω η κουκούλα είναι η σειρά στη συνέχεια I δακτυλογραφημένα σε εκείνη την πρώτη φορά, για παράδειγμα, είναι η λέξη γειά σου, φυσικά. Αλλά αν εμείς εκπροσωπούμε αυτό κάτω η κουκούλα, υπενθυμίζουν ότι μια συμβολοσειρά είναι σε μία συστοιχία. Και έχουμε πει όσο στο παρελθόν. Έτσι, αν ήθελα να επιστήσω ότι η σειρά όπως αυτό, είμαι πρόκειται να αντιπροσωπεύει κάτι πολύ παρόμοιο με αυτό που κάναμε πριν από λίγο. Και υπάρχει πραγματικά κάτι ειδικά εδώ, πάρα πολύ. Τι έχουμε διαπιστώσει ήταν σε στο τέλος κάθε σειράς; Ναι, αυτό το μηδέν backslash, η οποία είναι ακριβώς ο τρόπος που εκπροσωπούν, κυριολεκτικά, 00000000. Οκτώ 0 bits σε μια σειρά. Δεν ξέρω, ειλικρινά, τι μετά από αυτό. Αυτό είναι απλά ένα μάτσο περισσότερη μνήμη RAM στο εσωτερικό του υπολογιστή μου. Αλλά αυτό είναι ένας πίνακας. Μιλήσαμε για τους πίνακες πριν. Και εμείς συνήθως μιλάμε για συστοιχίες ως θέση μηδέν, τότε, στη συνέχεια, δύο. Αλλά αυτό είναι μόνο για λόγους ευκολίας. Και αυτό είναι πολύ σχετική. Όταν είστε πραγματικά να πάρει μνήμης από ο υπολογιστής, είναι φυσικά οποιαδήποτε 2 δισ. κάποιο περίεργο bytes, ενδεχομένως. Έτσι, πραγματικά κάτω από το καπό, όλο αυτό το διάστημα, ναι. Αυτό θα μπορούσε κάλλιστα να είναι μηδέν βραχίονα. Αλλά αν σκάψει ακόμη βαθύτερα κάτω η κουκούλα, αυτό είναι πραγματικά Αριθμός 123. Αυτή είναι η διεύθυνση 124. Αυτή είναι η διεύθυνση 125. Και εγώ δεν βίδα μέχρι αυτή τη φορά. Αυτά είναι τώρα ένα bytes Εκτός για ποιο λόγο; Πόσο μεγάλη είναι μια χαρα; Μια χαρα είναι μόνο ένα byte. Ένας int είναι συνήθως τέσσερα bytes. Έτσι, γι 'αυτό έκανα 123, 127, 131 και ούτω καθεξής. Τώρα μπορώ να κρατήσω τα μαθηματικά απλούστερη και να κάνουν ακριβώς συν 1. Και αυτό είναι τώρα τι πραγματικά συμβαίνει για κάτω από το καπό. Έτσι, όταν δηλώνουν κάτι τέτοιο, συμβολοσειρά s, αυτό είναι πραγματικά - αποδεικνύεται - char αστέρων. Star, φυσικά, σημαίνει διεύθυνση, γνωστός και ως δείκτη. Έτσι είναι η διεύθυνση του κάτι. Ποια είναι η διεύθυνση της; Καλά - Είμαι ο μόνος που μπορεί να δει το πολύ σημαντικό σημείο που κάνω, ή νομίζετε Είμαι κάνει. Έτσι κορδόνι - το λυπηρό είναι ότι έχω μια οθόνη εκεί όπου θα μπορούσε να δει ότι. Εντάξει, έτσι εγχόρδων s είναι ό, τι Έχω δηλώσει στο παρελθόν. Αλλά αποδεικνύεται, χάρη σε μια μικρή μαγεία στη βιβλιοθήκη CS50, όλα αυτά εγχόρδων του χρόνου έχει κυριολεκτικά ήταν char αστέρων. Το αστέρι σημαίνει και πάλι δείκτη ή διεύθυνση. Το γεγονός ότι είναι το πλευρίζουν λέξη char σημαίνει ότι είναι η διεύθυνση ενός χαρακτήρα. Έτσι, αν πάρει σειρά ονομάζεται, και πληκτρολογήστε στην H-Ε-L-L-O, προτείνει τώρα τι έχει να εγχόρδων κυριολεκτικά την επιστροφή όλων των αυτή τη φορά, ακόμα κι αν έχουμε μάλλον υπεραπλουστευμένη τον κόσμο; Τι σημαίνει να πάρει χορδών επιστρέφει ως τιμή επιστροφής της; 123 σε αυτή την περίπτωση, για παράδειγμα. Έχουμε ήδη πει ότι παίρνουν σειρά απλά επιστρέφει ένα string, μια ακολουθία χαρακτήρων. Αλλά αυτό είναι ένα κομμάτι από ένα λευκό ψέμα. Ο τρόπος για να πάρει σειρά λειτουργεί πραγματικά κάτω από την κουκούλα είναι ότι παίρνει ένα συμβολοσειρά από το χρήστη. Είναι plops τους χαρακτήρες που αυτός ή αυτή τύπων στη μνήμη. Θα πρέπει να θέσει ένα μηδενικό κάθετος στο τέλος εκείνων ακολουθία χαρακτήρων. Αλλά τότε τι να πάρει σειρά κυριολεκτικά επιστρέψει; Επιστρέφει στην κυριολεξία τη διεύθυνση του πρώτα bytes στην μνήμη RAM που που χρησιμοποιείται για την εν λόγω δύναμη. Και αποδεικνύεται ότι μόνο με την επιστροφή μια ενιαία διεύθυνση της πρώτο χαρακτήρα της συμβολοσειράς, που είναι επαρκείς για την εύρεση το σύνολο των το string. Με άλλα λόγια, να αλφαριθμητικό, δεν έχει να επιστρέψει 123 και 124 και 125. Δεν πρέπει να μου δώσεις μια μακρά κατάλογο όλων των bytes που σειρά μου χρησιμοποιεί. Επειδή ένα, από όπου και αν όλα τα πλάτη με πλάτη. Και τα δύο, με βάση την πρώτη διεύθυνση, Ι μπορείτε να υπολογίσετε όπου η σειρά τελειώνει. Πώς; Ο ειδικός χαρακτήρας null, η Backslash μηδέν στο τέλος. Έτσι, με άλλα λόγια, εάν περνάτε γύρω - στο εσωτερικό των μεταβλητών - η διεύθυνση ενός char, και να αναλάβουν ότι στο τέλος της κάθε σειράς, οποιαδήποτε ακολουθία χαρακτήρων, όπως εμείς οι άνθρωποι σκεφτείτε χορδές, αν υποθέσουμε ότι στο τέλος της εν λόγω σειρά δεν υπάρχει μηδενικό backslash, είσαι χρυσή. Επειδή δεν μπορείτε πάντα να βρείτε το τέλος μιας συμβολοσειράς. Τώρα τι πραγματικά συμβαίνει στη συνέχεια σε αυτό το πρόγραμμα; Γιατί είναι αυτό το πρόγραμμα, συγκρίνουν-0.c, με λάθη; Τι είναι στην πραγματικότητα η σύγκριση; Ναι; ΦΟΙΤΗΤΗΣ: [δεν ακούγεται]. DAVID MALAN: Ακριβώς. Είναι συγκρίνοντας τις θέσεις των χορδών. Έτσι, αν ο χρήστης έχει πληκτρολογήσει γεια μία φορά, όπως έκανα, μνήμη μπορεί να καταλήξει μοιάζοντας με αυτό. Εάν ο χρήστης στη συνέχεια οι τύποι στο Γεια σας και πάλι, αλλά με την κλήση να πάρει σειρά και πάλι, c είναι δεν είναι ιδιαίτερα έξυπνος αν σας διδάξει να είναι έξυπνος με το γράψιμο κώδικα. C - και υπολογιστές γενικότερα - αν πληκτρολογήσετε τη λέξη Γεια σας και πάλι, ξέρετε τι πρόκειται να πάρετε. Είστε ακριβώς πρόκειται να πάρει μια δεύτερη σειρά της μνήμης που, ναι, συμβαίνει να είναι αποθήκευση H-E-L-L-O και ούτω καθεξής. Δεν πρόκειται να δούμε το ίδιο για εμάς τους ανθρώπους, αλλά αυτή η διεύθυνση μπορεί να μην είναι 123. Θα μπορούσε απλά να συμβεί έτσι ώστε η το λειτουργικό σύστημα έχει κάποιο διαθέσιμο χώρο, για παράδειγμα, στη θέση - ας πούμε κάτι αυθαίρετο, όπως αυτό είναι θέση 200. Και αυτή είναι η θέση 201. Και αυτό είναι η θέση 202. Δεν έχουμε καμία ιδέα για το πού αυτό είναι πρόκειται να είναι στη μνήμη. Αλλά τι σημαίνει αυτό είναι ότι ό, τι είναι πρόκειται να αποθηκευτούν σε τελική ανάλυση, s; Ο αριθμός 123. Τι πρόκειται να αποθηκευτούν σε t, σε αυτό το αυθαίρετο παράδειγμα; Ο αριθμός 200. Και όλα αυτό σημαίνει ότι τότε είναι προφανές ότι, 123 δεν είναι ίσο με 200. Και έτσι αυτή η κατάσταση, αν δεν αληθής. , Επειδή παίρνουν σειρά χρησιμοποιεί διαφορετικές κομμάτια της μνήμης κάθε φορά. Τώρα μπορούμε να δούμε πάλι αυτό σε ένα άλλο παράδειγμα. Επιτρέψτε μου να προχωρήσει και να ανοίξει copy-0.c. Ισχυρίζομαι ότι αυτό το παράδειγμα πρόκειται να δοκιμή - αλλά αποτυγχάνουν - να αντιγράψετε δύο χορδές ως ακολούθως. Πάω να πω κάτι για τον χρήστη. Είμαι στη συνέχεια πρόκειται να πάρετε μια string και να το ονομάσουμε s. Και τώρα, κάνω τον έλεγχο αυτό εδώ. Έχουμε αναφέρει αυτό μια πίσω, ενώ. Αλλά όταν θα μπορούσε να πάρει σειρά null επιστροφής, άλλο ειδικό χαρακτήρα, ή ειδικές σύμβολο ας πούμε. Αν είναι έξω από τη μνήμη. Για παράδειγμα, εάν ο χρήστης είναι πραγματικά είναι δύσκολο και τα είδη ένα φρικτό αριθμό των χαρακτήρων στην πληκτρολόγιο και χτυπήματα Enter. Εάν ο αριθμός των χαρακτήρων που απλά δεν μπορεί να χωράει στη RAM για οποιοδήποτε τρελό λόγο, αλλά και να πάρει χορδών θα μπορούσε να πολύ καλά επιστρέψει null. Ή αν το πρόγραμμά σας το ίδιο κάνει πολλά από άλλα πράγματα και εκεί ακριβώς δεν υπάρχει αρκετή μνήμη για get εγχόρδων για να πετύχει, θα μπορούσε να καταλήξει να επιστρέφουν null. Αλλά ας είμαστε πιο ακριβείς ως προς το τι είναι αυτό. Ποια είναι τα δεδομένα τύπου s είναι πραγματικά; Char αστέρων. Έτσι αποδεικνύεται τώρα μπορούμε φλούδα υποστηρίξει το στρώμα του null. Βγάζει, null είναι - ναι, προφανώς, ένα ειδικό σύμβολο. Αλλά τι είναι αυτό πραγματικά; Πραγματικά, null είναι μόνο ένα σύμβολο που οι άνθρωποι χρησιμοποιούν για να εκπροσωπήσει το μηδέν, καθώς και. Έτσι, οι συντάκτες της C, και υπολογιστές γενικότερα, αποφάσισε χρόνια πριν ότι, ξέρετε τι. Γιατί δεν μπορούμε να εξασφαλίσουμε ότι κανένας χρήστης τα δεδομένα είναι ποτέ, ποτέ, ποτέ αποθηκεύονται στο μηδέν αντίο; Στην πραγματικότητα, ακόμη και σε αυθαίρετες παράδειγμα μου πριν, δεν είχα ξεκινήσει η αρίθμηση bytes στο μηδέν. Ξεκίνησα σε ένα. Γιατί ήξερα ότι οι άνθρωποι στον κόσμο αποφάσισαν να κρατήσουν το μηδέν byte στη μνήμη RAM του καθενός, κάτι το ιδιαίτερο. Ο λόγος είναι, όποτε θέλετε να σήμα ότι κάτι έχει πάει στραβά όσον αφορά τις διευθύνσεις, που επέστρεψε null - αλλιώς γνωστή ως μηδέν - και επειδή ξέρετε ότι δεν υπάρχει legit δεδομένων στην διεύθυνση μηδέν, σαφώς αυτό σημαίνει ότι ένα σφάλμα. Και γι 'αυτό, κατά συνθήκη, ελέγξτε for null και την επιστροφή κάτι σαν ένα σε αυτές τις περιπτώσεις. Έτσι, αν μετακινηθείτε προς τα κάτω τώρα, αυτό είναι μόνο τότε κάποια έλεγχος σφαλμάτων, μόνο στην περίπτωση κάτι πήγε στραβά με [; εγγύηση?] εντελώς και κλείστε το πρόγραμμα με την επιστροφή νωρίς. Αυτή η γραμμή τώρα θα μπορούσε να ξαναγραφτεί καθώς αυτό, που σημαίνει τι; Στην αριστερή πλευρά, να μου δώσει ένα άλλο δείκτη σε ένα χαρακτήρα, και να το ονομάσουμε t. Τι είμαι εγώ αποθήκευση εσωτερικό του t, με βάση σε αυτή τη γραμμή ένα κώδικα; Είμαι αποθήκευση μιας τοποθεσίας. Συγκεκριμένα, η θέση αυτό ήταν το s. Έτσι, αν ο χρήστης έχει πληκτρολογήσει σε γεια, και ότι η πρώτη συμβαίνει γεια για να καταλήξει εδώ, τότε ο αριθμός 123 είναι πρόκειται να έρθει πίσω από να πάρει string και να αποθηκεύονται - όπως είπαμε νωρίτερα - στο s. Όταν δηλώνω τώρα ένα άλλο δείκτη μια χαρα και να το ονομάσουμε t, ποιος αριθμός είναι κυριολεκτικά πρόκειται να καταλήξουν σε t σύμφωνα με την ιστορία; Έτσι, 123. Έτσι, από τεχνική τώρα τόσο s και t δείχνουν την ακριβή ίδια κομμάτια της μνήμης. Έτσι, παρατηρήστε τι Πάω να κάνουμε τώρα για να αποδεικνύουν ότι το πρόγραμμα αυτό είναι προβληματικό. Πρώτη Πάω να διεκδικήσει, με a f εκτύπωσης, αξιοποιώντας το αντίγραφο του string. Στη συνέχεια, Πάω να κάνω μια μικρή Έλεγχος σφαλμάτων. Πάω να βεβαιωθείτε. Ας βεβαιωθείτε ότι το t string είναι σε τουλάχιστον μεγαλύτερη από το μηδέν σε μήκος, οπότε υπάρχει κάποια χαρακτήρα εκεί πραγματικά να επωφεληθούμε. Και τότε ίσως να θυμάστε αυτό από τα προηγούμενα παραδείγματα. 2 άνω - το οποίο είναι σε η ctype.h αρχείο. T βραχίονα μηδέν μου δίνει το μηδέν χαρακτήρα του t string. Και 2 άνω του ίδιου αξίας, της Φυσικά, το μετατρέπει σε κεφαλαία. Έτσι, διαισθητικά, αυτή η επισημασμένη γραμμή του κώδικα σε κεφαλαίο του πρώτου επιστολή στην t. Αλλά δεν κεφαλαιοποίηση, διαισθητικά, το πρώτο γράμμα s. Αλλά εάν σκέφτεστε το μέλλον, τι είμαι για να δούμε όταν τρέχω αυτό το πρόγραμμα και να εκτυπώσετε τόσο το πρωτότυπο, s, και το λεγόμενο αντίγραφο, t; Είναι πραγματικά πρόκειται να είναι το ίδιο. Και γιατί είναι αυτοί που πρόκειται να είναι το ίδιο; Είναι και οι δύο δείχνουν να ακριβώς το ίδιο πράγμα. Έτσι, ας το κάνουμε. Κάντε μηδέν αντίγραφο. Θα συγκεντρώνει OK. Επιτρέψτε μου να τρέξει το μηδέν αντίγραφο. Επιτρέψτε μου να πληκτρολογήσετε κάτι σαν γεια σε όλα τα πεζά χτύπησε στη συνέχεια πατήστε Enter. Και ισχυρίζεται ότι τόσο η αρχική s και το αντίγραφο είναι όντως πανομοιότυπα. Έτσι, αυτό που πραγματικά συνέβη εδώ; Επιτρέψτε μου να αναδιατυπώσει αυτή την εικόνα μόνο να πει την ιστορία σε έναν ελαφρώς διαφορετικό τρόπο. Τι πραγματικά συμβαίνει κάτω από την κουκούλα, όταν δηλώνω κάτι σαν char ξεκίνημα s, ή συμβολοσειρά s, Είμαι πάρει ένα δείκτη - η οποία συμβαίνει να είναι τέσσερα bytes στη συσκευή CS50 και σε πολλές των υπολογιστών. Και Πάω να καλέσετε αυτό το s. Και αυτό έχει σήμερα κάποια άγνωστη τιμή. Όταν δηλώνετε μια μεταβλητή, εκτός και αν θέσει τον εαυτό σας μια τιμή, εκεί που ξέρει τι υπάρχει εκεί. Θα μπορούσε να είναι κάποια τυχαία ακολουθία δυαδικά ψηφία από την προηγούμενη εκτέλεση. Έτσι, όταν, στην γραμμή μου κώδικα παίρνουν string, και στη συνέχεια να αποθηκεύσετε την επιστροφή αξία s να πάρει σειρά με κάποιο τρόπο - και εμείς θα τελικά φλούδα πίσω πώς να πάρει έργα string, διαθέτει κάποιον τρόπο πίνακα που ίσως φαίνεται λίγο σαν αυτό. H-E-L-L-O, backslash μηδέν. Ας υποθέσουμε ότι αυτή είναι η διεύθυνση 123 μόνο το πρώτο συνοχή. Έτσι πάρτε επιστρέφει string, στην επισημασμένη γραμμή εκεί, επιστρέφει το Αριθμός είπαμε, 123. Έτσι τι συμβαίνει πραγματικά στο εσωτερικό του είναι εδώ; Λοιπόν, τι πραγματικά συμβαίνει εσωτερικό του s είναι 123. Αλλά ειλικρινά, έχω πάρει λίγο συγχέεται με όλες αυτές τις διευθύνσεις, όλες αυτές αυθαίρετοι αριθμοί. 123, 124, 127. Οπότε ας πραγματικότητα απλοποίηση ο κόσμος λίγο. Όταν μιλάμε για δείκτες, ειλικρινά, να εμάς τους ανθρώπους, ποιος στο καλό νοιάζεται όπου τα πράγματα είναι στη μνήμη; Αυτό είναι εντελώς αυθαίρετη. Είναι πρόκειται να εξαρτηθεί από το πόσο μνήμης RAM ο χρήστης έχει. Είναι πρόκειται να εξαρτηθεί από όταν μέσα στην ημέρα εκτελέσετε το πρόγραμμα, ίσως, και ποιες εισηγήσεις ο χρήστης που δίνει. Είμαστε κατοικία σε ασήμαντες λεπτομέρειες. Έτσι αφηρημένη ας μακριά και να πω ότι, όταν εκτελείτε μια γραμμή κώδικα, όπως αυτό, char αστέρι s παίρνει την επιστροφή αξία get string. Γιατί δεν αντ 'αυτού ακριβώς αντλήσει ό, τι μπορούμε κρατήσει καλώντας έναν δείκτη, όπως κι αν είναι δείχνοντας κάτι; Γι 'αυτό και ισχυρίζονται τώρα ότι s up υπάρχει ένας δείκτης - κάτω από την κουκούλα είναι μια διεύθυνση. Αλλά αυτό είναι ακριβώς που δείχνουν προς Το πρώτο byte στην συμβολοσειρά που είναι ήδη επιστραφεί. Αν τώρα επιστρέψουμε στον κώδικα εδώ, τι συμβαίνει σε αυτή τη γραμμή; Λοιπόν, σε αυτή την επισημασμένη γραμμή τώρα, Είμαι δηλώνοντας προφανώς άλλο μεταβλητή που ονομάζεται t. Αλλά είναι επίσης ένας δείκτης, έτσι Πάω να επιστήσει την, θεωρητικά, η ακριβής ίδιο κουτί μεγέθους. Και Πάω να το ονομάσουμε t. Και τώρα, αν πάμε πίσω στο ξανά τον κωδικό, όταν αποθηκεύουν s εσωτερικό του t, τι είμαι τεχνικά βάζοντας στο εσωτερικό του t; Λοιπόν, από τεχνική άποψη, αυτό ήταν ο αριθμός 123. Έτσι, πραγματικά θα πρέπει να γράφει ο αριθμός 123 εκεί. Αλλά ας τα πάρουμε υψηλότερο επίπεδο. t, αν είναι μόνο ένας δείκτης, διαισθητικά, είναι ακριβώς αυτό. Αυτό είναι όλο αυτό που είναι αποθηκευμένα εκεί. Έτσι τώρα τα τελευταία ενδιαφέρουσες γραμμές του κώδικα, όταν πραγματικά να πάει για κεφαλαιοποίηση του χαρακτήρας μηδέν σε t, τι συμβαίνει; Λοιπόν, t βραχίονα μηδέν τώρα δείχνει σε ό, τι χαρακτήρα, κατά πάσα πιθανότητα; Είναι επισημαίνοντας h. Επειδή t βραχίονα μηδέν - θυμάστε, αυτό είναι παλιό σύνταξη. t βραχίονα μηδέν σημαίνει μόνο αν t είναι ένα string, t βραχίονα μηδέν σημαίνει να πάρει το μηδέν χαρακτήρα σε αυτή την δύναμη. Έτσι, αυτό που πραγματικά σημαίνει είναι να πάτε σε αυτό το array - και ναι, αυτό μπορεί να είναι 123, Αυτό θα μπορούσε να είναι 124. Αλλά είναι όλα σχετικά, να θυμάστε. Κάθε φορά που μιλάμε για μια σειρά, έχουμε το πλεονέκτημα να μιλάμε για σε σχέση με δείκτες. Και έτσι τώρα μπορούμε απλά να υποθέσουμε ότι t βραχίονα μηδέν είναι h. Έτσι, αν Καλώ 2 επάνω σε αυτό, τι είναι πραγματικά κάνουν είναι να κεφαλαιοποίηση το πεζό h με κεφαλαία H. Αλλά, βεβαίως, τι είναι s; Είναι δείχνουν στο ίδιο καταριέται string. Έτσι, αυτό είναι το μόνο που συμβαίνει σε αυτόν τον κώδικα μέχρι στιγμής. Έτσι ποια είναι τότε η επίπτωση; Πώς μπορούμε να διορθώσετε αυτά τα δύο προβλήματα; Πώς μπορούμε να συγκρίνουμε την πραγματική χορδές; Καλά διαισθητικά, πώς θα πηγαίνετε για τη σύγκριση δύο χορδές για την πραγματική ισότητα; Τι σημαίνει όταν δύο χορδές είναι ίσοι; Σαφώς δεν είναι ότι οι διευθύνσεις τους ισούται στη μνήμη, γιατί αυτό είναι ένα χαμηλό επίπεδο λεπτομέρειας εφαρμογής. Όλοι οι χαρακτήρες είναι το ίδιο. Έτσι, επιτρέψτε μου να προτείνω, και επιτρέψτε μου να εισαγάγει στην έκδοση ενός από compare.c εδώ, έτσι συγκρίνουν-1.γ. Επιτρέψτε μου να προτείνω να πάρετε ακόμα ένα δείκτη που ονομάζεται s, και να αποθηκεύουν σε αυτό το επιστροφή αξίας get string. Ας κάνουν το ίδιο πράγμα με t. Έτσι, κανένας από τον κώδικα είναι διαφορετική. Πάω να προσθέσετε λίγο περισσότερο έλεγχο σφαλμάτων τώρα. Έτσι, τώρα που είμαστε το είδος της απολέπισης πίσω αυτό στρώματα CS50 από ό, τι μια σειρά είναι στην πραγματικότητα, πρέπει να είμαστε πιο πρωκτικό για να διασφαλίσουμε ότι δεν καταχρώνται άκυρο αξίες όπως null. Έτσι, είμαι απλώς πρόκειται να ελέγξετε. Εάν s δεν είναι ίσο με null και t δεν ίση null, αυτό σημαίνει ότι είμαστε εντάξει. Πάρτε χορδών δεν βίδα μέχρι να πάρει είτε από τις χορδές. Και ίσως μπορείτε να μαντέψετε τώρα, τι δεν STR CMP πιθανώς να κάνω; String σύγκριση. Έτσι, αν έχετε το πρόγραμμα σε Java πριν, Αυτό είναι σαν τη μέθοδο που ισούται με το κλάσης string. Αλλά για εκείνους από εσάς που δεν έχουν προγραμματιστεί πριν, Αυτό είναι απλά μια συνάρτηση c. Συμβαίνει να έρθει σε μια αρχείο που ονομάζεται string.h. Αυτός είναι όπου έχει δηλωθεί. Και σύγκρισης συμβολοσειράς - Ξεχάσω πραγματικά τη χρήση του, αλλά δεν πειράζει αυτό. Υπενθυμίζουμε ότι μπορούμε να κάνουμε άνθρωπος, ανακατεύετε σύγκριση. Και αυτό πρόκειται να φέρει επάνω του Linux εγχειρίδιο προγραμματιστές. Και, ειλικρινά, λίγο αινιγματικό. Βλέπω, όμως, ότι εδώ, ναι. Θα πρέπει να περιλαμβάνει string.h. Και λέει εδώ κάτω περιγραφή, «η εγχόρδων συνάρτηση σύγκρισης συγκρίνει οι δύο χορδές S1 και S2. «Και S1 και S2 είναι προφανώς ο δύο επιχειρήματα που πέρασε μέσα Πραγματικά, δεν θυμάμαι τι const είναι, αλλά τώρα παρατηρήσετε - και μπορεί να έχετε δει αυτό, όταν ήδη έχετε χρησιμοποιήσει τις σελίδες man αν έχετε όλα - ότι char αστέρι είναι μόνο συνώνυμο με σπάγκο. Γι 'αυτό συγκρίνει τις δύο χορδές, S1 και S2, και επιστρέφει έναν ακέραιο μικρότερη από ή ίση με ή μεγαλύτερη από το μηδέν εάν S1 βρίσκεται, αντίστοιχα, για να είναι μικρότερη ή ίση ή να είναι μεγαλύτερη από S2. Αυτό είναι απλά ένα πολύ σύνθετο τρόπος για να πούμε ότι σύγκρισης συμβολοσειράς επιστρέφει μηδέν αν δύο χορδές είναι διαισθητικά ταυτόσημες, χαρακτήρα χαρακτήρα για τον χαρακτήρα. Επιστρέφει έναν αρνητικό αριθμό, αν s, αλφαβητικά, υποτίθεται να έρθει πριν από t. Ή επιστρέφει ένα θετικό αριθμό, αν s υποτίθεται ότι θα έρθουν μετά από t αλφαβητικά. Έτσι, με αυτή την απλή λειτουργία, θα μπορούσε να μπορείτε, για παράδειγμα, να ταξινομήσετε μια σωρό λέξεις; Έτσι, σε αυτή τη νέα έκδοση, Πάω να προχωρήσει και να κάνει compare1. Dot slash συγκρίνει ένα. Θα πληκτρολογήσετε γεια σε όλα τα πεζά. Πάω να πληκτρολογήσετε ένα γεια σε όλα τα πεζά και πάλι. Και ευτυχώς τώρα συνειδητοποιεί Έχω πληκτρολογήσει το ίδιο πράγμα. Εν τω μεταξύ, αν πληκτρολογήσετε γεια στο χαμηλότερο περίπτωση και γειά σου με κεφαλαία και σύγκρισή τους, θα πληκτρολογήσει διαφορετικά πράγματα. Διότι δεν είναι μόνο οι διευθύνσεις διαφορετικά, αλλά είμαστε συγκρίνοντας διαφορετικούς χαρακτήρες ξανά και ξανά. Λοιπόν ας πάμε και να καθορίσει ένα άλλο πρόβλημα τώρα. Επιτρέψτε μου να ανοίξει η μία εκδοχή της αντίγραφο, το οποίο τώρα αντιμετωπίζει αυτό το ζήτημα ως εξής. Και αυτό πρόκειται να δούμε λίγο πιο περίπλοκη. Αλλά αν σκεφτούμε ποιο είναι το πρόβλημα που πρέπει να επιλυθούν, ελπίζω ότι αυτό θα είναι σαφές ακριβώς σε μια στιγμή τώρα. Έτσι, αυτή η πρώτη γραμμή, χαρακτήρας ξεκίνημα t, σε Με άλλα λόγια θα μπορούσε κάποιος να προτείνει Τι σημαίνει αυτή η γραμμή εδώ; Char αστέρι t, αυτό είναι ότι κάνει; Καλό. Δημιουργήστε ένα δείκτη προς κάποια σημείο στη μνήμη. Και επιτρέψτε μου να βελτιώσετε το λίγο. Αναγνωρίσει μια μεταβλητή που θα αποθηκεύσει το διεύθυνση του κάποια χαρα στη μνήμη, μόνο να είναι λίγο πιο σωστή. ΕΝΤΑΞΕΙ, έτσι τώρα στη δεξιά πλευρά, έχω δει ποτέ μία από αυτές τις λειτουργίες πριν, malloc. Αλλά τι μπορεί να σημαίνει αυτό; Κατανομή της μνήμης. Μνήμη κατανομής. Έτσι αποδεικνύεται, μέχρι τώρα, δεν είχαν πραγματικά ένα ισχυρό μέσο της ζητώντας από το λειτουργικό σύστημα, να μου δώσει κάποια μνήμη. Αντίθετα, έχουμε τώρα μια λειτουργία που ονομάζεται malloc που κάνει ακριβώς αυτό. Ακόμα κι αν αυτό είναι ένα κομμάτι ενός απόσπαση της προσοχής τώρα, παρατηρούμε ότι σε μεταξύ των δύο παρενθέσεις είναι ακριβώς πρόκειται να είναι ένας αριθμός. Σε περίπτωση που έχω πληκτρολογήσει στο εν λόγω τα σήματα μπορεί να είναι ένας αριθμός. Και ο αριθμός αυτός σημαίνει, να μου δώσει 10 bytes. Δώσε μου 20 bytes. Δώσε μου 100 bytes. Και malloc θα καταβάλει κάθε δυνατή προσπάθεια για να να ζητήσει από το λειτουργικό σύστημα - Linux, σε αυτή την περίπτωση - hey, είναι 100 bytes τους της RAM διαθέσιμα; Αν ναι, επιστρέψτε τα bytes σε μένα από επιστρέφοντας την διεύθυνση της οποίας του τα bytes, ίσως; Η ίδια η πρώτη. Έτσι, εδώ και πάρα πολύ - και αυτό είναι το κυρίαρχο στο C, κάθε φορά που είστε που ασχολούνται με τις διευθύνσεις; Είσαι σχεδόν πάντα ασχολούνται με το πρώτη τέτοια διεύθυνση, δεν έχει σημασία πόσο μεγάλο ένα μεγάλο κομμάτι της μνήμης που είναι επιστρέφονται, να το πω έτσι. Έτσι, ας βουτήξει εδώ. Είμαι προσπαθεί να διαθέσει το πώς πολλά bytes, ακριβώς; Καλά. Μήκος του νήματος του s - ας κάνει ένα συγκεκριμένο παράδειγμα. Αν s είναι γειά σου, H-Ε-L-L-O, ποια είναι η μήκος του νήματος του s, προφανώς; Έτσι είναι πέντε. Αλλά κάνω ένα συν 1 σε αυτό, γιατί; Γιατί θέλω έξι bytes αντί για πέντε; Ο χαρακτήρας null. Δεν θέλω να φύγω από αυτό το ειδική null χαρακτήρα. Γιατί αν κάνω ένα αντίγραφο του Hello και απλά κάνετε H-Ε-L-L-O, αλλά δεν βάζω ότι η ειδική χαρακτήρα, ο υπολογιστής δεν θα μπορούσαν να έχουν, κατά τύχη, το backslash μηδέν εκεί για μένα. Και έτσι, αν εγώ προσπαθώ να καταλάβω το μήκος του αντιγράφου, θα μπορούσε κανείς να σκεφτεί ότι είναι 20 χαρακτήρες, ή ένα εκατομμύριο χαρακτήρες, αν ποτέ απλώς τυχαίνει να χτυπήσει ένα μηδενικό κάθετο. Έτσι χρειαζόμαστε έξι bytes για την αποθήκευση H-E-L-L-O, backslash μηδέν. Και τότε αυτό είναι απλά να είναι σούπερ πρωκτικό. Ας υποθέσουμε ότι έχω ξεχάσει τι το μέγεθος ενός char είναι. Κρατάμε λέγοντας ένα byte του. Και είναι συνήθως. Θεωρητικά, θα μπορούσε να είναι κάτι διαφορετικά, σε μια διαφορετική ή Mac διαφορετικό υπολογιστή. Έτσι, αποδεικνύεται ότι υπάρχει αυτό το φορέα ονομάζεται sizeof ότι αν περάσει το το όνομα του τύπου δεδομένων - όπως char ή int ή float - θα σας πω, δυναμικά, πόσες bytes μια χαρα παίρνει επάνω σε αυτό συγκεκριμένο υπολογιστή. Έτσι, αυτό είναι αποτελεσματικά μόνο σαν να λέμε φορές 1 ή φορές τίποτα δεν σε όλα. Αλλά το κάνω μόνο για να είναι σούπερ πρωκτικό, ότι μόνο σε περίπτωση που μια χαρα διαφέρει στον υπολογιστή σε σχέση με το δικό μου, με αυτόν τον τρόπο Τα μαθηματικά είναι πάντα πρόκειται να ελέγξετε έξω. Τέλος, εδώ κάτω μπορώ να ελέγξω for null, το οποίο είναι πάντα καλή πρακτική - και πάλι, Κάθε φορά που έχουμε να κάνουμε με δείκτες. Εάν malloc δεν ήταν σε θέση να δώσει με έξι αποχαιρετισμός - η οποία είναι απίθανο, αλλά μόνο στην περίπτωση - επιστρέφει ένα αμέσως. Και τώρα, να προχωρήσει και να αντιγράψετε η σειρά ως εξής. Και αυτό είναι γνωστό σύνταξη, αν και σε διαφορετικό ρόλο. Πάω να πάει μπροστά και να πάρει το string μήκος του s και να το αποθηκεύσετε στο n. Είμαι στη συνέχεια πρόκειται να επαναλάβει από το i ισούται μηδέν έως και Ν, μεγαλύτερο από ή ίσο με. Έτσι ώστε σε κάθε επανάληψη, έβαλα το i-χαρακτήρας του s στο i- χαρακτήρα t. Έτσι, αυτό που πραγματικά συμβαίνει κάτω η κουκούλα εδώ; Λοιπόν, αν αυτό, για παράδειγμα, είναι s - και έχω πληκτρολογήσει τη λέξη H-Ε-Ε-Ε-Ο και υπάρχει ένα μηδενικό κάθετο. Και πάλι, αυτό είναι s δείχνοντας εδώ. Και εδώ τώρα είναι τ. Και αυτό δείχνει τώρα ένα αντίγραφο της μνήμης, έτσι δεν είναι; Malloc μου έδωσε ένα ολόκληρο κομμάτι της μνήμης. Δεν ξέρω αρχικά τι είναι σε οποιαδήποτε από αυτές τις θέσεις. Έτσι, Πάω να σκεφτώ αυτά ως ένα σωρό ερωτηματικά. Αλλά μόλις αρχίσω looping από το μηδέν στην επάνω μέσω του μήκους του S, T βραχίονα μηδέν και t βραχίονα 1 - και θα βάλω αυτό τώρα στην εναέρια - t βραχίονα μηδέν και s βραχίονα με μηδενική μέση ότι θα πάω να την αντιγραφή h σε επαναληπτικά εδώ, Ε-Ε-Ε-Ο. Πλέον, επειδή έκανα το συν 1, backslash μηδέν. Έτσι τώρα, στην περίπτωση της σύγκρισης-1.γ, στο τέλος, αν μπορώ να εκτυπώσετε το κεφαλαιοποίηση t, θα πρέπει να δείτε ότι s είναι αμετάβλητη. Επιτρέψτε μου τώρα να προχωρήσει και να το κάνουμε αυτό. Έτσι κάνουν copy1. Dot slash copy1. Πάω να πληκτρολογήσετε ένα γεια, Enter. Και τώρα παρατηρήσετε, μόνο το αντίγραφο έχει κεφαλαιοποιηθεί. Επειδή έχω πραγματικά έχουν δύο κομμάτια της μνήμης. Δυστυχώς, μπορείτε να κάνετε κάποια αρκετά κακή και πολύ επικίνδυνα πράγματα εδώ. Επιτρέψτε μου να σηκώσει ένα παράδειγμα εδώ και τώρα, που μας δίνει ένα παράδειγμα των λίγων διαφορετικές γραμμές. Έτσι απλά διαισθητικά εδώ, η πρώτη γραμμή του κώδικα, int x αστέρων, δηλώνει μια μεταβλητή που ονομάζεται x. Και τι είναι ο τύπος δεδομένων αυτής της μεταβλητής; Ποιος είναι ο τύπος δεδομένων της μεταβλητής; Αυτό δεν ήταν η δραματική στιγμή. Ο τύπος δεδομένων είναι int αστέρων. Λοιπόν, τι σημαίνει αυτό; x θα αποθηκεύσετε τη διεύθυνση ενός int. Τόσο απλά. Y πρόκειται να αποθηκεύσετε το διεύθυνση ενός int. Ποια είναι η τρίτη γραμμή κώδικα κάνει εκεί; Είναι κατανομή πόσες bytes, το πιο πιθανό; Four. Λόγω του μεγέθους του είναι int γενικά τέσσερις, malloc των τεσσάρων δίνει μου πίσω τη διεύθυνση του ένα μεγάλο κομμάτι της μνήμη, η πρώτη των οποίων είναι bytes αποθηκεύονται τώρα στο x. Τώρα κινούμαστε λίγο γρήγορα. Αστέρια x σημαίνει τι; Αυτό σημαίνει ότι πάμε σε αυτή τη διεύθυνση και να τι αριθμό εκεί; Βάλτε το νούμερο 42 εκεί. Αστέρια y σημαίνει να πάει με ό, τι υπάρχει στο y και να θέσει τον αριθμό 13 εκεί. Αλλά περιμένετε ένα λεπτό. Τι είναι το y αυτή τη στιγμή; Ποια είναι η διεύθυνση είναι y αποθήκευση; Δεν ξέρω, έτσι δεν είναι; Εμείς ποτέ δεν έχουν χρησιμοποιήσει μία φορά την ανάθεση φορέας που αφορούν y. Έτσι, y, όπως δηλώνεται στην δεύτερη γραμμή του κώδικας είναι μόνο κάποια αξία σκουπιδιών, ένα μεγάλο ερωτηματικό να το πω έτσι. Θα μπορούσε να δείχνει τυχαία σε τίποτα στη μνήμη, η οποία είναι γενικά κακό. Έτσι, μόλις χτυπάμε ότι η γραμμή εκεί, αστέρι y ισούται με 13, κάτι κακό, κάτι πολύ κακό πρόκειται να συμβεί σε Binky. Ας δούμε λοιπόν τι πρόκειται να καταλήξει συμβαίνει σε binky εδώ σε αυτό το λεπτό ή έτσι φαίνονται. [PLAYBACK VIDEO] -Γεια σου, Μπίνκι. Ξυπνήστε. Ήρθε η ώρα για διασκέδαση δείκτη. -Τι είναι αυτό; Μάθετε για δείκτες; Ω, goodie. -Λοιπόν, για να ξεκινήσετε, υποθέτω είμαστε Θα χρειαστείτε ένα ζευγάρι δείκτες. -Εντάξει. Ο κωδικός αυτός διαθέτει δύο δείκτες το οποίο μπορεί να δείξει σε ακέραιους αριθμούς. -Εντάξει, καλά, βλέπω τους δύο δείκτες. Αλλά δεν φαίνεται να είναι επισημαίνοντας τίποτα. -Αυτό είναι σωστό. Αρχικά, οι δείκτες δεν να δείξει οτιδήποτε. Ονομάζονται τα πράγματα που δείχνουν pointees και τη ρύθμισή τους είναι ξεχωριστό στάδιο. -Α, ναι, σωστά. Το ήξερα αυτό. Οι pointees είναι ξεχωριστές. Τόσο πώς να διαθέσει ένα pointee; -Εντάξει. Λοιπόν, αυτός ο κώδικας διαθέτει ένα νέο ακέραιοι pointee, και αυτό το τμήμα θέτει x να επισημάνω σε αυτό. -Γεια σου, αυτό φαίνεται καλύτερα. Γι 'αυτό να κάνουμε κάτι. -Εντάξει. Θα dereference το x δείκτη για την αποθήκευση ο αριθμός 42 σε pointee του. Για αυτό το τέχνασμα, θα πρέπει μαγεία μου ραβδί του dereferencing. -Το μαγικό ραβδί της dereferencing; Χμ, αυτό είναι υπέροχο. -Αυτό είναι ό, τι ο κώδικας μοιάζει. Εγώ απλώς θα δημιουργήσει τον αριθμό, και - -Γεια σου, κοίτα. Εκεί πηγαίνει. Έτσι, κάνει μια dereference για x εξής το βέλος για να αποκτήσετε πρόσβαση pointee της. Σε αυτή την περίπτωση, για την αποθήκευση 42 εκεί μέσα. Γεια σου, δοκιμάστε να χρησιμοποιήσετε για να αποθηκεύσετε τον αριθμό 13 μέσα από τον άλλο δείκτη, y. -Εντάξει. Θα πήγαινε για να τις y και Πάρτε τον αριθμό 13 που έχει συσταθεί. Και στη συνέχεια να λάβει το ραβδί του dereferencing και μόνο - Πω πω! -Γεια σου. Αυτό δεν λειτούργησε. Ας πούμε, Binky, δεν νομίζω ότι η dereferencing y είναι μια καλή ιδέα, επειδή τη σύσταση της pointee είναι ένα ξεχωριστό βήμα. Και δεν νομίζω ότι το κάναμε ποτέ. -Χμμ. Καλό σημείο. -Ναι, θα διατεθεί το y δείκτη. Αλλά ποτέ δεν θα το θέσετε σε υποδηλώνουν μια pointee. -Χμμ. Πολύ προσεκτικός. -Γεια σου, ψάχνετε καλά εκεί, Μπίνκι. Μπορείς να το φτιάξω έτσι ώστε τα σημεία y με την ίδια ως pointee X; -Σίγουρα. Θα χρησιμοποιήσω το μαγικό ραβδί μου δείκτη ανάθεση. -Είναι ότι πρόκειται να είναι μια πρόβλημα, όπως πριν; -Όχι. Αυτό δεν έρχεται σε επαφή με τα pointees. Αλλάζει μόνο ένα δείκτη στο σημείο για το ίδιο πράγμα με ένα άλλο. -Ω, βλέπω. Τώρα τα σημεία y στο ίδιο σημείο με το x. Έτσι περιμένουμε. Τώρα y είναι σταθερό. Έχει pointee. Έτσι, μπορείτε να δοκιμάσετε το ραβδί της dereferencing και πάλι για να στείλετε το 13 πάνω. -Εντάξει. Εδώ πηγαίνει. -Γεια σου, κοίτα αυτό. Τώρα dereferencing έργα για y. Και επειδή οι δείκτες που μοιράζονται ότι ένα pointee, που και δείτε τα 13. -Ναι. Κοινή χρήση. Όποια και αν είναι. Έτσι θα πάμε θέσεις διακόπτη τώρα; -Κοίτα. Είμαστε έξω από το χρόνο. -Μα - -Απλά θυμηθείτε τις τρεις κανόνες δείκτη. Αριθμό ένα, η βασική δομή είναι ότι έχετε ένα δείκτη. Και επισημαίνει πάνω σε ένα pointee. Αλλά το δείκτη και pointee είναι ξεχωριστές. Και το κοινό λάθος είναι να τη δημιουργία ενός δείκτη, αλλά για να ξεχάσετε να δοθεί μια pointee. Νούμερο δύο, δείκτης dereferencing ξεκινά στο δείκτη και ακολούθως της βέλος για να αποκτήσετε πρόσβαση pointee της. Όπως όλοι γνωρίζουμε, αυτό λειτουργεί μόνο αν υπάρχει είναι ένα pointee, που παίρνει πίσω στο Κανόνας νούμερο ένα. Νούμερο τρία, εκχώρηση δείκτη λαμβάνει ένα δείκτη και αλλαγές που να δείχνουν το ίδιο pointee ως ένα άλλο δείκτη. Έτσι, μετά την ανάθεση, οι δύο δείκτες θα δείχνουν προς την ίδια pointee. Μερικές φορές αυτό είναι που ονομάζεται κοινή χρήση. Και αυτό είναι όλα υπάρχει σε αυτό, πραγματικά. Bye bye τώρα. [PLAYBACK VIDEO END] DAVID MALAN: Έτσι περισσότερο σε δείκτες, περισσότερα για Binky την επόμενη εβδομάδα. Θα τα πούμε τη Δευτέρα.