ΟΜΙΛΗΤΗΣ 1: Γεια σε όλους. Εμείς πρόκειται να ξεκινήσετε. Νομίζω ότι οι άνθρωποι εξακολουθούν να πηγαίνουν να είναι το φιλτράρισμα σε. Όμως, προς το συμφέρον του χρόνου, ώστε να μπορούμε να πάρετε εσείς από εδώ στην ώρα τους, θα πάμε για να ξεκινήσει. Έτσι καλωσορίζουμε στην CS50 Quiz 0 κριτική. Για όσους από εσάς δεν έχουν συνειδητοποιήσει όμως, έχετε μια ερώτηση την Τετάρτη. Woo-hoo. Αν δεν έχουν αρχίσει ακόμα τις σπουδές ή Δεν έχουν συνειδητοποιήσει ότι αυτό υπάρχει ακόμα, παρελθόν κουίζ και όλες οι πληροφορίες σχετικά με κουίζ σας είναι για cs50.net/quizzes. Υπάρχει κάποια πολύ καλά πράγματα εκεί, παρελθόν κουίζ από την τελευταία 10 χρόνου καθώς και πληροφορίες σχετικά με αυτό το κουίζ και θέματα ότι θα πρέπει να καλυφθούν. Οπότε ας ξεκινήσουμε. Έτσι, εσείς να θυμάστε, η πρώτη ημέρα της κατηγορίας David είχε αυτές τις λάμπες για. Έτσι, κατ 'ουσίαν, τα πάντα που πηγαίνει κάτω από την κουκούλα ενός υπολογιστή είναι γίνεται σε δυαδικό. Binary σημαίνει ό, τι ακούγεται όπως, 0 και 1 του. Έχει δύο αξίες που μπορεί να εκπροσωπείται. Έτσι ακριβώς όπως και στην πρώτη μέρα του τμήματος όταν ο David άναψε ένα φως λάμπα για να εκπροσωπεί την, ή 1, ο υπολογιστής μας αντιλαμβάνεται ως δυαδικό 0 και 1, η ενεργοποίηση ή απενεργοποίηση. Βασικά στοιχεία της Binary. Κάθε χώρα εκπροσωπείται στη βάση δύο. Έτσι, μπορείτε να προσθέσετε 2 στο 0 για το 1 έως το 2 σε όλη τη διαδρομή επάνω. Για να υπολογίσετε τι δυαδικό σας είναι να δεκαδικό, απλά ακολουθήστε αυτή την εξίσωση τύπου πράγμα. Εάν έχετε ένα 1 σε οποιοδήποτε από αυτά τα μέρη, πολλαπλασιάζουμε με το ανεξάρτητα από βασίζουν είναι σε, θα προσθέσει επάνω, και μπορείτε να πάρετε το δεκαδικό. Έτσι, αυτό είναι το πώς μετράνε 5 σε δυαδικό. Ακριβώς όπως αυτό που κάναμε για το τελευταία διαφάνεια, αυτό είναι το πώς θα κάνατε αντιπροσωπεύουν 1 μέσω 5. Ομοίως, ακριβώς όπως μπορείτε να προσθέσετε και αφαιρέσουμε το δεκαδικό ή να βασίσετε 10, ή πραγματικά καμία βάση, για να προσθέσετε και αφαιρούμε το δυαδικό. Ακριβώς αυτό που θα περίμενε κανείς όταν προσθέστε το δύο μέχρι, αν ισούται με μεγαλύτερη από 1, θα φέρει ένα 1, αυτό το 0 να κάνει, και να κάνει την προσθήκη με αυτόν τον τρόπο, απλά όπως θα περίμενε κανείς με την τακτική δεκαδικό ή οποιαδήποτε άλλη βάση. Cool. Έτσι, όπως είπα και πριν, τα πάντα ότι συνεχίζεται κάτω από την κουκούλα του υπολογιστή μας γίνεται σε 0 και 1, το ή δυαδικά. Επομένως, πώς θα εκφράσουν, για παράδειγμα, γράμματα ή αριθμούς ή χαρακτήρες; Και η απάντηση σε αυτό είναι ASCII. ASCII είναι μια χαρτογράφηση μεταξύ των χαρακτήρων ότι θα βλέπαμε κανονικά στο Αγγλική γλώσσα, όπως Α, Β, Γ, υπογραμμίζουν, παύλες, και κάτι τέτοιο. Και αυτό χαρτογραφεί ότι σε μια τιμή ASCII. Μια τιμή ASCII είναι απλά ένας αριθμός που μπορεί να γίνει κατανοητή από τον υπολογιστή σας. Και όπως μπορείτε να κάνετε προσθήκη και αφαίρεση με αριθμούς, μπορείτε να κάνετε τους με τις τιμές ASCII. Έτσι σε αυτό το παράδειγμα, τι αυτό θα εκτυπώσετε; Ναι, έτσι ακριβώς Ένας χώρος Β space space C Δ Πού πήγε το ποντίκι μου; Παρατηρήστε μπορείτε να ορίσετε έναν int 65. Και όταν εκτυπώνετε ότι χρησιμοποιώντας τοις εκατό C, θα ερμηνεύσει ότι ως χαρακτήρα και θα εκτυπώσετε A. Ομοίως, μπορείτε να δηλώσετε ως μια χαρα. Και όταν το εκτυπώσετε χρησιμοποιώντας τοις εκατό C, θα ερμηνεύσει ότι ως τοις εκατό D. Και ακριβώς όπως μπορείτε να προσθέσετε μια τον αριθμό, μπορείτε να προσθέσετε χαρακτήρες Τιμές ASCII, σε αυτή την περίπτωση. Έτσι, ένα μικρό δείκτη για όλους. 5, όπως ένα κορδόνι, δεν στην πραγματικότητα είναι ίση με 5. Λοιπόν, πώς θα μπορούσαμε να μετατρέψει το κορδόνι 5 στον ακέραιο 5; Οποιεσδήποτε ιδέες; Ναι. Έτσι, αν έχουμε 5 ως ένα string, μπορούμε να αφαιρέσουμε 0. Και αυτό θα μας δώσει 5. Και ομοίως, αν έχουμε 5 ως ακέραιος, να προσθέσω ότι το κορδόνι 0. Και αυτό μας δίνει το string 5. Cool. Τώρα, ας θυμηθούμε πάλι να μιλήσει εκείνη όπου μιλήσαμε για αλγόριθμους. Λοιπόν, πώς μπορούμε πραγματικά θέλουν έναν υπολογιστή για να κάνει ενδιαφέροντα πράγματα; Ξέρεις, απλά προσθέτοντας και αφαιρώντας αριθμούς και εκτύπωση τα πράγματα δεν είναι ότι συναρπαστικό. Συνήθως, θέλουμε ο υπολογιστής μας να εκτελέσει κάποια είδος του αλγορίθμου. Κάτι λίγο πιο περίπλοκη από την απλή αριθμητική. Ένας αλγόριθμος είναι απλά ένα βήμα προς βήμα σετ οδηγίες για το πώς να εκτελέσει ένα ορισμένο task-- ήθελα απλά μια συνταγή. Ίσως να θυμάστε την πρώτη ημέρα του κατηγορία όπου ο David μας είχε μετρήσει ένα δωμάτιο των ανθρώπων και πόσοι άνθρωποι ήταν στο δωμάτιο. Μπορεί να χρησιμοποιηθεί για την καταμέτρηση ένα προς ένα. 1, 2, 3, 4. Στην περίπτωση αυτή, ένας γραμμικός αλγόριθμος χρόνου. Αλλά ο David εισήγαγε έναν αλγόριθμο για μπορείτε να μετρήσετε τους ανθρώπους στο δωμάτιο όπου ο καθένας σηκώνεται, λέτε σας αριθμό σε άλλο πρόσωπο, να προσθέσω ότι αριθμό μέχρι και ένα άτομο κάθεται κάτω. Και σας επαναλαμβάνω ότι. Αυτό είναι ένα είδος του αλγορίθμου. Μπορούμε να αναλύσουμε το πόσο αποδοτικό είναι ένα αλγόριθμος βασίζεται σε αυτό είναι το χρόνο εκτέλεσης. Αλλά θα μιλήσουμε λίγο περισσότερα για αυτό αργότερα. Έτσι, όλοι οι αλγόριθμοι μπορούν επίσης να είναι γραμμένο σε ψευδοκώδικα. Ψευδοκώδικας είναι απλά μια αγγλική, όπως σύνταξη χρησιμοποιούνται για να αντιπροσωπεύουν μια γλώσσα προγραμματισμού. Για παράδειγμα, αν θέλαμε να ζητούν από τον χρήστη να μαντέψει το αγαπημένο μου αριθμός, εμείς θα μπορούσε να έχει ψευδοκώδικα ως τέτοια. Get a χρήστες υποθέτω. Αν η εικασία είναι σωστή, πείτε τους ότι είναι σωστό, αλλιώς πείτε τους δεν είναι σωστή. Και pseudocode είναι ένας τρόπος εύκολα αντιπροσωπεύει μια ιδέα ή έναν αλγόριθμο. Μέχρι τώρα ίσως να θέλετε να γράψετε πραγματικά Αυτό στη γλώσσα που ο υπολογιστής θα μπορούσε κατανόηση. Έτσι, θα μπορούσαμε να γράψουμε pseudocode μας και ερμηνεύσει ότι σε πηγαίο κώδικα. Μέχρι στιγμής, πηγαίου κώδικα πρέπει να τηρούν σε μια ορισμένη σύνταξη του μια γλώσσα προγραμματισμού. Και μέχρι στιγμής, σε CS50, έχουμε χρησιμοποιούν ως επί το πλείστον c. Έτσι αυτό θα μπορούσε να είναι πηγαίο κώδικα για c. Αργότερα, κατά τη διάρκεια, σας νύχτα έρχεται σε επαφή με άλλα προγράμματα γλώσσες όπως η PHP. Ή αν έχετε πάρει ακόμα άλλες κατηγορίες, μπορείτε θα μπορούσε να κάνει Java, Python, ή ακόμα και OCML. Αλλά σε μας γλώσσα γ πρόγραμμα, αυτό είναι πώς μπορούμε να γράψει τον κώδικα για ο αλγόριθμος pseudocode ότι Που μόλις περιέγραψα νωρίτερα. Λοιπόν, πώς κάνει τον υπολογιστή σας στην πραγματικότητα καταλαβαίνεις; Όπως είπα και πριν, το μόνο που πραγματικά κατανοεί μηδενικά και μονάδες. Έτσι, πώς να το πάρει από την πηγή κώδικα σε κάτι που μπορεί να είναι κατανοητό; Λοιπόν, έχουμε κάτι ονομάζεται compiler. Αν θυμάστε πίσω στα περισσότερα από σας psets, είχατε κάποιο είδος του προγράμματος γραμμένο σε ένα αρχείο dot c. Και τότε θα πρέπει να πληκτρολογήσετε make. Έτσι, αυτό που κάνει κάνει; Μπορείτε να πληκτρολογήσετε make για τη μεταγλώττιση σας πρόγραμμα, διότι someone-- όποιος έγραψε σύνολο p σας? πιθανώς David-- δημιουργήσει ένα αρχείο make. Και αυτό λέει κάνουν να ξέρετε για να τρέξει σας compiler, που ονομάζεται κλαγγή, ότι η βούληση Στη συνέχεια καταρτίζουν τον πηγαίο κώδικα σας για να αντιταχθούν κώδικα, το οποίο είναι μηδενικά και μονάδες ότι ο υπολογιστής σας καταλαβαίνει. Αλλά λίγο αργότερα, θα πάμε περισσότερο σε βάθος περίπου compilers. Έτσι, υπενθυμίζουν το chipset 0, where-- ναι, Έχετε μια ερώτηση; ΚΟΙΝΟ: [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Ναι. I σκέφτονται πραγματικά θα πρέπει να είναι σε απευθείας σύνδεση. Ναι. ΚΟΙΝΟ: Είναι σαν [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Δεν είναι. Το βρίσκονται σε cs50.net/quizzes. ΚΟΙΝΟ: κουίζ Slash, κάθετος 2013, κάθετο 0, και απλά κάντε κλικ μέσα κουίζ 2013 και κουίζ 0, αναθεωρήσει το τμήμα διαφάνειες. ΟΜΙΛΗΤΗΣ 1: Ναι, έτσι αν εσείς θέλετε να τραβήξτε προς τα επάνω και να κοιτάξουμε αυτό για σας δικό του υπολογιστή, αυτό είναι πάρα πολύ ωραία. Ας πούμε ότι και πάλι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι, [δεν ακούγεται] είναι η ψευδομεταβλητή. Ω, ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Όχι, απεργίες Δεν είναι για τις εξετάσεις. Συγνώμη, η ερώτησή της ήταν, ήταν απεργίες για τις εξετάσεις. Και αυτό δεν είναι. Έτσι, το chipset 0, εσείς θα πρέπει να έχουν όλα τα υλοποιηθεί κάτι χρησιμοποιώντας το μηδέν. Και μάθαμε κάποιες βασικές προγραμματισμού δομικά στοιχεία, χρησιμοποιώντας το μηδέν. Έτσι, ας ρίξουμε μια ματιά σε μερικά αυτών των δομικών μπλοκ που συνθέτουν ένα πρόγραμμα. Πρώτη είναι Boolean έκφραση. Boolean εκφράσεις είναι αυτές και 0 ή οτιδήποτε που έχει δύο πιθανές τιμές. Στην περίπτωση αυτή, αληθής ή ψευδής, ενεργοποίηση ή απενεργοποίηση, και ναι ή όχι. Ένα παράδειγμα από ένα απλό, πολύ απλό, πρόγραμμα που χρησιμοποιεί μια Boolean έκφραση εδώ. Έτσι, προκειμένου για Boolean εκφράσεις για να είναι χρήσιμο, έχουμε λογικούς τελεστές. Αυτές είναι φορείς που μπορούν να χρησιμοποιηθούν να συγκρίνει ορισμένες τιμές. Έτσι έχουμε και ή δεν είναι ίση με, μικρότερη από ή ίση με, ή μεγαλύτερη από ίσο προς, και λιγότερο από ή μεγαλύτερη από ό, τι. Αλλά αυτοί οι φορείς δεν είναι πολύ χρήσιμο αν μπορούμε να τα συνδυάσετε σε συνθήκες. Έτσι, εσείς μπορεί να θυμάστε από το μηδέν και από την p σας ορίζει ότι είχε όρους. Πρόκειται, ουσιαστικά, όπως πιρούνια σε η λογική του προγράμματος σας ότι εκτελεί ανάλογα με το αν η προϋπόθεση αυτή πληρούται. Έτσι, μία από τις προϋποθέσεις που είχαμε χρησιμοποιούνται πολλές φορές σε αυτή την πορεία είναι η if, else, αν και άλλος συνθήκες. Εδώ είναι ένα παράδειγμα του πώς μπορείτε να χρησιμοποιήσετε αυτό. Ξέρει κανείς τη διαφορά μεταξύ χρησιμοποιώντας μόνο αν δηλώσεις όλων ο τρόπος κάτω στίχους if, else, αν, και άλλο συνδυασμό; Ναι; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ακριβώς. Έτσι, αν είχα, αν όλος ο τρόπος κάτω αυτό τρόπο, ακόμη και αν ο όρος αυτός επιστρέφει αλήθεια, θα εξακολουθούν τις δοκιμές της επόμενης δύο. Ότι, με ένα άλλο-αν, ένα άλλο Προσωπικά, αν ο ένας επιστρέφει true, οι άλλοι δεν έχουν δοκιμαστεί. Οποιεσδήποτε ερωτήσεις σχετικά με αυτό; Cool. Έτσι, μπορείτε να χρησιμοποιήσετε ένα if-else από ένα άλλο Προσωπικά, αν γνωρίζετε ότι το μόνο που μπορεί είναι μία από αυτές τις περιπτώσεις. Έτσι γνωρίζουμε αν το x είναι μικρότερο από 0, είναι σίγουρα δεν πρόκειται να είναι μεγαλύτερη από μηδέν. Στη συνέχεια, ένα άλλο δομικό ότι μάθαμε είναι βρόχους. Έχουμε τρία είδη βρόχων. Για βρόχους, ενώ βρόχους, και να κάνει, ενώ βρόχους. Και γενικά, όταν κάθεστε να γράψω κάτι, θα πρέπει να αποφασίσει η οποία από τις τρεις που θέλετε να χρησιμοποιήσετε. Επομένως, πώς θα αποφασίσει ποια; Εμείς συνήθως χρησιμοποιούν ένα βρόχο αν γνωρίζουμε πόσες φορές θέλουμε να επαναλάβει μέσα από κάτι ή πόσες φορές θέλουμε να εκτελέσει μια εργασία. Χρησιμοποιούμε ενώ βρόχους αν χρειαζόμαστε κάποια προϋπόθεση για να είναι αληθινό για να συνεχίσει να τρέχει. Και χρησιμοποιούμε κάνουν, ενώ πολύ παρόμοια με ενώ, αλλά θέλουμε κωδικό μας να τρέξει σε τουλάχιστον μία φορά. Έτσι κάνει, ενώ, ό, τι είναι στην do θα τρέχει πάντα τουλάχιστον μία φορά. Ότι, με τον καιρό, αυτό Δεν μπορεί να τρέξει σε όλα, αν η κατάσταση δεν είναι ικανοποιημένος. Οποιεσδήποτε ερωτήσεις με αυτό; Έτσι δομή ενός βρόχου for. Εσείς έχετε δει όλοι αυτό. Μπορείτε να προετοιμαστεί. Έχετε κάποιο είδος της κατάστασης. Έτσι, για παράδειγμα, θα μπορούσαμε να προετοιμαστεί όπως για i ισούται με 0. i είναι μικρότερο από 10. Και εγώ ++. Πολύ απλά αυτό που έχουμε κάνει. Για ένα βρόχο, ενώ, ομοίως, έχετε να έχουν κάποιο είδος της προετοιμασίας, κάποιο είδος της κατάστασης, και κάποια ενημέρωση. Έτσι, μπορούμε να εφαρμόσουμε μας για βρόχο και ως ένα βρόχο while χρησιμοποιώντας αυτό. Και ομοίως με ένα do while loop, μπορεί να έχουμε κάποια προετοιμασία, εκτελέσει κάτι, ενημερώνει, και Στη συνέχεια ελέγξτε την κατάσταση. Μέχρι τώρα λειτουργεί. Βάζουμε όλα μαζί. Μπορούμε ίσως να θέλετε να γράψετε κάποια το είδος της λειτουργίας. Κοινή λειτουργία που μπορεί να έχουν δει ήδη είναι κύρια. Main είναι μια λειτουργία. Έχει ένα είδος επιστροφής, int. Έχει ένα όνομα συνάρτησης, κύρια. Και αυτό έχει επιχειρήματα, argc και argv. Έτσι κύριος είναι απλά μια λειτουργία. Άλλες λειτουργίες που μπορεί να χρησιμοποιηθεί, printf-- printf είναι μια function-- GetInt, toupper. Αλλά αυτά τυχαίνει να έχουν εφαρμοστεί για μας κάποιο είδος της βιβλιοθήκης. Αν εσείς θυμάστε συμπεριλαμβανομένου αυτή η βιβλιοθήκη CS50.h ή η πρότυπο I / O βιβλιοθήκη. Ναι, ερώτηση; ΚΟΙΝΟ: Είναι η κύρια σύμφυτη σε c; Μήπως αυτό ακριβώς το είδος του [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Το ερώτημα είναι αν ο κύριος είναι εγγενής στο γ. Και ναι, όλες οι λειτουργίες έχουν μια κύρια λειτουργία. Είναι το είδος των αναγκαίων για τον υπολογιστή να γνωρίζει από πού να αρχίσω εκτέλεση του κώδικα. ΚΟΙΝΟ: Έτσι δεν θα [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Όχι Οποιεσδήποτε άλλες ερωτήσεις; Cool. Έτσι ακριβώς όπως μπορείτε να χρησιμοποιήσετε μια λειτουργία ότι είναι γραμμένο για σας, μπορείτε επίσης να γράψε τη δική σου λειτουργία. Αυτή είναι μια λειτουργία που κάποιος θα μπορούσε έχουν γράψει για τον υπολογισμό του όγκου ενός q, για παράδειγμα. Υπάρχει ένα είδος επιστροφής εδώ, σε αυτή την περίπτωση int, μας όνομα της συνάρτησης q και μας Κατάλογος των παραμέτρων. Και σημειώστε ότι θα πρέπει να γράψετε τα δεδομένα τύπο της παραμέτρου που θέλετε να χρησιμοποιούν ή αλλιώς η λειτουργία δεν γνωρίζουν τι είδους παράμετρος θα πρέπει να είμαι αποδοχή. Έτσι, σε αυτή την περίπτωση, θέλουμε ένας ακέραιος ως συμβολή μας. Επομένως, γιατί θα μπορούσαμε να θέλετε να χρησιμοποιήσετε τις λειτουργίες; Πρώτα απ 'όλα, μεγάλη για την οργάνωση. Βοηθούν σπάσει τον κωδικό σας σε πιο οργανωμένη κομμάτια και να κάνουν ευκολότερο να διαβάσει. Απλούστευση. Αυτό είναι καλό για το σχεδιασμό. Όταν διαβάζετε ένα κομμάτι κώδικα και η κύρια λειτουργία του είναι πραγματικά, πολύ καιρό, θα μπορούσε να είναι πιο δύσκολο να λόγο για το τι συμβαίνει. Έτσι, αν το σπάσει σε λειτουργίες, θα μπορούσε να είναι πιο εύκολο να διαβάσει. Και επαναχρησιμοποίηση-ικανότητα. Εάν έχετε ένα κομμάτι του κώδικα που έχει να καλείται ή να τρέξει πολλές φορές, αντί της επανεγγραφής ότι ο κωδικός 10 φορές στην κύρια λειτουργία σας, ίσως θέλετε να το χρησιμοποιήσετε ξανά. Και στη συνέχεια, κάθε φορά που θα χρειαστεί να χρησιμοποιήσετε ότι κομμάτι του κώδικα, καλέστε τη λειτουργία. Έτσι τώρα, αν θυμηθούμε πίσω στο μηδέν, Μιλήσαμε επίσης για μερικές έννοιες, ένα από τα οποία είναι σπειρωμάτων. Το θέμα είναι η έννοια των πολλαπλών αλληλουχίες κωδικού εκτέλεσης κατά την ίδια στιγμή. Έτσι, σκεφτείτε την ημέρα εκείνη όπου ο David είχε εσείς υπολογίζει τον αριθμό των άνθρωποι στο δωμάτιο. Ουσιαστικά, τι συνέβαινε για είναι όλοι ήσασταν τρέχει ξεχωριστά νήματα. Και αυτά τα θέματα που έρχονταν μαζί να πάρει κάποιο είδος απάντησης. Ομοίως, στο Ξυστό, όταν έχετε πολλαπλές ξωτικά, ίσως έχουν μια γάτα και έναν σκύλο. Και θα είναι ταυτόχρονα τη λειτουργία των δικών τους σενάρια. Αυτό είναι ένα παράδειγμα του σπειρώματος. Και η άλλη έννοια που ήταν εισήχθη στο μηδέν ήταν τα γεγονότα. Και τα γεγονότα είναι όταν πολλά μέρη της κωδικό σας επικοινωνούν μεταξύ τους. Στο Scratch, αυτό ήταν όταν χρησιμοποιείται η ελέγχου εκπομπής και η Όταν Λήψη μπλοκ. Και, επίσης, στο πρόβλημα Set 4, είδαμε ένα μικρό κομμάτι των εκδηλώσεων, καθώς και. Εσείς θα μπορούσε να χρησιμοποιηθεί η βιβλιοθήκη Gevent. Και υπήρχε μια λειτουργία waitForClick στην οποία περίμενες για το χρήστη να κάνει κλικ. Και σας κλικ, στην περίπτωση αυτή, θα ήταν το γεγονός και περιμένουμε κλικ είναι σας χειρισμού συμβάντων. Και, επίσης, καθ 'όλη τη λειτουργία psets σας και εργάζονται σε psets σας, μπορεί να έχουν έρθει σε επαφή με ορισμένες από αυτές τις εντολές. Αυτό είναι ό, τι έχετε πληκτρολογήσει σε σας τερματικό παράθυρο ή οτιδήποτε παράθυρο που εμφανίζεται στην g edit σας, κατ 'ουσίαν, την πλοήγηση του υπολογιστή σας. Έτσι, για παράδειγμα, LS παραθέτει η περιεχόμενα ενός καταλόγου. Κάντε κατάλογο δημιουργεί ένα νέο φάκελο. CD, κατάλογο αλλαγή. RM, αφαίρεση, διαγράφει ένα αρχείο ή κάποιο κατάλογο. Και στη συνέχεια, αφαιρέστε τον κατάλογο Καταργεί έναν κατάλογο. ΚΟΙΝΟ: [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Ναι, σίγουρα. Δυστυχώς, η ερώτηση ήταν αν Θα πρότεινα αυτό το για το σκονάκι. Θα μπορούσε να βοηθήσει. Αν έχετε χώρο, μπορείτε να το βάλετε σε. Είναι, επίσης, απλά σε γενικές γραμμές αρκετά καλό να θυμάστε γιατί όταν το χρησιμοποιείτε ίσως να θέλετε απλά να έχουν απομνημονεύσει. Αυτό θα κάνει τη ζωή σας πολύ ευκολότερη. Μήπως μπορώ να απαντήσω στην ερώτησή σας; Μέχρι τώρα, μιλήσαμε λίγο εν συντομία σχετικά με τις βιβλιοθήκες. Αλλά τα δύο κύρια αυτά που έχουμε πάει χρησιμοποιώντας μέχρι στιγμής στην πορεία είναι πρότυπο I / O και CS50. Τι είδους πράγματα συμπεριλαμβάνονται στο πρότυπο / O βιβλιοθήκη μου; Ναι, μέχρι στιγμής έχουμε χρησιμοποιήσει printf. Σε CS50, έχουμε χρησιμοποιήσει GetInt και GetString. Και η σειρά τύπου δεδομένων συμβαίνει επίσης πρέπει να δηλώνονται σε αυτή τη βιβλιοθήκη CS50. Θα μιλήσουμε λίγο περισσότερο σε βάθος περίπου πώς οι βιβλιοθήκες λειτουργούν και πώς αλληλεπιδρούν με το υπόλοιπο του κωδικού σας. Αλλά αυτές είναι οι δύο κυριότερες ότι εμείς έχουν έρθει σε επαφή με το βαθμό στον το μάθημα. Τύποι. Αυτά είναι καλό να θυμόμαστε πόσο κάθε τύπος αντιπροσωπεύεται από ή πώς πολλά bytes το καθένα τύπου requires-- int, 4 bytes? char, 1 byte. Float είναι 4 bytes. Τι είναι ένα διπλό; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι, έτσι, ένα πλωτήρα αλλά διπλασιάσει το μέγεθος. Τι θα γίνει με ένα μεγάλο χρονικό διάστημα; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: OK. Αυτό είναι ένα μεγάλο χρονικό διάστημα; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι, να διπλασιάσει int. Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Long [δεν ακούγεται]. Και στη συνέχεια μια μακρά μακρά είναι διπλάσιο από αυτό. ΚΟΙΝΟ: Όχι, όχι. Μια μεγάλη είναι απλά ένας int. Εξαρτάται από την αρχιτεκτονική πριν το [δεν ακούγεται] και int έχουν το ίδιο μέγεθος. [Δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Έτσι, μια μακρά και ένας int είναι το ίδιο. Και στη συνέχεια μια μακρά μακρά είναι διπλάσιο από το int. Cool. Και τότε, αυτό είναι το τελευταίο είδος; ΚΟΙΝΟ: Pointer. ΟΜΙΛΗΤΗΣ 1: Ναι, έτσι μάθαμε λίγο σχετικά με τους δείκτες. Και ανεξάρτητα από το τι είναι ένας δείκτης δείχνοντας να-- θα μπορούσε να είναι ένα αστέρι char ή int star-- Είναι πάντα 4 bytes για ένα δείκτη. Ερωτήσεις σχετικά με αυτό; Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Έτσι, μια μεγάλη και μια int είναι η ίδια σε αυτή τη συσκευή CS50. ΚΟΙΝΟ: Η συσκευή είναι πλήρως εναλλάξιμα. ΟΜΙΛΗΤΗΣ 1: Ναι. Μέχρι τότε μια μακρά μακρά είναι διπλή η int. ΚΟΙΝΟ: Αυτή είναι η 32 bit; ΟΜΙΛΗΤΗΣ 1: 32 bit, ναι. ΚΟΙΝΟ: Έτσι [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Ναι, αν δεν το κάνει λένε ρητά, σας πρέπει να αναλάβει ένα 32 bit. ΚΟΙΝΟ: Θα πω κάτι όπως και υποθέτοντας μια αρχιτεκτονική σαν τη συσκευή. Για 64 bit, τα μόνα πράγματα που αλλαγή είναι λονγκ και δείκτες. Και οι δύο [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι; ΚΟΙΝΟ: Ερώτηση. Έτσι, σε ένα από τα κουίζ πρακτική, ζητά για μια unsigned int. Λοιπόν, πώς θα ήταν αυτό να προσδιορίζεται από έναν int [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Μια ανυπόγραφη σε επίσης 4 bytes. Αλλά αυτό είναι διαφορετικό για μια υπογεγραμμένη int και ένα ανυπόγραφο int; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Δεξιά. Κάποιος μπορεί να αντιπροσωπεύουν αρνητικές τιμές. Αλλά πώς το κάνει αυτό; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι, εξοικονομεί 1 bit για την αναπαράσταση σημάδι. Η υπογεγραμμένη έχει ένα bit που αντιπροσωπεύει το σημάδι. Και ανυπόγραφο ακριβώς είναι όλα θετικά. ΚΟΙΝΟ: OK. Οπότε λέτε ότι είναι ένα διπλό δύο φορές το μέγεθος του πλωτήρα; ΟΜΙΛΗΤΗΣ 1: Διπλή είναι δύο φορές το μέγεθος του πλωτήρα, ναι. ΚΟΙΝΟ: Πώς ένα δείκτη σε μια μακρά μακρά [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Έτσι, το ερώτημα είναι πώς ο δείκτης για μια μακρά long-- πώς είναι ότι μόνο τέσσερα bytes όταν μια μακρά μακρά 8 bytes του. Έτσι, να θυμάστε τι είναι ένας δείκτης, ουσιαστικά, στην ίδια τιμή βάσης. ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ναι, έτσι, ένα δείκτη είναι απλά μια θέση μνήμης. Έτσι, δεν έχει σημασία πόσο διάστημα ότι ο δείκτης δείχνει να. Χρειάζεται μόνο 4 bytes να παρακολουθείτε από αυτή τη θέση μνήμης. Οποιεσδήποτε άλλες ερωτήσεις; Cool. Έτσι το τελευταίο πράγμα που έχω είναι τυπική έξοδο. Θα πρέπει να χρησιμοποιείτε συχνά αρκεί το γεγονός ότι μπορείτε να θυμηθείτε. Αλλά αυτό είναι όταν χρησιμοποιούμε printf, για παράδειγμα. Και έχουμε αυτά τα σύμβολα κράτησης θέσης ότι κλήθηκαν κωδικούς μορφή. Έτσι τοις εκατό γ char, τοις εκατό i για int, και μπορούμε επίσης να χρησιμοποιήσετε τοις εκατό d. Είναι το ίδιο πράγμα. Αλλά, σε γενικές γραμμές, σε CS50 μας προσπαθήστε να χρησιμοποιήσετε τοις εκατό i. Ποσοστό f για float. Ποσοστό ld για πολύ καιρό και s τοις εκατό για κορδόνι. Ομοίως, έχουμε χρησιμοποιήσει μερικά από αυτές τις αλληλουχίες διαφυγής. Για παράδειγμα, backslash n για τη νέα γραμμή. Αυτό είναι μόνο για όταν είστε μορφοποίηση κωδικό σας για εκτύπωση f. Ναι; ΚΟΙΝΟ: Τι είναι τοις εκατό d για; ΟΜΙΛΗΤΗΣ 1: Έτσι, το ερώτημα είναι ό, τι είναι τοις εκατό d για; Ποσοστό d είναι για ints. Τοις εκατό τοις εκατό d και Ι είναι τα ίδια. ΚΟΙΝΟ: Ποια είναι η διαφορά μεταξύ backslash n και backslash r; ΟΜΙΛΗΤΗΣ 1: Έτσι, το ερώτημα είναι ποια είναι η διαφορά μεταξύ αντίδραση n και σπασμωδική κίνηση r; Νομίζω backslash r is-- ΚΟΙΝΟ: Έτσι backslash r συνεπάγεται μόνο επιστρέφει στην αρχή της γραμμής χωρίς στην πραγματικότητα πρόκειται για μια νέα γραμμή. Έτσι, αν εκτυπώσετε ένα backslash r και να επιστρέψετε στην αρχή της γραμμής Στη συνέχεια μπορείτε να εκτυπώσετε περισσότερα πράγματα, μπορείτε να αντικαταστήσετε τα πράγματα που είναι ήδη σε [Δεν ακούγεται]. Ότι, η πραγματικότητα πηγαίνει σε ένα νέο γραμμή και πηγαίνει σε [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Λοιπόν, οποιεσδήποτε άλλες ερωτήσεις; Εντάξει. Πάω να το χέρι μακριά για να Dan που θα συνεχιστεί. [Χειροκρότημα] DAN: Εντάξει. Γι 'αυτό θα πρέπει να μιλάμε για μια άλλη μεγάλη εύρος των ιδεών από την τάξη που είναι περίπου εκπρόσωπος των δύο εβδομάδων και η έναρξη των τριών εβδομάδων ξεκινώντας με χύτευση, η οποία είναι απλά ένας τρόπος για να κατεργασία μιας αξίας ενός ορισμένου τύπου ως μια αξία ενός διαφορετικού τύπου. Έτσι, μπορούμε να το κάνουμε αυτό με χαρακτήρες σε ints, επιπλέει σε ακέραιο, και μεγάλη λαχταρά να διπλασιαστεί. Όλα αυτά τα πράγματα μπορούν να χρησιμοποιηθούν ως τρόπους θεραπείας κάποια αριθμητική τιμή μείον char όπως κάποια άλλα αριθμητική τιμή. Έτσι, υπάρχουν ορισμένα ζητήματα με αυτό, του Φυσικά, το οποίο έρχεται όταν ρίχνει πράγματα όπως float σε ακέραιο. Έτσι, αυτό είναι λίγο περίεργο. Έχουμε έναν πλωτήρα που είναι 1.31. Εμείς το πολλαπλασιάζουμε με 10.000. Και τότε μπορούμε να το εκτυπώσετε ως int. Τι κάνει αυτή η παραγωγή; 10.000 φορές 1.31. Έτσι 13.000, είναι ότι η εικασία; ΚΟΙΝΟ: Νομίζω ότι είναι 10.000. DAN: Έτσι είμαι το πολλαπλασιάζοντας από 10.000 πριν είμαι το casting. ΚΟΙΝΟ: Αχ. Δεν θα υπάρξει ένα 9 και μερικοί 0 αριθμούς; DAN: Μπορείτε να έχετε μερικά περίεργα ψηφία. Έτσι ακριβώς, είναι 1,3 φορές 10,000. Έτσι, αυτό είναι 13.000. Και αυτή η επιπλέον weird-- ΚΟΙΝΟ: 13,100. DAN: 13,100. Σας ευχαριστώ, Rob. Και αυτή η επιπλέον weirdness-- Αυτό 9,9-- Είναι απλώς και μόνο επειδή αυτή χύτευση καταλήξαμε στρογγυλοποίηση προς τα κάτω, όπου αυτό δεν θα πρέπει να έχουν. Ναι. ΚΟΙΝΟ: Η χύτευση γίνεται μετά από οτιδήποτε άλλο; DAN: Έτσι, γιατί έχω αυτό σε έντυπη μορφή, το κάνει αυτό πολλαπλασιασμό πριν κάνει αυτό το casting. ΚΟΙΝΟ: [δεν ακούγεται]. DAN: Νομίζω ότι θα ρίξει το πρώτο, ναι, ποια θα είναι 10.000. Οτιδήποτε άλλο; Cool. Έτσι, αυτό είναι 13.099. Γιατί συμβαίνει αυτό; Η ανακρίβεια. Πλωτήρες δεν είναι τέλεια. Μπορούν να αντιπροσωπεύουν μόνο τους αριθμούς σε μια ορισμένα σημαντικά στοιχεία. Έτσι, αν θέλουμε να εκτυπώσετε 8 σύκα sig στις Αυτό float, έχουμε ένα είδος άσχημο αριθμό ψάχνετε. Και αυτό γιατί 1.31 δεν μπορεί με ακρίβεια να αντιπροσωπεύεται από απλή αρμοδιότητες των δύο στο μηχάνημα. Έτσι, καταλήγει να λαμβάνει το πλησιέστερο Υποθέτω, η οποία καταλήγει είναι λίγο χαμηλή. Νόημα; OK. Τώρα, ενεργοποιημένο είναι ένας διαφορετικός τρόπος κάνει δηλώσεις υπό όρους, όπου όλα τα νοιαζόμαστε είναι μια μόνο μεταβλητή. Έτσι, σε αυτό το συγκεκριμένο παράδειγμα, είμαστε πάρει έναν ακέραιο από το χρήστη. Και τότε ψάχνουμε τι είναι ακέραιος. Προφανώς, αυτό είναι ο αριθμός μεταξύ ενός και τεσσάρων. Γι 'αυτό ζητάμε. Έτσι κάνετε μια αλλαγή της το όνομα της μεταβλητής. Στη συνέχεια, θα δημιουργήσει τις περιπτώσεις πιθανών εκτιμά ότι θα μπορούσε να είναι. Έτσι μία περίπτωση, λένε ότι είναι χαμηλή. Και τότε θα σπάσει για να βγούμε της κατάστασης του διακόπτη έτσι δεν συνεχίζω. Στην επόμενη case-- έτσι περίπτωση δύο και περίπτωση three-- αν είναι υπόθεση δύο πέφτει ακριβώς κάτω η πρώτη γραμμή του κώδικα που βλέπει όπως με διάκριση των τριών ετών μέχρι βλέπει ένα διάλειμμα. Έτσι, ο λόγος για να πάρετε μία περίπτωση να μόνο χαμηλή εκτύπωσης είναι γιατί έχουν αυτό το διάλειμμα εδώ. Αν, ας πούμε, αγνόησε αυτό break-- αν μου πέταξε αυτό breakaway-- θα εκτυπώσει χαμηλή, και, στη συνέχεια, θα ήταν εκτύπωση μέση, και τότε θα σπάσει. Έτσι, τα διαλείμματα είναι ένα σημαντικό μέρος εναλλαγή των όρων και θα πρέπει να είναι εκεί. Τυχόν περιπτώσεις που δεν αναφέρονται ρητά αντιμετωπίζονται από την προεπιλογή περίπτωση στο διακόπτη και θα πρέπει να πεταχτεί. ΚΟΙΝΟ: So 1, 2, 3, και 4 θα ήταν ν? DAN: Αξίες που n μπορεί να είναι. Ναι. Ναι; ΚΟΙΝΟ: Έτσι, όταν έχετε ότι [δεν ακούγεται]; DAN: Μπορείτε να εκτυπώσετε χαμηλά, και, στη συνέχεια, θα εκτυπώσετε μέση, και τότε θα σπάσει. ΚΟΙΝΟ: Γιατί να το εκτυπώσετε μέση αν [δεν ακούγεται]; DAN: Έτσι τα πάντα κάτω από μια υπόθεση πριν από ένα διάλειμμα πέφτει κάτω. Έτσι, μία περίπτωση εκτύπωσης είναι κάτω περίπτωση ένα όπως είναι αυτό ακόλουθα εκτύπωσης. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Λοιπόν αυτός ο αριθμός είναι μόνο ένα συγκεκριμένο αξία που αυτή η μεταβλητή μπορεί να πάρει, σωστά; Μήπως αυτό έχει νόημα; Ναι. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, περίπτωση δύο θα εκτυπώσετε μεσαία και στη συνέχεια να σπάσει. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Νομίζω ότι οποιοσδήποτε; Ποια άλλα είδη δεδομένων μπορείτε να αλλάξετε πάνω; ΚΟΙΝΟ: Μπορείτε να αλλάξετε πάνω από οποιοδήποτε τύπο δεδομένων. Αλλά αυτό σημαίνει μόνο κάτι πάνω χαρακτήρες και ints και τέτοια πράγματα, γιατί αν είστε μετάβαση ενός δείκτη ότι δεν έχει νόημα, μετάβαση φορτία, αν αφήσει ακόμη και το να το κάνετε αυτό, λόγω της κινητής υποδιαστολής στην ακρίβεια, δεν θα ήταν πραγματικά θέλω να το κάνω έτσι κι αλλιώς. Έτσι, λίγο πολύ, απλά ints και χαρακτήρες και τα πράγματα όπως αυτό. DAN: Ναι, αυτό είναι όταν έχετε ρητή αξίες που ξέρετε, νομίζω, μπορεί να είναι ότι ένας διακόπτης είναι πραγματικά χρήσιμο. Καλή; OK. Πεδίο εφαρμογής είναι η περιοχή που διακηρυγμένο μεταβλητής επεκτείνεται. Έτσι, σε αυτό το μικρό κομμάτι του κώδικα που έχω, θα ήταν γεμάτη από σφάλματα. Και ο λόγος είναι ότι δηλώσει αυτό το int i εντός του πεδίου για αυτό βρόχου. Και τότε εγώ προσπαθώ να αναφέρονται ότι i έξω από αυτό για το πεδίο βρόχου. Έτσι, βασικά, μπορείτε να σκεφτείτε για το πεδίο εφαρμογής ως κάτι που δηλώνετε με μέσα σε ένα σύνολο από αγκύλες μόνο υπάρχει μέσα σε αυτές τις αγκύλες. Και αν προσπαθήσετε και να χρησιμοποιεί το εν λόγω μεταβλητή εκτός από τις αγκύλες, εσείς θα πάρετε ένα λάθος από τον compiler. Ναι; ΚΟΙΝΟ: Έτσι, αυτό δεν λειτουργεί; DAN: Αυτό δεν λειτουργεί, ναι. Strings. String ένα char *. Είναι ακριβώς το ίδιο. Είναι απλά Δείκτες στους χαρακτήρες. Και όλα τα έγχορδα που έχετε θα πρέπει να τελειώσει με backslash μηδέν, το οποίο είναι ακριβώς ένα γ σύμβαση. Καλείται το NULL τερματισμού. Και NULL-- κεφάλαιο Β, κεφάλαιο U, κεφάλαιο L, πρωτεύουσα εγώ-- δεν είναι η ίδια με την NULL τερματιστή. Αυτός είναι ένας δείκτης. Αυτό είναι ένας χαρακτήρας. Είναι πολύ διακριτές. Θυμηθείτε αυτό. Θα είναι στο κουίζ, μάλλον. Δεν έχω δει το κουίζ. Ναι; ΚΟΙΝΟ: Έτσι NULL είναι, ας πούμε, ο δείκτης; DAN: Ναι. ΚΟΙΝΟ: Τι κάνει [δεν ακούγεται]; DAN: Αν, ας πούμε, malloc καλείται όταν δεν έχουν αρκετή μνήμη για να ανεξάρτητα από το μέγεθος που ζητάς, malloc θα επιστρέψει NULL. Είναι, ουσιαστικά, κάθε φορά που μια λειτουργία είναι υποτίθεται ότι θα επιστρέψει ένα δείκτη, μπορείτε πρέπει να ελέγξετε κατά NULL επειδή NULL είναι ένα όμορφο good-- Είναι, είδος, η αξία σκουπίδια. Είναι ένα μηδενικό όσο δείκτες πάει. Όποτε μπορείτε να καλέσετε μια συνάρτηση, ότι επιστρέφει ένα δείκτη. Θα πάμε να θέλετε να ελέγξετε για να βεβαιωθείτε ότι δεν είναι δείκτης NULL επειδή NULL είναι πολύ κοινή. Είναι ένα είδος επιστροφής σκουπίδια. Έτσι, αν κάτι δεν πάει σωστά, μόλις επιστρέψει NULL αντ 'αυτού. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, και αυτό είναι αυτό. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: το Spell σαν αυτό. Είναι η τερματισμού NULL. Είναι πεζά Ν-U-L-L εάν θα φαινόταν ότι ορθογραφία. ΚΟΙΝΟ: Και εγώ απλά πήγε πίσω και να δοκιμαστεί. Και αν προσπαθήσετε να βάλετε ένα πλωτό σημείο αξία σε ένα διακόπτη, θα φωνάζω σε σας λέγοντας, ανακοίνωση απαιτεί την έκφραση του ακεραίου τύπου. DAN: Εκεί θα πάτε. Αλλά ναι, ποια ήταν η ερώτηση πάλι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Έτσι κεφάλαιο Β, κεφάλαιο U, κεφάλαιο L, πρωτεύουσα L είναι μια πραγματική γ πράγμα. Είναι ο δείκτης NULL και θα να αντιμετωπίζονται ως τέτοια. Δεν πρόκειται ποτέ να προσπαθήσουμε και να σημάνει το NULL χαρακτήρα και δείτε κάθε άλλο τρόπο από αυτό. Ναι; ΚΟΙΝΟ: Έτσι επιστρέφουν στην char max ή κάτι στις σημειώσεις, θα είναι ενσαρκώνουν την ίδια λειτουργία όπως [δεν ακούγεται]; ΚΟΙΝΟ: Έτσι αναφέρεσαι επιστρέφει char max από getchar, ή ό, τι είναι; ΚΟΙΝΟ: Ναι. ΚΟΙΝΟ: Ναι, έτσι το γενικό όρος για όλα αυτά τα πράγματα είναι δείκτες τιμών. Έτσι όπως την επιστροφή int max από GetInt και char max από getchar, είναι υποτίθεται ότι είναι σαν, εντάξει, αν αυτά τα πράγματα επιστρέφουν σε μας, κάτι πήγε στραβά. Για δείκτες, εμείς απλώς τυχαίνει να έχουν αυτή η τιμή φρουρού ότι ο καθένας συμφωνεί μετά. Και αυτό είναι το πράγμα που επιστρέφουν όταν τα πράγματα πάνε στραβά. Έτσι char max είναι αυτό που είμαστε χρησιμοποιώντας να αντιπροσωπεύουν κάτι όπως NULL ή getchar. ΚΟΙΝΟ: Έτσι, αν είστε δοκιμή getchar, θα μπορούσε απλά βάζετε NULL; Αυτός θα κάνει τη διαφορά; DAN: Μπορείτε δεν θα μπορούσε απλά ελέγξτε NULL. Θα έπρεπε να ελέγχει char max, διότι η τιμή επιστροφής από τη λειτουργία ένας χαρακτήρας δεν είναι ένας δείκτης. Ναι; ΚΟΙΝΟ: Αυτή η ερώτηση ζητά για το μήκος συμβολοσειράς. Μήπως αυτό περιλαμβάνει την NULL χαρακτήρα; DAN: Όχι Και αυτό είναι στην πραγματικότητα το πώς μήκος συμβολοσειράς ξέρει να σταματήσει γιατί περνά μέσα από σειρά σας χαρακτήρες μέχρι βλέπει ένα χαρακτήρα NULL. Και τότε είναι σαν όλα Εντάξει, τελείωσα. ΚΟΙΝΟ: [δεν ακούγεται] πέντε; DAN: Γεια σας θα είναι πέντε. Ναι. Έτσι συστοιχίες είναι συνεχής μπλοκ της μνήμης. Έχουν άμεση πρόσβαση λέγοντας το το όνομα του πίνακα και, στη συνέχεια, σε σγουρά τιράντες, ό, τι ευρετήριο που θέλετε να πάτε να, από όπου και αν αναπροσαρμόζονται από μηδέν έως το μήκος της συστοιχίας μείον 1. Και όπου και αν δηλωθεί από τον τύπο της πράγμα που είστε αποθήκευση στο συστοιχία, το όνομα του πίνακα, και έπειτα ανεξάρτητα από το μέγεθος είναι της εν λόγω συστοιχίας. Έτσι, αυτό είναι ένα char array μήκους έξι που έχει αυτές τις τιμές. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Αν έχετε τι συμβαίνει στον πίνακα που έχει ήδη σημειωθεί. Έτσι, μπορείτε να ορίσετε αυτό αντί ως, ας πούμε, char, ανεξάρτητα από το όνομα του σας array είναι κενό παρένθεση ισούται με σγουρά Προετοιμαστείτε H κόμμα E κόμμα L κόμμα L κόμμα O κόμμα NULL χαρακτήρα και σγουρά κηδεμόνα. Αυτό θα μπορούσε να λειτουργήσει και ως μια δήλωση. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Στη συνέχεια θα πρέπει να έχουν το μέγεθος που έχει ήδη σημειωθεί. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι. Εντάξει. Τα επιχειρήματα της γραμμής εντολών είναι ένας τρόπος να πάρει είσοδο από το χρήστη, όπως επιχειρήματα για την κύρια. Κύρια παίρνει δύο επιχειρήματα. Ο αριθμός των επιχειρημάτων που είναι πέρασε κατά μήκος της γραμμής εντολών και διάνυσμα σειράς ή μια σειρά εγχόρδων από όλα τα επιχειρήματα. Έτσι, αν, ας πούμε, που ονομάζεται μια λειτουργία, όπως μια τελεία από 1 χώρος, 2 χώρο, τρία, argc θα είναι 4. Και το argv 0 θα ήταν μια τελεία έξω. Argv1 θα είναι 1. argv2 θα είναι 2 argv3 θα είναι 3, σε αυτή τη συγκεκριμένη περίπτωση. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Το τελευταίο στοιχείο του πίνακα γιατί η σειρά είναι το μήκος argc συν ένα από argB, το τελευταίο στοιχείο είναι ο δείκτης NULL. Είναι argc συν 1. Έτσι, στην περίπτωση που μόλις είπα, είναι θα argv 0 είναι μια κουκίδα έξω. argv 1 είναι 1 argv2 είναι 2 argv 3 είναι 3. argv 4, το οποίο είναι ένα μεγαλύτερο από argc θα είναι NULL. Και αυτό είναι το NULL δείκτη. Ναι. Και αυτό γιατί string είναι ένα αστέρι char είναι ένας δείκτης. Έτσι πρέπει να είναι του ίδιου τύπου. Ναι; ΚΟΙΝΟ: Δύο ερωτήσεις. Έτσι ένα, ποια είναι η διαφορά μεταξύ αυτό και GetString εκτός από ένα τύπο στον κινητήρα χρήστη; Και τα δύο, είναι να αποθηκεύονται μέσα πρόσφατη μνήμη σας; Έτσι, όπως, GetString θα είναι [δεν ακούγεται]; DAN: Πού είναι αποθηκευμένα; Δεν ξέρω πού είναι αποθηκευμένο. ΚΟΙΝΟ: Έτσι, στην πραγματικότητα, ξέρετε πώς κάποια λειτουργούν καλείτε είναι επιχειρήματα αποθηκεύονται στη στοίβα; Έτσι argc και argv είναι τα επιχειρήματα για κύρια και βρίσκονται στη στοίβα, ή πραγματικά ακριβώς πάνω από ό, τι νομίζετε, όπως η έναρξη της στοίβας. Ποιο ήταν το άλλο μέρος από την ερώτηση; ΚΟΙΝΟ: Έτσι ποια είναι η [δεν ακούγεται]; DAN: Ναι, αυτό είναι απλά ένα διαφορετικό τρόπο να πάρει είσοδο από το χρήστη. Ελαφρώς πιο αποτελεσματική και αυτό είναι είναι πιο εύχρηστος για σενάρια, γιατί μπορούν να περάσουν μόνο τα επιχειρήματα με κύρια σας λειτουργία, αντί να χρειάζεται να περιμένουν για τους χρήστες, αν δεν έχετε καμία χρήστες. ΚΟΙΝΟ: Και ναι, να πάρει χορδές θα είναι [δεν ακούγεται]. Θα αποθηκεύουν τα πράγματα που χρειάζεστε. DAN: Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, argv 0 περιλαμβάνει πάντα το dot κάθετο της κλήσης λειτουργίας. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, κάθε ένα από τα επιχειρήματα είναι έληξε χαρακτήρα NULL επειδή είναι χορδές. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, argv argc είναι ένας δείκτης NULL. ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ω ναι. Ναι, συγνώμη. ΚΟΙΝΟ: Έτσι [δεν ακούγεται]; DAN: Έτσι, το ερώτημα είναι αν είχατε το γραμμή εντολών dot κάθετο μια τελεία από 1, 2, θα ήταν ο αριθμός της γραμμής εντολών επιχειρήματα είναι δύο ή θα είναι τρεις; ΚΟΙΝΟ: Νομίζω ότι δεν πραγματικά έχει σημασία. Τείνω να πω, αχ, δεν έχετε περάσει οποιαδήποτε επιχειρήματα της γραμμής εντολών, όταν, Προφανώς, σας κάλεσε τη λειτουργία. Έχω λοιπόν την τάση να αποκλείουν φωνητικά η λειτουργία από τη γραμμή εντολών επιχειρήματα, ακόμη κι αν είναι περιλαμβάνονται στο argv. DAN: Αλλά αν ήταν στο test-- yeah-- και αν πω κάτι όπως argc ισούται με 3, είστε σε ασφαλή κατάσταση. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Νομίζω ότι αν αντί για την κλήση αυτή στο argc και κορδόνι παρένθεση argv αλλά κράτησε τους ίδιους τύπους και απλά καλείται τους κάτι διαφορετικό, όπως ένα και b, θα εξακολουθεί να λειτουργεί; Και θα εξακολουθούν να εργάζονται, θα μόνο-- αντί της χρησιμοποίησης argc-- θέλετε να χρησιμοποιήσετε a και b. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Έτσι, το ερώτημα είναι GetString είναι πρόκειται να αποθηκεύσετε μνήμη στο σωρό επειδή GetString είναι char *. Αποθηκεύει μνήμη στο σωρό, διότι καλεί τώρα malloc στο πραγματικό εφαρμογή του GetString. Εντάξει, κινείται. Ασφάλεια. Έτσι, για να είναι πραγματικά ασφαλές, θα βασίζονται σε καμία μια και θα επιτρέψει σε κανέναν την πρόσβαση σε οποιοδήποτε των πληροφοριών σας, η οποία είναι ο λόγος ο καθένας χτίζει τις δικές τους μηχανές, τα δικά τους λειτουργικά συστήματα, όλους τους προγράμματα από το μηδέν, και προφανώς δεν συνδεθεί με οποιαδήποτε άλλα μηχανήματα μέσω του διαδικτύου. Έτσι, οι υπολογιστές είναι ανασφαλής. Είναι πραγματικά είναι. Πρέπει να εμπιστευόμαστε τους άλλους ανθρώπους. Και η ιδέα της ασφάλειας είναι ότι είστε προσπαθούν να περιορίσουν την ποσότητα του την εμπιστοσύνη που χρειάζεστε. Και ένα από τα μέσα για να το κάνεις αυτό είναι μέσω της κρυπτογραφίας. Η κρυπτογραφία είναι, κατ 'ουσίαν, έχουμε μυστικά. Μερικές φορές πρέπει να περάσουν τα μυστικά μας μαζί με, ας πούμε, το διαδίκτυο ή άλλα πράγματα. Και δεν θέλουμε ανθρώπους να γνωρίζουν αυτά τα μυστικά. Έτσι μπορούμε να κρυπτογραφήσετε τα μυστικά μας σε έναν τρόπο που ελπίζουμε ότι κανείς δεν μπορεί να καταλάβει. Γι 'αυτό και used-- μέσα από την πορεία αυτής της class-- πράγματα όπως το Caesar cipher και [Δεν ακούγεται], η οποία είναι τόσο πολύ, πολύ ανασφαλής τρόπους κρυπτογράφηση πράγματα. Είναι εύκολο να καταλάβω τι είναι και ποια είναι τα μυστικά σας. Ο πραγματικός κόσμος χρησιμοποιεί πολύ περισσότερα περίπλοκη συστήματα κρυπτογράφησης. Και εμείς δεν θα μπει πολύ περισσότερο από αυτό. Εντοπισμού σφαλμάτων. GDB είναι το καλύτερο. Πάω να το τονίσω και πάλι. Χρησιμοποιήστε GDB όλη την ώρα κάθε φορά που έχετε ένα πρόβλημα. Εντολές που είναι χρήσιμα στην GDB είναι σπάσει, η οποία θα περάσει ούτε μια γραμμή αριθμό, ένα όνομα συνάρτησης, κατ 'ουσίαν όπου το κωδικό σας θέλετε να σταματήσετε, και να είναι σε θέση να αναλάβει τον έλεγχο. Εκτύπωση παίρνει μια μεταβλητή και εκτυπώνει ό, τι η μεταβλητή είναι στο ότι σημείο στην εκτέλεση σας. Στη συνέχεια κινείται εκτέλεση σας κατά μήκος ένα βήμα. Και βήμα βήματα μέσα σε μια συνάρτηση σε εκτέλεση σας. Άλλα πράγματα τρέχουν, το οποίο είναι το πώς τρέχετε πραγματικά τον κωδικό σας. Συνεχίστε να λαμβάνει όλα τα μέτρα που απαιτούνται για να πάρει στο επόμενο σημείο καμπής. Και υπάρχουν πολλοί, πολλοί άλλοι. Κοιτάξτε τους επάνω. Είναι μεγάλη. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι, το οποίο είναι ένα πρόγραμμα εντοπισμού σφαλμάτων. Έτσι, ένα πρόγραμμα εντοπισμού σφαλμάτων είναι ένα πρόγραμμα το οποίο σας επιτρέπει να διορθώσετε το πρόγραμμά σας. Δεν είναι ένα πρόγραμμα που βρίσκει σφάλματα για σας, αν και αυτό θα ήταν μεγάλη. Και το τελευταίο για μένα είναι η αναζήτηση. Έτσι, τα είδη της αναζήτησης που μιλήσαμε περίπου σε αυτή την κατηγορία είναι γραμμική αναζήτηση, το οποίο είναι ακριβώς ότι ψάχνετε μέσα από κάθε στοιχείο του χώρου αναζήτησης, ένας στοιχείο κάθε φορά, μέχρι να βρείτε αυτό που ψάχνετε ή μέχρι να φτάσετε το τέλος του χώρου αναζήτησης στην οποία σημείο λέτε ότι δεν μπορούσε να βρει το στοιχείο που ψάχνατε. Και αυτό παίρνει στην καλύτερη σταθερό χρόνο, η οποία είναι 0 από 1 και στη χειρότερη γραμμική φορά, η οποία είναι 0 από n. Δυαδική αναζήτηση, η οποία χρειάζεται άθλιες στοιχεία. Μπορείτε να πάτε στο κέντρο των στοιχείων σας, δείτε εάν το στοιχείο που αναζητάτε είναι μεγαλύτερο ή μικρότερο από το στοιχείο ότι είστε στη μέση. Θα είναι μεγαλύτερο, λέτε ότι το κάτω μέρος της αναζήτησής σας χώρο είναι σας τρέχουσα θέση, στη μέση, και την επανεκκίνηση της διαδικασίας. Αν είναι μικρότερο, θα δούμε να πω ότι στο-- ναι, τι συμβαίνει; ΚΟΙΝΟ: [δεν ακούγεται]; DAN: Ναι. Κάθε είδος του είδους που έχει διδαχθεί σε η κατηγορία είναι δίκαιο παιχνίδι για τη δοκιμή. [Γέλια] DAN: Και το γεγονός ότι δεν είχατε να το κάνει για ένα σύνολο το πρόβλημα, είναι δίκαιο παιχνίδι για τη δοκιμή. ΚΟΙΝΟ: Μπορούμε να πάμε πέρα ​​από το πώς να-- DAN: Θα περάσει πάνω. ΟΜΙΛΗΤΗΣ 2: Το πραγματικό κώδικα για [Δεν ακούγεται] είναι σε study.cs50.net. Έτσι, αν κοιτάξουμε το πρόβλημα πρακτική στη σελίδα συγχώνευση είδος της study.cs50.net, υπάρχει ο κώδικας για την εφαρμογή συγχώνευση ταξινόμησης. Έτσι, δεν έχετε να εφαρμόσουν τον εαυτό σας απόψε. Αλλά βεβαιωθείτε ότι έχετε κατανοήσει μάλλον ό, τι ακριβώς απομνημόνευση. ΚΟΙΝΟ: [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 2: Η σελίδα συγχώνευση ταξινόμησης για study.cs50.net, υπάρχει μια πρακτική πρόβλημα που, αν κάνετε κλικ μέσα από το πρόβλημα, στο τέλος υπάρχει ένα λύση, η οποία είναι η συγχώνευση εφαρμογή ταξινόμησης. Αλλά βεβαιωθείτε ότι έχετε κατανοήσει και όχι μόνο αυτό απομνημόνευση ή αντιγράφοντας τα κάτω. ΚΟΙΝΟ: Και μια απολύτως έγκυρη πρόβλημα για τις εξετάσεις θα είναι κάτι σαν εδώ είναι μια λίστα. Τι σημαίνει αυτή η λίστα μοιάζει μετά ένα βήμα από τις επιλογές ταξινόμησης ή ταξινόμηση με εισαγωγή ή οτιδήποτε άλλο. Μια πλήρης επανάληψη του καταλόγου. Έτσι, ακόμη και αν δεν καταλήξετε να χρειάζεται να κώδικα για αυτό, θα πρέπει να το καταλάβουν αρκεί να ξέρετε πώς πρόκειται να τροποποιηθεί αυτό το array. DAN: Αυτό είναι για μένα. [Χειροκρότημα] LUCAS: Γεια σε όλους. Το όνομά μου είναι Lucas. Πάω να μιλήσω για αναδρομή, όλα τα είδη που έχουμε μάθει, και λίγο από όλους τους δείκτες. Εντάξει; Έτσι, πρώτα απ 'όλα, αναδρομή. Τι σημαίνει να πούμε ότι μια λειτουργία έχει επαναληπτικό; ΚΟΙΝΟ: το ίδιο κλήσεις. LUCAS: OK, καλεί τον εαυτό της, ναι. Έτσι, όπως αυτή την εικόνα, για παράδειγμα. Είναι σαν την εικόνα μέσα από μια εικόνα και ούτω καθεξής. Έτσι, για παράδειγμα, μπορείτε να have-- ως Dan που μιλούσε για δυαδική αναζήτηση. Ένας τρόπος με τον οποίο είναι δυαδική αναζήτηση αναδρομικές είναι το γεγονός ότι είστε προσπαθώντας να βρει έναν αριθμό. Έτσι, πηγαίνετε στη μέση. Και τότε θα ελέγξει αν οι αριθμοί δεν στην αριστερή και στη δεξιά. Και στη συνέχεια, αν μπορείτε να μάθετε ο αριθμός είναι πρόκειται να είναι στα αριστερά, είναι το ίδιο πράγμα όπως κάνει και πάλι την έρευνα, αλλά ακριβώς στο αριστερό μέρος της λίστας. Έτσι, αυτό είναι το πώς ακούγεται σαν να είναι αναδρομική. Έτσι, γι 'αυτό εσείς έχετε αναδρομικές λύση για τη συγχώνευση ταξινόμησης. Εντάξει, τόσο εδώ είναι ένα παράδειγμα. Ας πούμε ότι θέλω να επιλέγουν όλοι οι αριθμοί από 1 έως n. Μπορώ να συνειδητοποιήσουμε ότι το άθροισμα των n αριθμός n είναι συν η πλην 1 έως 1. Στη συνέχεια, όμως, αν κοιτάξουμε n μείον 1 συν n μείον 2 συν 1, που είναι η ίδια πράγμα ως αθροίζοντας τους αριθμούς έως n μείον 1. Έτσι μπορώ να πω ότι το ποσό το ποσό του ενός ισούται με n συν το άθροισμα των n μείον 1. Μήπως αυτό έχει νόημα; Και εγώ, επίσης, θα έχουν κάτι άλλο ονομάζεται η περίπτωση βάση, η οποία είναι ότι το άθροισμα των αριθμών μέχρι στο μηδέν θα είναι μηδενική. Έτσι, μόλις παίρνω τον αριθμό μηδέν, θα σταματήσει την καταμέτρηση. Μήπως αυτό έχει νόημα; Έτσι, εδώ είναι ένα παράδειγμα του πώς Μπορώ να εφαρμόσουν αυτό. Έτσι, δεν έχω αυτή τη λειτουργία σε ορισμένες. Αυτό παίρνει έναν ακέραιο n. Εδώ, λοιπόν, ελέγξτε πρώτα αν το n είναι μικρότερο ή ίσο με μηδέν. Έτσι, αν είναι μικρότερο ή ίσο με το μηδέν, I επιστρέψει το μηδέν, η οποία είναι βασική μας υπόθεση. Διαφορετικά, μπορώ να επιστρέψω μόνο n συν το άθροισμα των αριθμών από ένα έως n μείον ένα. Νόημα; OK. Έτσι, εδώ είναι ό, τι μοιάζει. Έχετε άθροισμα των 2 ίσον 2 συν το ποσό των 1. Και μερικά από 1 είναι 1 συν το άθροισμα των 0, η οποία είναι 0. Νόημα; Έτσι, αν κοιτάξουμε τη στοίβα σας πρόγραμμα, αυτό είναι ό, τι μοιάζει. Πρώτον, έχουμε την κύρια λειτουργία. Και στη συνέχεια η κύρια λειτουργία που ονομάζεται άθροισμα 2. Και στη συνέχεια, ποσό 2 πρόκειται να πει, OH, ποσό 2 ισούται με 2 συν το ποσό του ενός. Γι 'αυτό προσθέστε άθροισμα των 1 στη στοίβα. Και το άθροισμα των 1 πρόκειται να καλέσει άθροισμα των 0, η οποία είναι, επίσης, θα πρέπει να προστεθούν στη στοίβα. Και, στη συνέχεια, κάθε μία από αυτές εκείνες που είναι πάνω από την άλλη πρέπει να επιστρέψει πριν από τα άλλα αυτοί να συνεχίσω. Έτσι, για παράδειγμα, εδώ, άθροισμα από 0, πρώτη, πρόκειται να επιστρέψει 0. Και στη συνέχεια, επιλέξτε ποσό των 1. Στη συνέχεια άθροισμα των 1 πρόκειται να επιστροφή 1 με το άθροισμα του 2. Και τελικά, το ποσό των 2 θα για να επιστρέψετε στο κύριο 3. Μήπως αυτό έχει νόημα; Είναι πολύ σημαντικό να κατανοήσουμε πώς η στοίβα εργάζεται και να προσπαθήσουμε να να δούμε αν έχει νόημα. Εντάξει, έτσι η διαλογή. Έτσι, γιατί είναι σημαντικό διαλογή, πρώτα απ 'όλα; Γιατί πρέπει να μας νοιάζει; Όποιος; Δώσε μου ένα παράδειγμα; Ναι; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι, εντάξει. Έτσι, μπορείτε να ψάξετε πιο αποτελεσματικά. Αυτός είναι ένας καλός τρόπος. Έτσι, για παράδειγμα, έχουμε πολλά τα πράγματα, στην πραγματικότητα, στη ζωή μας, ότι κατατάσσονται. Για παράδειγμα, λεξικά. Είναι πολύ σημαντικό να έχουν όλα τα λέξεις σε κάποιο είδος της διαδικασίας που θα μπορούν να έχουν πρόσβαση εύκολα. Έτσι, αυτό είναι ό, τι έλεγε. Μπορείτε να ψάξετε πιο αποτελεσματικά. Σκεφτείτε πόσο δύσκολο θα ήταν να έχουμε ένα λεξικό στο οποίο οι λέξεις είναι σε τυχαία σειρά. Θα πρέπει να δούμε, λίγο πολύ, κάθε λέξη, μέχρι να βρείτε το λέξη που ψάχνετε. Αν χρησιμοποιείτε το Facebook, επίσης, όταν ψάχνετε σε φίλους σας, είστε Θα δείτε ότι το Facebook που σας πιο κοντά ο φίλος είναι πάνω από αυτές ότι δεν μιλάμε για τόσο πολύ. Αν πάτε σε όλη τη διαδρομή προς τα κάτω της λίστα των φίλων σας, θα πάμε να δούμε ανθρώπους που ίσως δεν χρειάζεται καν να θυμάστε ότι είστε φίλοι με. Και αυτό γιατί το Facebook είδη τους φίλους σας με βάση τον τρόπο κοντά βρίσκεστε σε αυτά. Έτσι, την οργάνωση των δεδομένων. Επίσης Pokemon. Έτσι, θα δείτε ότι όλα τα Pokemons έχουν αριθμούς. Και αυτό είναι σαν μια εύκολη τρόπος πρόσβασης στα δεδομένα. ΚΟΙΝΟ: Πρόσβαση Pokemon. LUCAS: Ναι. ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι. Εντάξει, έτσι το είδος επιλογής. Είδος επιλογής πρόκειται να επιλέξετε το μικρότερη αδιαχώριστα αξία του καταλόγου κάθε φορά σε κάθε επανάληψη. Είναι κάτι σαν το είδος που σας κάνει στο κεφάλι σας όταν προσπαθείτε να ταξινομήσετε μια λίστα στο χέρι. Βασικά, το μόνο που έχετε να κάνετε είναι να δούμε για το μικρότερο αριθμό. Μπορείτε να το βάλετε στην ταξινομημένη λίστα. Και τότε θα δούμε για το αμέσως μικρότερο αριθμό. Και τότε θα συνεχίσουμε να κάνουμε ότι και ούτω καθεξής. Έτσι, το είδος επιλογής είναι βασικά σας επιλέγετε κάθε φορά το μικρότερο αδιαχώριστα αξία. Βάλτε στο τέλος του ταξινομούνται μέρος της λίστας. Και να κρατήσει το κάνουμε αυτό. Έτσι, ας δούμε γρήγορα τι Αυτό μοιάζει. Έτσι, εδώ είναι η ταξινόμηση και μικτές λίστα. Έτσι, για την ταξινόμηση της λίστας, είναι αρχικά κενή. Και στη συνέχεια, Πάω να επιλέξετε το μικρότερο αριθμό εδώ, η οποία είναι 2. Έτσι παίρνω τον αριθμό 2 και έβαλα στο μπροστινό μέρος της λίστας. Και τότε θα δούμε για την επόμενη μικρότερη στοιχείο, η οποία είναι 3. Έτσι έβαλα στο τέλος από την ταξινομημένη λίστα. Και τότε θα συνεχίσω να το κάνω αυτό. Θεωρώ 4 και το βάζουμε στο τέλος. Βρείτε 5 και το βάζουμε στο τέλος. Και κοιτάξτε πώς όλες εκείνες τις φορές που Λέω να το βάλετε στο τέλος είναι, βασικά, swapping δύο τιμές. Εντάξει; Και τότε η τελευταία, απλά έχουμε ένα ακόμη στοιχείο. Έτσι είναι ήδη ταξινομημένα. Εντάξει, έτσι το είδος εισαγωγής. Εισαγωγή είδος που πρόκειται να έχουν, επίσης, αυτό το πράγμα ότι έχει μια ταξινόμηση και ένα μη ταξινομημένα λίστα. Το μόνο πράγμα που είναι ότι κάθε φορά που μπορείτε να προσθέσετε ένα στοιχείο για την ταξινόμηση λίστα, μπορείτε να επιλέξετε μόνο το στοιχείο ότι Είναι μπροστά από το αδιαχώριστα λίστα. Και τότε θα πάμε να βρούμε τι θέση θα πρέπει να είναι στην ταξινομημένη μέρος της λίστας. Ας δούμε τι είναι αυτό τόσο αυτό έχει περισσότερο νόημα. Αρχικά, λοιπόν, για παράδειγμα, προσπαθώ για να εισάγετε τον αριθμό τρία στο ταξινομημένη μέρος της λίστας. Έτσι, ο κατάλογος δεν έχει τίποτα. Έτσι, μπορώ να βάλω μόνο τον αριθμό 3. Τώρα, θέλω να προσθέσω τον αριθμό 5 στο η ταξινομημένη μέρος της λίστας. Έτσι κοιτάζω τον αριθμό 5. Θα παρατηρήσετε ότι είναι μεγαλύτερη από 3. Έτσι ξέρω ότι πρέπει να είναι μετά από 3. Έτσι έβαλα 3 και 5. Στη συνέχεια, θέλω να εισάγετε τον αριθμό 2. Θα παρατηρήσετε ότι ο αριθμός 2 είναι στην πραγματικότητα διαρκούν τότε τόσο 3 και 5. Γι 'αυτό και πραγματικά πρέπει να βάλετε όλα τα τρόπο στην αρχή της λίστας. Έτσι έχω να, το είδος του, να επιρρίψουν όλα τα στοιχεία στην ταξινομημένη λίστα ώστε να μπορώ να κάνει χώρο για τον αριθμό 2. Τότε θα δείτε τον αριθμό 6. Βλέπω ότι θα πρέπει να είναι μετά από 5. Έτσι έβαλα εκεί. Και τέλος, κοιτάζω τον αριθμό 4. Και παρατηρώ ότι πρέπει να να είναι μεταξύ 3 και 5. Και τότε έβαλα εκεί και μετατόπιση όλα τα άλλα στοιχεία. Νόημα; Bubble Sort. Έτσι bubble sort είναι βασικά αυτό που είσαι πρόκειται να do-- καλούμε φούσκα είδος γιατί θα πάτε μέσω της list-- Είναι πραγματικά καλύτερα αν απλά δείχνουν Σας αρέσει αυτό-- και θα πάμε για να συγκρίνετε γειτονικούς αριθμούς. Και θα πάμε να ανταλλάξουν τους θέσεις αν δεν είστε με τη σωστή σειρά. Έτσι, βασικά, αυτό που πρόκειται να συμβεί είναι εδώ, για παράδειγμα, έχετε 8 και 6. Γνωρίζετε ότι η σειρά ταξινόμησης θα στην πραγματικότητα είναι 6 και 5, δεξιά; Έτσι θα πάμε για να ανταλλάξουν τις παραγγελίες. Τότε βλέπω 8 και 4 εδώ. Και να κάνω το ίδιο πράγμα. Θα ανταλλάξουν και πάλι. Και, τέλος, 2 και 8. Τους ανταλλάξουν επίσης. Αυτό λέγεται Bubble Sort γιατί μετά καθεμία από αυτές τις επαναλήψεις, πράγματι, ο μεγαλύτερος αριθμός στη λίστα παίρνει όλα ο τρόπος στο τέλος της λίστας. Μήπως αυτό έχει νόημα; Επειδή κρατά εναλλαγή αυτή και να κινείται προς τα δεξιά. Εντάξει, έτσι αυτό είναι η δεύτερη επανάληψη. Θα ήταν το ίδιο πράγμα. Θα κάνω μια συμφωνία ανταλλαγής και τότε το τελευταίο. I ότι δεν υπάρχουν swaps και η λίστα είναι ταξινομημένη. Έτσι, σε Bubble Sort, εμείς ουσιαστικά να κρατήσει διέρχεται από τη λίστα και εναλλαγή τα πράγματα μέχρι να παρατηρήσετε ότι δεν έκανα τυχόν ανταλλαγές κάνει ότι επανάληψη, η οποία σημαίνει ότι η λίστα έχει ήδη ταξινομηθεί. Νόημα; Ας μιλήσουμε λίγο περίπου χρόνο λειτουργίας. Έτσι εσείς παιδιά θυμάστε Big O, Omega, και Theta; Ναι; Εντάξει, τι είναι Big O, πρώτα απ 'όλα; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι, αυτό λέγεται χειρότερη περίπτωση εκτέλεσης, η οποία απλά σημαίνει ότι είναι πόσο θα περιμένουμε το πρόγραμμα να αναλάβει να τρέξει. Όπως, όσον αφορά of-- σε αυτό το case-- n. Ο αριθμός των στοιχείων στη κατάλογος, στη χειρότερη περίπτωση. Όπως, στη χειρότερη δυνατή περίπτωση. Έτσι, για Bubble Sort, για παράδειγμα, έχουμε Big O ν πλατεία. Γιατί έχουμε αυτό; Γιατί είναι Bubble Sort Big πλατεία O n; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι, έτσι η χειρότερη περίπτωση θα είναι ότι θα πρέπει να κάνουμε n επαναλήψεις. Έτσι κάθε μία από τις επαναλήψεις πρόκειται να φέρει το μεγαλύτερο στοιχείο στο τέλος του καταλόγου. Έτσι, η χειρότερη περίπτωση είναι ότι έχω να κάνει αυτό το πράγμα n φορές. Και για κάθε μία από αυτές τις φορές, έχω να κάνει n swaps, γιατί έχω να συγκρίνετε κάθε δύο στοιχεία. Έτσι, γι 'αυτό είναι n τετράγωνο επειδή είναι n n φορές. Στη συνέχεια, η επιλογή του είδους είναι επίσης η πλατεία επειδή, για κάθε επανάληψη, έχω να εξετάσουμε κάθε στοιχείο στη λίστα. Και στη συνέχεια να βρει το μικρότερο, πράγμα που σημαίνει ότι πρέπει να κοιτάξετε μέσα από n στοιχεία. Και έχω να κάνω ότι n φορές, επειδή Θα πρέπει να επιλέξετε όλα τα n στοιχεία. Μια τέτοια εισαγωγή είναι επίσης η πλατεία επειδή το χειρότερο σενάριο θα να, ένα, έχω να εισάγετε n αριθμών, σωστά; Γι 'αυτό και ήδη γνωρίζουμε ότι θα πάω να έχουν n επαναλήψεις. Αλλά για κάθε έναν από αυτούς τους αριθμούς, αν είχα για να δούμε όλους τους αριθμούς σε η ταξινομημένη λίστα και το βάζουμε σε όλη τη διαδρομή στο μπροστινό μέρος, που θα είναι η πλατεία γιατί θα είναι n n φορές και πάλι. Νόημα; Τι γίνεται με το ωμέγα; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Είναι το καλύτερο σενάριο. Έτσι είναι όπως, σε πολλές φορές για διαλογή, το καλύτερο σενάριο είναι όταν η λίστα έχει ήδη ταξινομηθεί. Έτσι, δεν έχετε πραγματικά να κάνει τίποτα. Bubble Sort έχει την καλύτερη σενάριο του n. Μήπως εσείς ξέρετε γιατί; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι, αν μπορείτε να παρακολουθείτε αν σιτηρέσιο των δεδομένων είχε κανένα swaps ή όχι, αν έχετε κάτι που να αληθές αν υπήρχε μια επανάληψη, εάν ο κατάλογος έχει ήδη ταξινομηθεί, ουσιαστικά, τι πρόκειται να συμβεί είναι Πάω να προσπαθήστε να ανταλλάξουν κάθε δύο γειτονικών στοιχείων. Πάω να δω ότι δεν υπάρχουν ανταλλαγές. Και εγώ μόλις επιστρέψει αμέσως. Έτσι, αυτό σημαίνει ότι απλά έπρεπε να περάσουν από τον κατάλογο ένα χρόνο. Έτσι είναι n, επειδή φαίνομαι σε n στοιχεία. Γιατί η επιλογή του είδους n τετράγωνο; Ναι, ακόμη και αν η λίστα είναι ταξινομημένη, για κάθε επανάληψη του είδους επιλογή, I Πρέπει να επιλέξετε το ελάχιστο στοιχείο. Έτσι, αυτό σημαίνει ότι έχω έξω για να δούμε σε όλα τα στοιχεία της μη ταξινομημένα λίστα και να βρείτε την ελάχιστη για κάθε επανάληψη. Μήπως αυτό έχει νόημα; Και το σπαθί εισαγωγής είναι n γιατί η περίπτωση που προσπαθώ να εισάγετε το αριθμούς και όλους τους αριθμούς, όταν Ι προσπαθήστε να τους τοποθετήσετε, βλέπω ότι είναι στη σωστή θέση. Δεν έχω να πάω να δω όλα τα άλλα αριθμοί στο αδιαχώριστα λίστα. Έτσι, γι 'αυτό θα είναι n. Νόημα; Και τι είναι θήτα; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Τι, συγγνώμη; Πες το ξανά. ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ακριβώς. Έτσι μπορείτε να δείτε ότι η μόνη επιλογή αποθηκεύονται σε Merge sort έχουν thetas. Και αυτό επειδή έχετε μόνο θήτα αν τα δύο Big O και το Ωμέγα είναι το ίδιο. OK. Και, τέλος, η συγχώνευση ταξινόμησης έχει στο ημερολόγιο n. Και τότε, όπως έλεγε ο Dan, Συγχώνευση είδος Είναι κάτι σαν τον ίδιο τρόπο που κάνετε δυαδική αναζήτηση. Έτσι, μπορείτε να πάρετε τη λίστα. Και θα πάμε να μειωθεί κατά το ήμισυ. Και τότε θα τους κόψει σε μικρότερα μέρη. Και τότε μπορείτε να συγχωνεύσετε. Εσείς θυμάστε ότι, σωστά; OK, όπως έλεγε. OK, Δείκτες. Έτσι τι είναι ένας δείκτης; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Μια διεύθυνση. OK. Γνωρίζω ότι ο David δείχνει ένα μάτσο βίντεο από binky και τα πράγματα δείχνουν κάθε άλλο. Αλλά μου αρέσει να σκέφτομαι δείκτες ως απλώς μια διεύθυνση. Έτσι είναι μια μεταβλητή που πρόκειται για να αποθηκεύσετε μια διεύθυνση. Έτσι είναι ακριβώς αυτή η ειδική μεταβλητή ότι είναι μεγάλη τέσσερα bytes. Να θυμάστε, ότι δείκτης για οτιδήποτε είναι πάντα τέσσερα bytes καιρό για 32-bit μας μηχανή έτσι ώστε η περίπτωση με η συσκευή. Και αυτό έχει ακριβώς την τοποθεσία μιας μεταβλητής μέσα από αυτό. Εντάξει, έτσι δεν υπάρχει αυτή η μνήμη, βασικά. Έτσι, κάθε μπλοκ μνήμης έχει στην πραγματικότητα μια ετικέτα, η οποία είναι η διεύθυνση της slotty μνήμη. Έτσι, αυτό σημαίνει ότι μπορώ να έχω ένας δείκτης που δείχνει προς οποιαδήποτε από αυτές τις διευθύνσεις. Έτσι, ο λόγος για τον οποίο θα χρησιμοποιήσει δείκτες είναι αν έχω να θυμάμαι την τοποθεσία ότι μια συγκεκριμένη μεταβλητή είναι μια μνήμη. Και εσείς να θυμάστε ότι ένας από τους περιπτώσεις ήταν αν έχω μια λειτουργία αν έχω πραγματικά θέλετε να ανταλλαγής για ρεάλια, εγώ πραγματικά Πρέπει να στείλουμε ένα δείκτη. Δεν είναι η μεταβλητή. Μήπως εσείς θυμάστε αυτό; Η διαφορά between-- τι είναι το όνομα; Κλήση με την αξία και καλώντας με αναφορά, σωστά; Εντάξει, ναι. Έτσι καλέστε με βάση την αξία. Όταν απλά να στείλετε μια μεταβλητή λειτουργήσουν είστε απλά στέλνοντας μια αξία. Έτσι, είστε πραγματικά αποστολής ένα αντίγραφο της μεταβλητής. Και το πρόγραμμά σας δεν θα μπορούσε φροντίδα λιγότερο περίπου, εάν η ίδια μεταβλητή πράγματι κάνει ένα αντίγραφο. Και ζητά από σημαίνει ότι η αναφορά Είμαι πραγματικά την αποστολή αντιγράφου της δείκτη σε αυτή τη μεταβλητή. Έτσι, αυτό σημαίνει ότι Στέλνω το θέση της μεταβλητής. Έτσι την αίσθηση έχω τη θέση του μεταβλητή, όταν καλείτε τη λειτουργία με δείκτες, είμαι σε θέση να πραγματικά αλλάξετε τα στοιχεία που ήταν σε κύρια. Νόημα; Παρά το γεγονός ότι, ο δείκτης είναι ένα αντίγραφο, το δείκτης εξακολουθεί να έχει την πραγματική διεύθυνση της η μεταβλητή που θέλετε να αλλάξετε. Νόημα; Έτσι, δημιουργώντας δείκτες. Θυμηθείτε, το δείκτη να έχει πάντα ο τύπος που να υποδεικνύουν και στη συνέχεια ένα αστέρι. Και στη συνέχεια, βάζετε το όνομα. Έτσι, να θυμάστε ότι κάθε φορά που έχετε Όποια και αν είναι αστέρι, είναι σαν ένα δείκτη για να πως ό, τι μεταβλητή πληκτρολογήστε ότι είχατε. Έτσι, εδώ στο αστέρι, για παράδειγμα, είναι ένας δείκτης και ένας ακέραιος αριθμός. Και τότε char αστέρι είναι ένας δείκτης char αστέρι και ούτω καθεξής. Ναι; ΚΟΙΝΟ: Τι θα συμβεί αν έχουμε ένα δείκτη για ν να πρωταγωνιστήσει x. Ξέρω ότι δημιουργεί ένα δείκτη προς x. Έχει επίσης δηλώσει x ακέραιος; LUCAS: Εντάξει, έτσι όταν λένε n αστέρι x, δεν είστε δημιουργία ενός δείκτη προς μία μεταβλητή x. Είσαι δημιουργώντας ένα δείκτη που ονομάζεται x. ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Οπότε, όταν λέω n αστέρι x, είμαι λέγοντας, hey, στη μνήμη, Πάω να να πάρει ένα από αυτά τα τρία κουτιά. Και Πάω να πω ότι πρόκειται να είναι Χ, το οποίο είναι πρόκειται να είναι ένας δείκτης. Και κάτι ενδιαφέρον για τους δείκτες είναι ότι μπορούμε να πούμε ότι έχουν 4 bytes για μια μηχανή 32-bit. Και ο λόγος για αυτό είναι επειδή 4 bytes είναι 32-bits. Και μηχανές που είναι 64 bits πραγματικότητα έχουν δείκτες διευθύνσεις που έχουν μακρά 64 bits. Έτσι, αυτό σημαίνει απλώς ότι το μέγεθος της διευθύνσεις στο μηχάνημα είναι διαφορετική. Έτσι Η αναφορά και Καταργώντας την αναφορά. Υπάρχουν δύο φορείς εκμετάλλευσης ότι εσείς πρέπει να θυμόμαστε. Το πρώτο είναι ampersand. Το δεύτερο είναι αστέρι. Μην μπερδευτείτε από αυτό το αστέρι και αυτό Αστέρι επειδή θυμούνται ότι, σε αυτή την περίπτωση, θα πρέπει ν αστέρων. Είναι σαν ένα όλο θέμα μαζί. Δεν υπάρχει χώρος n αστέρι. Έτσι αυτό σημαίνει ότι είναι ο τύπος. Να θυμάστε, ότι όταν έχετε το μεταβλητό αστέρι, είστε μιλάμε για το είδος. Όταν έχετε μόνο αστέρι και στη συνέχεια η όνομα της μεταβλητής, αυτό σημαίνει ότι είστε dereferencing το δείκτη, η οποία σημαίνει ότι κοιτάτε το pointer, εύρεση της διεύθυνσης είναι επισημαίνοντας, πηγαίνει σε αυτήν τη διεύθυνση, και κοιτάζοντας όποτε έχετε εκεί. Έτσι λέω στους μαθητές μου ότι όταν έχετε αστέρι, θα πρέπει να σκεφτείτε ότι είναι η συντομογραφία του περιεχομένου της. Έτσι, εάν έχετε ένα δείκτη και κάνει αστέρι δείκτη, είναι η περιεχόμενο του δείκτη. Έτσι, πηγαίνετε σε ό, τι είναι επισημαίνοντας και να δούμε τη συνεχή περιεχόμενο. Και το εμπορικό και είναι η ίδια πράγμα ως διεύθυνση. Έτσι, αν έχω μια μεταβλητή μια-- όπως, ας να πω ότι έκανα int a ισούται 3-- αν θέλετε να βρείτε τη διεύθυνση που μεταβλητή μνήμη, μπορώ να κάνω μόνο Εμπορικό και ένα. Έτσι είναι η διεύθυνση ενός. Νόημα; Έτσι, εδώ είναι ένα παράδειγμα. Αυτό λείπει int b και int c. Έτσι int a ισούται με 3 σημαίνει ότι Πάω να πάει στη μνήμη. Και Πάω να βρουν μια σχισμή και να θέσει τον αριθμό 3 εδώ. Και στη συνέχεια, int b ισούται με 4. Πάω να κάνω το ίδιο πράγμα. Πηγαίνετε στη μνήμη και να θέσει έναν αριθμό 4 σε ένα από τα κουτιά. Και int ισούται με 5. Βρείτε ένα άλλο πλαίσιο και να θέσει έναν αριθμό 5. Έτσι τι είναι αυτή η γραμμή κάνει έξω; pa n αστέρι ισούται με ένα ampersand. Έτσι, πρώτα απ 'όλα, n pa αστέρι. Τι είναι αυτό που κάνει; ΚΟΙΝΟ: [δεν ακούγεται]. LUCAS: Ναι, έτσι n αστέρι ετησίως, κατ 'αρχάς, δηλώνει ένα δείκτη που ονομάζεται ετησίως. Και τότε είναι ανάθεση της αξίας των ότι το δείκτη να είναι η διεύθυνση της a. Έτσι, εμπορικό και ένα. Στη συνέχεια, αν δεν κάνω pb αστέρι, τι είναι ένα pb αστέρι; Ω, συγγνώμη. Αυτό είναι επίσης λείπει. n pb αστέρι. Εννοώ pc αστέρι. Λυπάμαι πολύ. Είναι το ίδιο πράγμα. Αλλά τώρα είμαι καλά ar δημιουργία ενός δείκτη to b και, στη συνέχεια, ένα δείκτη για να γ. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Ναι. Έτσι, αν πάτε στη μνήμη και θα πάμε να το κουτί που είναι ένδειξη για pa, είστε πραγματικά πρόκειται να δείτε μια διεύθυνση ενός. Εντάξει; Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Ναι, δείκτης είναι μια διεύθυνση. Ποτέ μην ξεχνάτε ότι. Είναι σαν το πιο σημαντικό μέρος για δείκτες. Υπάρχει αποθήκευση και τη διεύθυνση σε κάποια μεταβλητή. Οτιδήποτε άλλο; Οποιεσδήποτε άλλες ερωτήσεις; OK. Έτσι Δείκτες και πίνακες. Να θυμάστε ότι όταν κάνω int array 3, Βασικά, αυτό που κάνω είναι ότι είμαι, το είδος του, δηλώνοντας σε ένα δείκτη. Έτσι σειρά είναι το είδος του σαν ένα δείκτη προς μία συγκεκριμένο χώρο στη μνήμη στην οποία διατίθενται τρεις υποδοχές για ακέραιους αριθμούς. Μήπως αυτό έχει νόημα; Έτσι, όταν κάνω int array 3, τι είμαι κάνει, βασικά, είναι η δημιουργία τριών υποδοχές στη μνήμη. Γι 'αυτό ακριβώς βρείτε τρεις υποδοχές μνήμης. Έτσι, αν το κάνω, τότε, μια σειρά αστέρι, το σημαίνει ουσιαστικά το περιεχόμενο του πίνακα, που σημαίνει σβήνω το δείκτη, πάω σε αυτό το μέρος που είναι επισημαίνοντας, και έβαλα το νούμερο ένα. Και τότε, αν κάνω σειρά αστέρι συν 1, ότι είναι το ίδιο πράγμα με κάνει array παρένθεση ένα, πράγμα που σημαίνει απλά πάω να ο τόπος που να υποδεικνύουν. Και τότε οι μάρκες συν 1 με μετατόπιση κατά μία θέση. Πηγαίνω λοιπόν σε αυτή τη θέση, στην πραγματικότητα, και να θέσει τον αριθμό δύο. Και τότε, επιτέλους, όταν κάνω array συν 2, πάω όπου κατάδειξης συστοιχίας σε. Και τότε θα προχωρήσουμε σε μπλοκ μνήμης. Και τότε έβαλα τον αριθμό τρία εδώ. Ναι; ΚΟΙΝΟ: Έτσι αστέρι πίνακας είναι απλά λέγοντας ότι το πρώτο σημείο. Και μπορείτε να προσθέσετε 1, μόνο και μόνο επειδή είμαστε μόνο πραγματικά αναφορά ότι η πρώτη διεύθυνση. LUCAS: Ναι. Γιατί, για παράδειγμα, να πω σειρά 0, πίνακας 1 και πίνακας 2; Λέω, γιατί το κάνεις 0, 1, 2, 3 αντί του 1, 2, 3; Ένας από τους λόγους είναι, το ένα, ο υπολογιστής προγραμματιστές προτιμούν να ξεκινήσετε ξεκινώντας από το 0. Δύο είναι επειδή όταν κάνεις σειρά 0, Είναι το ίδιο πράγμα με κάνει array συν 0, που σημαίνει ότι θα πάω να ότι η θέση, και δεν το κάνω παραλείψετε κανένα μπλοκ μνήμης. Γι 'αυτό και δεν κινούνται κάθε μπλοκ μνήμης. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Έτσι που ρωτάει τι είναι η διαφορά μεταξύ κάνει αυτό ή να κάνει malloc. Μία από τις διαφορές είναι ότι int array 3 είναι η δημιουργία ενός συστοιχία στη στοίβα. Και όταν το κάνω malloc αυτό, δημιουργεί στο σωρό. Μήπως αυτό έχει νόημα; Και πώς malloc λειτουργούν πραγματικά; Έτσι, γιατί χρειαζόμαστε ακόμα να χρησιμοποιήσετε malloc; Είδος compiler σας από τα στοιχεία από όλα τα οι μεταβλητές που δηλώνονται. Και ο ίδιος δημιουργεί χώρο για όλους Από αυτούς στη στοίβα. Έτσι, το σύνολο των μεταβλητών σας θα να είναι κάπου στη στοίβα. Έτσι, εδώ είναι οι μεταβλητές περιβάλλοντος. Έτσι, βασικά, χώρος για αυτές τις μεταβλητές στη μνήμη κατανέμεται σε τη διάρκεια της μεταγλώττισης. Έτσι, αυτό σημαίνει ότι ο υπολογιστής σας έχει να γνωρίζει όλες αυτές τις μεταβλητές εκ των προτέρων. Δεν χρειάζεται να γνωρίζουν τι αξία θα πάμε να θέσει σε αυτά. Αλλά πρέπει να γνωρίζει πώς το μέγεθος της μνήμης που χρειάζεστε. Αλλά τώρα ας πούμε ότι, για παράδειγμα, είστε δημιουργώντας μια σειρά ή τη λήψη ενός κορδόνι που παίρνετε από τον χρήστη. Δεν ξέρω πόσο καιρό το string πρόκειται να είναι, για παράδειγμα. Έτσι, δεν ξέρω ακριβώς πόσες μπλοκ μνήμης που διαθέτει, σωστά; Γι 'αυτό δεν έχει νόημα για μπορείτε να πείτε βάλει 100 χαρακτήρες. Και τότε τι θα γινόταν αν ο χρήστης γράφει 150; Θα πάμε να βιδωθεί. Έτσι, βασικά, δεν μπορείς να είσαι σίγουρος για το πώς πόση μνήμη πρέπει να διαθέσετε κατά τη μεταγλώττιση του προγράμματος. Μπορείτε απλά να ξέρετε ότι για το χρόνο εκτέλεσης. Έτσι, γι 'αυτό έχετε το σωρό. Έτσι, ο σωρός πρόκειται να έχουν μνήμη ότι είστε κατανομή κατά τη διάρκεια της διάρκεια του προγράμματος λειτουργίας. Έτσι, βασικά, όταν κάνεις malloc, τι κάνεις είναι κατανομή μνήμης runtime, το οποίο σημαίνει ότι είστε αποφασίσει ακριβώς εκείνη τη στιγμή που εσείς θα πρέπει να έχουν εκείνη την μνήμη. Έτσι ώστε να είναι όταν για τη χορήγησή της. Μήπως αυτό έχει νόημα; Έτσι θυμηθείτε, η στοίβα έχει μεταβλητές που δημιουργούνται για τη μεταγλώττιση. Και τότε ο σωρός έχει μεταβλητές που δημιουργούνται καθώς πηγαίνετε με malloc, για παράδειγμα. ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Έτσι GetString είναι πρόκειται να καλέσει malloc. Επιτρέψτε μου να μιλήσω για malloc, και Θα εξηγήσω GetString. Έτσι malloc είναι το ίδιο πράγμα η κατανομή της μνήμης. Έτσι, πρόκειται να διαθέσει μνήμη στο σωρό. Και πρόκειται να επιστρέφει ένα δείκτη στο όπου η μνήμη είχε αποδοθεί κατά. Έτσι, όταν do-- εδώ για example-- n δείκτη αστέρι. Και τότε δείκτης ισούται με malloc το μέγεθος των φορές ιντσών 10. Είμαι δημιουργία ενός δείκτη. Και τότε είμαι ανάθεση αυτή δείκτης για την η τιμή του δείκτη που malloc μου δίνει. Ρωτάω λοιπόν malloc μπορεί να σας διαθέσει χώρος για 10 ακέραιοι. Αυτό είναι ό, τι λέει. Και malloc μου δίνει πίσω ένα δείκτη σε αυτή τη θέση. Νόημα; OK. I Και GetString είναι, ουσιαστικά, να κάνει μια καλέστε στο malloc, έτσι ώστε να μπορεί να διαθέσει μνήμη κατά τη διάρκεια της εκτέλεσης. Πάντα να θυμάστε να ελέγχετε για null επειδή malloc πρόκειται να επιστρέψει null αν δεν μπορεί να εκχωρήσει μνήμη. Ας πούμε ότι σας ρωτήσω για ένα γελοίο ποσό της μνήμης. Ο υπολογιστής σας δεν πρόκειται να είναι είναι σε θέση να διαθέσει τόσο πολύ. Έτσι malloc είναι ακριβώς πρόκειται να επιστρέψει null. Έτσι, να θυμάστε πάντα να ελέγχετε αν η δείκτη που πήρατε από malloc είναι null ή όχι, διότι, αν είναι, ίσως να dereferencing ένα δείκτη και προκαλώντας την πλευρά σφάλματα. Και τέλος, μην ξεχνάτε ελεύθερη μνήμη σας. Malloc δημιουργεί μνήμη στο σωρό. Και θα πρέπει να ελευθερώσετε τη μνήμη πριν από τη λήξη του προγράμματος. Εντάξει, αυτό είναι όλο για μένα. Λυπούμαστε, Rob. Ευχαριστώ. [Χειροκρότημα] LUCAS: Οποιεσδήποτε τελευταίες ερωτήσεις πριν Rob έρχεται; Όχι; Ναι; ΚΟΙΝΟ: Δεν είδα αυτό σε απευθείας σύνδεση. Έχετε ανεβάσει ακόμα; LUCAS: Νομίζω ότι ο Dave είναι μεταφόρτωση σύντομα. DAVE: Θα πρέπει να αναρτηθεί. LUCAS: Θα είναι σε απευθείας σύνδεση. ΚΟΙΝΟ: Είναι στο χέρι. LUCAS: Είναι στο χέρι; OK. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Ναι, θα πρέπει να απελευθερώσει όλες τις μνήμης που τίθεται στο σωρό. ΚΟΙΝΟ: [δεν ακούγεται]; LUCAS: Ναι. Κάθε φορά που έχετε μια malloc πολιτισμό, θα πρέπει να έχετε μια κουλτούρα δωρεάν αφού σταματήσετε να χρησιμοποιείτε αυτήν τη μεταβλητή. Έτσι malloc και δωρεάν είναι πάντα μαζί. Καλύτεροι φίλοι τους. Ναι. Rob; ROB: Θα πάω γρήγορα. Και, επίσης, το βίντεο θα είναι συσκευασμένα. Έχω το μικρόφωνο για. Εντάξει, έτσι εβδομάδα πέντε πράγματα. Το πρώτο πράγμα που έχουμε είναι η στοίβα. Έτσι, να θυμάστε ότι υπάρχει μόνο μία στοίβα καρέ ανά ενεργή κλήση της συνάρτησης. Θα δούμε ότι σε μια δεύτερη. Και επίσης να θυμάστε τι συμβαίνει στην πραγματικότητα σε κάθε πλαίσιο στοίβας πρόκειται να είναι οι τοπικές μεταβλητές των λειτουργιών μας, τα επιχειρήματα που έχουν περάσει σε μας λειτουργίες, μαζί με ένα ζευγάρι άλλα πράγματα που δεν κάνουμε πραγματικά πρέπει να ανησυχούν. Έτσι, εδώ είναι ένα παράδειγμα προγράμματος, όπου, ανακοίνωση, κύριο είναι printfing την επιστροφή αξία των foo 4. foo είναι ακριβώς πρόκειται να επιστρέψει το αξία των 4 bar κόμμα 6. Και bar πρόκειται να θέσει κάποια τοπική μεταβλητή η ίσο με 4 φορές 6. Και στη συνέχεια επιστρέφουν n. Έτσι, ας ρίξουμε μια ματιά στο stack σε όλη την η πραγματική επανάληψη του προγράμματος αυτού. Έτσι, υπάρχει το κάτω μέρος του stack μας. Θυμηθείτε ότι η στοίβα μεγαλώνει. Έτσι στο κάτω μέρος της στοίβας μας, εμείς έχουν ένα πλαίσιο στοίβας για την κύρια. Όταν ξεκινήσει το πρόγραμμα, κύρια είναι πάντα πρόκειται να είναι σε η κάτω μέρος του stack μας. Και τι είναι μέσα μας στοίβα πλαίσιο για την κύρια; Έτσι, ακόμα κι αν δεν υπάρχουν τοπικές μεταβλητές σε κύριες, όπως είπα και πριν, έχουμε argc και rgv ανάληψη χώρο εσωτερικό του κύριου πλαισίου στοίβας. Έτσι, κύρια τώρα πρόκειται να καλέστε τη συνάρτηση foo. Και αυτό σημαίνει ότι foo πρόκειται να να πάρει τη δική πλαίσιο στοίβας του. Μέχρι τώρα είμαστε στο εσωτερικό της η συνάρτηση foo. Και ό, τι χρειάζεται για να πάει στο πλαίσιο στοίβας foo του; Λοιπόν, foo έχει ένα επιχείρημα n. Και n είναι ίσο με 4 δεδομένου ότι αυτό είναι ό, τι κύρια περνά ως επιχείρημα foo του. Μέχρι τώρα foo πρόκειται να καλέσετε το μπαρ. Τι είναι το μπαρ θα έχει μέσα του «πλαισίου στοίβας του; Έχει x ίσο με 4 y ισούται με έξι. Αυτό δεν είναι το μόνο που θα πάμε να έχουν στο πλαίσιο στοίβας επειδή μπαρ έχει επίσης μια τοπική μεταβλητή n. Και n θα πάμε να τίθεται ίσο με 24. Μέχρι τώρα bar πρόκειται να επιστρέψει n. Έτσι, μπαρ επιστρέφει 24 έως η foo πλαίσιο στοίβας. Και επειδή bar επανέρχεται τώρα, ότι σημαίνει ότι είμαστε σκάει το πλαίσιο στοίβας για μπαρ στα ανοικτά της στοίβας. Έτσι, όλη η μνήμη ότι η γραμμή ήταν χρήση είναι τώρα από τη στοίβα. Τώρα, foo πρόκειται επίσης για να επιστρέψετε στο κύριο 24. Έτσι τώρα που foo επιστρέφει, τη μνήμη ότι foo χρησιμοποιούσε στο 'του πλαίσιο στοίβας είναι επίσης φύγει. Και τώρα, κύριος πρόκειται να καλέσετε printf. Έτσι printf είναι απλά μια άλλη λειτουργία. Όταν λέμε printf, πρόκειται να ένα άλλο πλαίσιο στοίβας για την printf κλήση της συνάρτησης. Τι περνάμε printf; Αυτό είναι ό, τι πρόκειται να πάει επί του πλαισίου στοίβας του. Τουλάχιστον, θα περνάτε ότι το ποσοστό i backslash n και το επιχείρημα 24. Θα μπορούσε να έχει περισσότερο είναι το πλαίσιο στοίβας αν printf συμβαίνει να χρησιμοποιούν κάποια τοπικές μεταβλητές. Δεν ξέρουμε. Αλλά όλα αυτά πηγαίνει στην printf του stack frame. Είναι πρόκειται να εκτελέσει την printf. Στη συνέχεια printf κάνει. Θα επιστρέψει. Τέλος, κύριο γίνεται. Main θα επιστρέψει. Και τότε το πρόγραμμά μας γίνεται. Ναι; ΚΟΙΝΟ: Είστε βλέποντας [δεν ακούγεται] επιχειρήματα [δεν ακούγεται] παραμέτρους; ROB: Έτσι, υπάρχει μια λεπτή διαφορά μεταξύ των επιχειρημάτων και των παραμέτρων. Και πραγματικά, σε κοινή μιλούν, οι άνθρωποι τείνουν να τα ανακατεύουμε ακριβώς επάνω όλη την ώρα. Όμως, οι παράμετροι είναι η επίσημη αναφέρουμε τα πράγματα. Έτσι argc και argv είναι το παραμέτρους για την κύρια. Επιχειρήματα είναι αυτό που πραγματικά περάσει σε όσο αυτές παραμέτρους. Έτσι εκεί όταν καλώ foo των 4, 4 είναι το επιχείρημα που περνάω σε. Και η παράμετρος n, μέσα από foo, παίρνει την τιμή 4 από το 4 ήταν το επιχείρημα. ΚΟΙΝΟ: [δεν ακούγεται]; ROB: n είναι μια τοπική μεταβλητή με μπαρ. n εξακολουθεί να είναι το τοπικό έως το foo, αλλά Είναι μια παράμετρος για την foo. Δεν είναι μια τοπική μεταβλητή. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: foo είναι απλά καλώντας μπαρ και επιστροφή όποιες αποδόσεις μπαρ. ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Ναι, ακριβώς για να δούμε πολλαπλές στοίβα καρέ. Ναι; ΚΟΙΝΟ: Γιατί ήταν foo ονομάζεται πριν printf; ROB: Γιατί ήταν foo ονομάζεται πριν printf; Γι 'αυτό και θα μπορούσε να έχει, αντ' αυτού, κάνει κάτι όπως int x ισούται με foo από 4 και στη συνέχεια εκτυπώνεται x. Αλλά αντ 'αυτού, θα συνδυάζεται η λειτουργία καλέστε στο επιχείρημα printf. Να σημειωθεί όμως ότι δεν μπορούμε στην πραγματικότητα εκτελέσει την κλήση με τις printf μέχρι να καταλάβω τι foo 4 είναι. Έτσι θα πάμε να την αξιολογήσει. Και μόνο όταν γίνει αυτό θα για να έρθει πίσω και να αξιολογούν αυτό. Ναι; ΚΟΙΝΟ: Από δύο μπαρ [δεν ακούγεται] αξία, γιατί δεν έχουμε [δεν ακούγεται]; ROB: Θα πρέπει να είναι απόλυτα int. Αυτό δεν πιάστηκε πάνω πολλαπλά περάσματα. Γι 'αυτό θα πρέπει να είναι int bar και int foo αφού και οι δύο από αυτούς επιστρέφουν ακέραιοι. Void είναι μόνο εάν δεν πρόκειται να επιστρέψει πραγματικές τιμές. Ναι; ΚΟΙΝΟ: Αν είχατε μια γραμμή πάνω η απόδοση, [δεν ακούγεται]; ROB: Μια γραμμή πάνω από την απόδοση; ΚΟΙΝΟ: Ναι. Όπως και αν κάνατε printf και [δεν ακούγεται], θα το εκτυπώσετε δύο φορές; ROB: Έτσι, μέσα από την foo; Αν είχαμε μια printf εδώ; ΚΟΙΝΟ: Ναι. ROB: Έτσι, αν είχαμε το δικαίωμα printf Εδώ, θα εκτυπώσετε μια φορά. Από ζητούμε foo φορά σωστά εδώ, τότε θα χτυπήσει την printf. Στη συνέχεια θα καλέσει μπαρ. Και τότε foo θα επιστρέψει. Και αυτό είναι όλο. Συναντούμε μόνο ποτέ η printf φορά. Ναι; ΚΟΙΝΟ: [δεν ακούγεται] printf καλώντας foo γιατί είμαστε οι πρώτοι καλώντας printf και τότε θα περνάτε τα επιχειρήματα. ROB: Έτσι, θεωρητικά, δεν είναι printf καλώντας foo; Έτσι, δεν υπάρχει. Απλά η σειρά που γ πρόκειται να εκτελέσει αυτά τα πράγματα είναι, πριν μπορούμε καλέσετε μια συνάρτηση, όλα τα επιχειρήματα με τη λειτουργία πρέπει να να αξιολογηθούν πλήρως. Έτσι είναι αυτή αξιολογείται εντελώς; Ναι, αυτό είναι μόνο ένα string. Είναι ακριβώς μια τιμή. Στη συνέχεια έχουμε την πλήρη αξιολογήσει αυτό. Μόλις αυτό γίνει, τώρα όλα Τα επιχειρήματα της αξιολογούνται. Και τώρα μπορούμε να κάνουμε το καλέστε στο printf. Ναι; ΚΟΙΝΟ: Μια ερώτηση. Εάν έχετε μια συνάρτηση κενό, πρέπει να έχετε ερωτηματικό επιστροφή; ROB: Δεν κάνετε ένα ερωτηματικό επιστροφή αν έχετε μια συνάρτηση κενό. OK. Μέχρι τώρα κάποια πράγματα σωρού. Έτσι σωρός είναι το πώς θα πάμε να αντιμετωπίσουμε με δυναμική διαχείριση μνήμης. Και αυτό έρχεται σε άμεση επαφή με το stack που θα ονομάζαμε αυτόματη διαχείριση μνήμης. Έτσι, στη στοίβα, δεν έχετε πραγματικά να ασχοληθεί με το πώς οι τοπικές μεταβλητές ωθούνται και πετάχτηκε μακριά όλα αυτά τα πλαίσια στοίβα και όλα αυτά τα πράγματα. Δεν χρειάζεται να ανησυχείτε γι 'αυτό. Είναι αυτόματο. Έτσι, ο σωρός είναι χειροκίνητη. Και η [δεν ακούγεται] προέρχεται από αυτές τις λειτουργίες malloc και δωρεάν. Έτσι, εδώ είναι ένα άλλο πρόγραμμα. Όλοι κάνουμε είναι mallocing ένας ακέραιος. Είμαστε το αποθηκεύει στο αστέρι x. Φυσικά, θα πρέπει να ελέγξετε για να δούμε αν το x είναι μηδενική. Στη συνέχεια θα πάμε να ορίσετε ακριβώς τι x είναι στραμμένη προς το 50. Εκτύπωση ποια x είναι επισημαίνοντας, print x, και στη συνέχεια ελεύθερη x. Λοιπόν, πώς είναι αυτό πραγματικά πρόκειται να δούμε αν κοιτάξουμε στοίβα και σωρός μας; Έτσι, θα αρχίσουμε πάλι. Το κάτω μέρος της στοίβας μας όπως και πριν. Να θυμάστε ότι σου σωρό άμεσα αντιτίθεται στη στοίβα; Έτσι θα πάμε να έχουν το κορυφή του σωρού μας μέχρι εκεί. Ώστε το κάτω μέρος της στοίβας μας, έχουμε πλαίσιο stack μας για τις κύριες. Έχει το χώρο για argc, argv, και εμείς τώρα έχουν μια τοπική μεταβλητή x, η οποία είναι ένα αστέρι int. Έτσι θα πάμε να επαναλάβει μέσω αυτού του προγράμματος. Το πρώτο πράγμα που έχουμε είναι μια πρόσκληση για malloc. Έτσι είμαστε κάνει μια κλήση με malloc. Malloc είναι μια λειτουργία. Είναι πρόκειται να πάρει ένα πλαίσιο στοίβας. Τι μπορούμε να περάσουμε σε malloc; Αυτό πρόκειται να πάει μέσα του πλαισίου στοίβας. Είμαστε περνώντας το μέγεθος του n, η οποία είναι 4. Έτσι ώστε να περνά στην malloc. Τι κάνει malloc κάνει; Μας πιάνει λίγο χώρο στο σωρό. Έτσι θα πάμε για να πάει στο σωρό. Και θα πάμε για να αρπάξει 4 bytes από το σωρό. Οπότε ας δώσουμε ότι μια αυθαίρετη διεύθυνση. 0x123 Απλά προσποιηθείτε ότι είναι ένα διεύθυνση που βρίσκεται στο σωρό. Έτσι, ό, τι είναι στην πραγματικότητα μέσα από αυτό περιοχή της μνήμης στη διεύθυνση Ox123; Σκουπίδια. Γι 'αυτό και δεν έχετε αποθηκεύσει τίποτα σε αυτό. Έτσι, όσο γνωρίζουμε, αυτό θα μπορούσε να είναι οτιδήποτε. Δεν πρέπει να υποθέσουμε ότι είναι μηδέν. Είναι πιο πιθανό να μην το μηδέν. Μέχρι τώρα malloc επιστρέφει. Και τι κάνουμε όταν επιστρέφει malloc; Θέσαμε αυτό επιστρέφει. Θέτουμε x ίσο με αυτό να επιστρέφει. Έτσι τι είναι αυτό που επιστρέφει; Είναι επιστροφή 0x123 δεδομένου ότι είναι η διεύθυνση του μπλοκ της μνήμης που μόλις διατεθεί στο σωρό. Έτσι επιστρέφουν 0x123 x είναι τώρα πρόκειται να οριστεί ίση με 0x123 οποία, εικαστικά, εμείς συχνά επιστήσει ως x έχει αποκτημένο βέλος που δείχνει σε αυτό το μπλοκ. Αλλά το x είναι ακριβώς αποθήκευση αυτή τη διεύθυνση. Έτσι τώρα θα πρέπει να ελέγξετε αν το x είναι μηδενική. Δεν είναι null. Εμείς προσποιούμαστε ότι malloc πέτυχε. Μέχρι τώρα αστέρι x ισούται με 50. Έτσι αστέρι θυμάται αυτό σημαίνει πηγαίνετε σε αυτή τη διεύθυνση. Έτσι 0x123 Εμείς πάμε για να πηγαίνετε σε αυτή τη διεύθυνση. Και αυτό μας φέρνει μέχρι εκεί. Τι κάνουμε σε αυτή τη διεύθυνση; Είμαστε αποθήκευση 50. Έτσι, μετά από αυτή τη γραμμή, αυτό είναι ό, τι Τα πράγματα πρόκειται να μοιάσει. Μέχρι τώρα δεν είναι πλέον σκουπίδια εκεί. Τώρα γνωρίζουμε ότι το 50 είναι το ότι συγκεκριμένη διεύθυνση, επειδή εμείς θα οριστεί σε αυτό. Εντάξει; Έτσι τώρα θα πάμε για να εκτυπώσετε f. Έτσι, πρώτα θα πάμε για να εκτυπώσετε αστέρι x. Έτσι τι είναι αστέρι x; Και πάλι, αστέρι x σημαίνει να πάει να το πράγμα που x είναι στραμμένη στο. Έτσι, x είναι η αποθήκευση 0x123 Μετάβαση σε αυτό. Παίρνουμε 50. Έτσι εκτυπώσετε στ αυτό. Και αυτό σημαίνει ότι πρόκειται να εκτυπώσετε 50. Και στη συνέχεια, που επιστρέφει. Και στη συνέχεια, έχουμε τη δεύτερη printf. Είμαστε πλέον τοις εκατό p. Αν δεν το έχετε δει, ότι είναι ακριβώς πώς μπορείτε να εκτυπώσετε ένα δείκτη. Έτσι έχουμε τοις εκατό i, τοις εκατό f, και όλα αυτά που έχουν ήδη. Έτσι τοις εκατό p, εκτυπώστε ένα δείκτη. Έτσι, x είναι ένας δείκτης. Έτσι, αν πρόκειται να εκτυπώσετε x ίδιο, είμαστε εκτυπώνετε ό, τι είναι στην πραγματικότητα μέσα Χ, το οποίο είναι 0x123 Έτσι, η πρώτη print f πρόκειται να εκτυπώσετε 50. Η δεύτερη εκτύπωση f πρόκειται να εκτυπώσετε 0x123 Ναι; ΚΟΙΝΟ: Χρησιμοποιείτε τοις εκατό x για να εκτυπώσετε ένα δείκτη; ROB: Έτσι δεν μπορείτε να χρησιμοποιήσετε τοις εκατό x για να εκτυπώσετε ένα δείκτη; Έτσι, μπορείτε, αλλά τοις εκατό x είναι απλά, γενικά, για όπως εάν έχετε κάποια ακέραιο και θέλετε να εκτυπώσετε ως ένα δεκαεξαδικό. Αυτό είναι ακριβώς το πώς θα το κάνουμε αυτό. Ότι, τοις εκατό d θα εκτύπωση ως δεκαδικά. Αυτό ήταν παίρνουμε τοις εκατό d. i είναι μόνο ακέραιος. τοις εκατό p είναι ειδικά για τους δείκτες. Έτσι, x είναι ένας δείκτης. Θέλουμε να χρησιμοποιήσετε τοις εκατό p. Αλλά τοις εκατό x θα μπορούσε να λειτουργήσει. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Ναι. Τουλάχιστον για αυτό call-- έτσι δεν θα περιλαμβάνουν το εδώ. Αλλά αυτά τα δύο επιχειρήματα είναι απαραίτητα μέσα από αυτό το πλαίσιο στοίβας μαζί με τυχόν τοπικές μεταβλητές printf συμβαίνει να χρησιμοποιούν. Και τότε η επόμενη κλήση να printf τώρα στο εσωτερικό της printf πλαίσιο στοίβας είναι τοις εκατό σ backslash n και ανεξάρτητα από το τιμή του χ είναι, το οποίο είναι 0x123. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Θα εκτυπώσετε κάτι που μοιάζει με αυτό. ΚΟΙΝΟ: [δεν ακούγεται]. ROB: Έτσι τυπώνει σε μορφή διεύθυνσης. Μοιάζει με μια διεύθυνση. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Γιατί είναι αυτό; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Γιατί είναι αυτό το δείκτη 4 bytes; Έτσι, υπάρχουν ένα σωρό από 0 μπροστά από αυτό. Έτσι, είναι πραγματικά 0x0000000123. Σε ένα σύστημα 64-bit, θα υπάρξουν ένα σωρό περισσότερα μηδενικά. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]. ROB: Έτσι, η πρώτη printf πρόκειται να print-- ΚΟΙΝΟ: [δεν ακούγεται]. ROB: Ναι, πρόκειται για την εκτύπωση ποια x είναι στραμμένη προς. Κατηγορία λέει τι είναι αυτό πράγμα που δείχνει να. Πιάσε αυτό. Έτσι τι είναι αυτό που δείχνει να; 50. Πιάσε αυτό. Γι 'αυτό θα πάμε να εκτυπώσετε. Ότι, το επόμενο, είμαστε Απλά εκτύπωση x ίδιο. Τι είναι το εσωτερικό της f; 0x123. OK. Και τότε, επιτέλους, έχουμε την ελεύθερη. Τι περνάμε να ελευθερώσει; Είμαστε περνώντας x. Εκείνη την εποχή εγώ πραγματικά εμφανίζεται αυτό το πλαίσιο στοίβας. Έτσι είμαστε περνώντας την τιμή 0x123 να ελευθερώσει. Μέχρι τώρα δωρεάν ξέρει, εντάξει, Θα πρέπει να ανεβείτε στο σωρό και χωρίς αυτή η μνήμη. Είναι πλέον χρησιμοποιώντας αυτό βρίσκεται στη διεύθυνση 0x123. Έτσι, χωρίς πρόκειται να κυκλοφορήσει ότι από το σωρό. Τώρα σωρό μας είναι και πάλι άδειο. Δεν έχουμε διαρροές μνήμης. Τώρα δωρεάν θα επιστρέψει. Παρατηρήστε ότι το x είναι ακόμα 0x123. Αλλά αυτό δεν είναι πλέον έγκυρη μνήμη. Θα πρέπει πλέον να dereference x. Ναι; ΚΟΙΝΟ: Είναι επιστρέψει 0 περιττή; ROB: Είναι returen 0 περιττή; Ναι. Εμείς απλά βάλτε ότι υπάρχει, διότι έχουμε μια επιστροφή ένας για τον αέρα. Έτσι είναι όπως, ναι, αφήνει περιλαμβάνουν την επιστροφή 0. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Έτσι, μετά από ελεύθερη x, τι θα συμβεί αν προσπαθούμε να dereference το δείκτη; Είναι πιθανό ότι τίποτα δεν πάει στραβά. Είναι πιθανό ότι θα πάρει ακόμα 50. Είναι δυνατόν, επίσης, ότι η μνήμη είναι τώρα χρησιμοποιείται για κάτι άλλο. Έτσι είναι απροσδιόριστη συμπεριφορά. Και απροσδιόριστη σημαίνει τίποτα μπορεί να συμβεί. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Όχι, οπότε αν έχετε αναθέσει x σε κάτι άλλο. Έτσι, αν εδώ είπαμε x ισούται με malloc κάτι else-- malloc μέγεθος event-- στη συνέχεια, ότι το αρχικό μπλοκ της μνήμης δεν έχει απελευθερωθεί. Και έχουμε χάσει επίσημα. Αυτό είναι μια διαρροή μνήμης. Χάσαμε όλες τις αναφορές στο εν λόγω μπλοκ μνήμης. Έτσι, δεν υπάρχει κανένας τρόπος που μπορούμε να το απελευθερώσει ποτέ. Εντάξει, έτσι ώστε στη συνέχεια να επιστρέψει 0 μέσα γίνεται. Εντάξει, έτσι υπερχείλισης στοίβας. Ποια είναι η ιδέα εδώ; Έτσι θυμηθείτε, σωρός πηγαίνει προς τα κάτω. Stack ανεβαίνει. Έτσι, αυτό ήταν το παράδειγμα από τη διάλεξη, Νομίζω ότι, όταν ο κύριος είναι ακριβώς πρόκειται να ονομάζουμε συνάρτηση foo, ο οποίος θα να αυτοαποκαλείται αναδρομικά πάνω και ξανά. Έτσι στοίβα τα πλαίσια πρόκειται να λειτουργούν ακριβώς το ίδιο. Έτσι θα πάμε για να ξεκινήσει με την κύρια ως το κάτω πλαίσιο στοίβας. Στη συνέχεια, κύρια πρόκειται να καλέσετε foo, ο οποίος πρόκειται να πάρει ένα πλαίσιο στοίβας. Στη συνέχεια foo πρόκειται να καλέσετε foo και πάλι, η οποία πρόκειται να πάρει ένα άλλο πλαίσιο στοίβας. Και στη συνέχεια ξανά, και ξανά, και ξανά, και ξανά έως ότου, τελικά, τρέχουμε εντός του σωρού. Έτσι, αυτό είναι το πώς θα πάρετε υπερχείλιση στοίβας. Και σε αυτό το σημείο, μπορείτε SEG σφάλμα. Ή θέλετε πραγματικά seg fault πριν αυτό το σημείο, αλλά ναι. ΚΟΙΝΟ: Είναι πυρήνα χωματερή η ίδια όπως seg σφάλμα; ROB: Έτσι θα δείτε κατάτμηση πυρήνα βλάβης που αποτελούν αντικείμενο ντάμπινγκ. Μπορείτε να πάρετε μια χωματερή πυρήνα όταν Σας SEG σφάλμα. Και είναι σαν μια χωματερή από όλα τα περιεχόμενο της τρέχουσας μνήμης σας, έτσι ώστε ότι μπορείτε να δοκιμάσετε και να προσδιορίσει γιατί SEG επικριθεί. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Έτσι, ένα μέσο σφάλμα κατάτμησης υπάρχει μια υπερχείλιση στοίβας. Έτσι, δεν είναι απαραίτητα. Ένα σφάλμα κατάτμησης σημαίνει ότι είστε αγγίζοντας μνήμη με έναν τρόπο δεν πρέπει να είναι. Έτσι, ένας τρόπος για να συμβεί αυτό είναι, όταν μπορείτε στοίβα υπερχείλιση, αρχίζουμε συγκινητικό μνήμη με έναν τρόπο που δεν θα έπρεπε να είναι. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Έτσι, μέσα από ένα άπειρο βρόχο. Όπως, αυτό είναι σαν ένα αναδρομικό άπειρο βρόχου και έτσι έχουμε ένα άλλο στοίβα καρέ κάθε φορά. Αλλά ακριβώς μέσα από ένα κανονικό άπειρο, ενώ ένα-- καλά, ας μην ακόμη και να εκτυπώσετε F-- κάνει κάτι. Όποια και αν είναι. Εμείς δεν πρόκειται να πάρει ένα άλλο πλαίσιο στοίβας. Εμείς απλά θα κρατήσει looping πάνω από αυτή την απλή εντολή. Η στοίβα δεν αυξάνεται. Είναι το γεγονός ότι κάθε αναδρομικό κλήση μας δίνει ένα πλαίσιο στοίβας. Αυτός είναι ο λόγος για τον οποίο έχουμε μια υπερχείλιση στοίβας. Ναι; ΚΟΙΝΟ: Έτσι, αν είπε να πάρει το while loop και στη συνέχεια [δεν ακούγεται]; ROB: Έτσι, αν στο εσωτερικό του βρόχου while υπήρχε μια printf, μπορείτε ακόμα θα Δεν seg σφάλμα. Απλά δεν θέλουν να συγχέουμε τα πράγματα. Θα ήταν βρόχο. Εσείς προτίθεστε να πάρετε μια ενιαία στοίβα το πλαίσιο για την printf. Στη συνέχεια printf θα επιστρέψει. Στη συνέχεια, θα έπαιρνα και πάλι βρόχο. Εσείς προτίθεστε να πάρετε μια ενιαία στοίβα το πλαίσιο για την printf. Θα επιστρέψει. Ενιαίο πλαίσιο στοίβας. Έτσι, δεν έχετε πάρει αυτό το άπειρο συσσωρεύονται πλαίσια στοίβα. ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Ναι. Έτσι, αυτή η υπερχείλιση στοίβας συμβαίνει γιατί κανένα από αυτά Οι κλήσεις για την foo επιστροφή. Έτσι, αν επιστρέψει, τότε θα αρχίσει να χάσουν πλαίσια στοίβα. Και τότε δεν θα στοίβα υπερχείλιση. Και γι 'αυτό θα πρέπει να έχετε μια βασική περίπτωση για την προσωπική σας λειτουργίες. Ναι; ΚΟΙΝΟ: Είναι το δυνητικό μέγεθος και η στοίβα για το σωρό το ίδιο για όλα τα προγράμματα; ROB: Περίπου. Είναι η δυνητική μέγεθος της στοίβας και ο σωρός το ίδιο για όλα τα προγράμματα; Περίπου. Υπάρχει κάποια τυχαιοποίηση προς όπου ξεκινά η στοίβα και όπου ο σωρός αρχίζει. Αν συμβαίνει να έχουν ένα σωρό καθολικές μεταβλητές και τα πράγματα, ίσως πάρει από κάποιο διάστημα για το σωρό σας. Σε ένα σύστημα 64-bit, μπορείτε σχεδόν έχει άπειρη μνήμη. Υπάρχει μόνο τόσο πολύ. Μεταξύ 32 bits και 64 bits, ότι είναι μια σημαντική διαφορά. Θα πάμε για να πάρει ένα σωρό άλλα στοίβα και χώρου σωρού σε μια έκδοση 64-bit συστήματος, επειδή υπάρχει μόνο περισσότερα διευθύνσεις που μπορούν να χρησιμοποιήσουν. Αλλά για ένα μεμονωμένο σύστημα, αυτό θα να είναι περίπου το ίδιο ποσό της στοίβας και χώρο σωρού. Εντάξει. Έτσι το τελευταίο πράγμα είναι συλλογή. Έτσι, θα πρέπει να γνωρίζετε αυτή τη διαδικασία. Υπάρχουν τέσσερα μεγάλα βήματα. Έτσι, η πρώτη θα πρέπει να είναι εύκολο να θυμάστε. Προ-επεξεργασία. Έχει το πρόθεμα προ σε αυτό. Γι 'αυτό έρχεται πριν από οτιδήποτε άλλο. Το πράγμα που πρέπει να θυμάστε είναι το hash. Έτσι hash καθορίζει και κατακερματισμού περιλαμβάνει σε όλα αυτά. Αυτά είναι όλα τα προ-επεξεργαστή οδηγιών. Αυτά είναι τα πράγματα που οι προ-επεξεργαστής φροντίζει. Έτσι, αυτό που κάνει ο προ-επεξεργαστής κάνει; Είναι μια πραγματικά χαζή πράγμα. Όλα είναι ικανά να είναι όλα αυτά αντιγραφής και κομμένα και επικόλληση λειτουργίες. Έτσι hash περιλαμβάνει πρότυπο i0 dot h. Τι είναι αυτό που κάνει; Αρπάζουν το πρότυπο i0 dot h αρχείο και να επικολλήσετε στην κορυφή όπου λέει hash περιλαμβάνει πρότυπο i0 dot h. Και κάθε hash ορίζουν ότι έχουμε δει, τι είναι αυτό που κάνει; Του αντιγράφοντας την αξία ότι η hash καθορισμένοι ορίζεται όπως και επικόλληση ότι όπου κι αν χρησιμοποιείτε την αξία. Έτσι, η προεπεξεργαστή κάνει ακριβώς πραγματικά απλό κείμενο βασίζεται επιχειρήσεις. Κάνει τίποτα έξυπνο. Έτσι, όλα τα άλλα είναι πιο περίπλοκη. Έτσι, τώρα που προεπεξεργαστή είναι στην πράξη, στην πραγματικότητα συγκεντρώνουν. Έτσι τι σημαίνει σύνταξη; Είμαστε τώρα πηγαίνει από c κώδικα σε κώδικα assembly. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Ναι, πιάσαμε αυτό. Έτσι κατάρτιση. Εμείς πάμε από το γ του συνέρχεσθαι. Έτσι, αυτό είναι μια πραγματική αλλαγή γλώσσας. Συγκέντρωση ίδια σημαίνει να πάμε από μια γλώσσα υψηλού επιπέδου σε ένα χαμηλότερο επίπεδο γλώσσας. Και γ είναι μια γλώσσα υψηλού επιπέδου σε σύγκριση με τη συναρμολόγηση. Τι είναι η συνέλευση; Οδηγίες του που είναι, αρκετά πολύ, που για τον επεξεργαστή σας. Αλλά ο υπολογιστής σας εξακολουθεί να κάνει Δεν καταλαβαίνω τη συναρμολόγηση. Κατανοεί μόνο μονάδες και μηδενικά. Έτσι, το επόμενο βήμα είναι η συναρμολόγηση, η οποία μας φέρνει από τις οδηγίες αυτές ότι CPU σας καταλαβαίνει και πραγματικότητα μεταφράζει τους, να οι μονάδες και μηδενικά. Έτσι C για συναρμολόγηση σε δυαδικό. Αλλά δεν έχω ακόμη ένα εκτελέσιμο. Έτσι σκέφτονται τη βιβλιοθήκη CS50. Πρέπει να παρέχεται με ένα δυαδικό Αυτή η βιβλιοθήκη CS50, η οποία έχει GetString και GetInt και όλα αυτά. Αλλά το CS50 library-- σε και από itself-- δεν είναι εκτελέσιμο. Αυτό δεν έχει μια κύρια λειτουργία. Είναι απλά ένα μάτσο δυαδικό που μπορείτε να χρησιμοποιήσετε. Έτσι σύνδεση είναι το πώς θα φέρει σε επαφή όλους από αυτά τα διαφορετικά δυαδικά αρχεία σε ένα πραγματικό εκτελέσιμο. Ένας που μπορείτε να πληκτρολογήσετε dot slash μια τελεία έξω. Έτσι, αυτό είναι σαν το αρχείο που έγραψε, - ανεξάρτητα από το πρόγραμμά σας is-- Ceaser dot c. Αλλά τώρα έχει συνταχθεί κάτω στο δυαδικό. Έτσι Ceaser dot o. Και αυτό είναι CS50 μας βιβλιοθήκες δυαδικό. Και όπου και αν συνδυάζονται σε ένα ενιαίο εκτελέσιμο. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Έτσι το πρώτο περιλαμβάνει, θυμηθείτε, το hash περιλαμβάνουν είναι στην πραγματικότητα μια βήμα προ-επεξεργασίας. Αλλά αυτό είναι ξεχωριστό. Αν δεν είστε χρησιμοποιώντας οποιαδήποτε λειτουργίες που είναι έξω από ενιαίο αρχείο σας, τότε, Όχι, δεν χρειάζεται να συνδέσετε τίποτα δεδομένου ότι έχετε τα πάντα. Τούτου λεχθέντος, printf είναι ότι συνδέεται με. Αν χρησιμοποιείτε ποτέ printf, αυτό είναι κάτι ότι θα πρέπει να συνδέονται σε γιατί δεν γράφουν ότι. Και, στην πραγματικότητα, είναι αυτομάτως printf συνδέονται. Ξέρετε πώς στη γραμμή εντολών ή όταν Πληκτρολογείτε κάνει, θα δείτε ότι έχετε παύλα l CS50, ο οποίος έχει σύνδεση στη βιβλιοθήκη CS50; Printf, και τέτοια πράγματα, πρόκειται να συνδέεται αυτόματα. Οποιεσδήποτε άλλες ερωτήσεις σχετικά με τίποτα; ΚΟΙΝΟ: [δεν ακούγεται]; ROB: Η σύνδεση; Έχουμε ένα σωρό διαφορετικά δυαδικά αρχεία. Αυτή είναι η κανονική παράδειγμα που χρησιμοποιούμε είναι βιβλιοθήκη CS50. Έχουμε καταρτίσει και θα σας δοθεί η δυαδικό για αυτήν τη βιβλιοθήκη CS50. Θέλετε να χρησιμοποιήσετε GetString στο πρόγραμμά σας. Έτσι, πηγαίνετε και να χρησιμοποιήσετε GetString. Αλλά χωρίς δυαδικό κώδικα μου GetString, όταν καταρτίζουν τον κωδικό σας προς τα κάτω, δεν μπορείτε πραγματικά να τρέξει σας πρόγραμμα, επειδή GetString String είναι δεν έχει ακόμη καθοριστεί πλήρως. Είναι μόνο όταν έχετε σύνδεση στο δυαδικό μου που περιέχει GetString ότι τώρα, όλα Εντάξει, μπορώ πραγματικά εκτελέσει GetString. Το αρχείο μου είναι πλήρης. Και μπορώ να τρέξει αυτό. Ναι; ΚΟΙΝΟ: Μήπως συνδέοντας την μετατροπή η δυαδική εκτελέσιμα; Έτσι, ακόμη και αν δεν έχετε άλλα βιβλιοθήκες, δεν θα εξακολουθήσει να είναι απαραίτητο να μεταφράσει η [δεν ακούγεται]; ROB: Έτσι, ένα εκτελέσιμο είναι ακόμα σε δυαδικό. Είναι απλά συνδυάζοντας μια ολόκληρη μάτσο εκτελέσιμα. ΚΟΙΝΟ: Σας ευχαριστώ πολύ. ROB: Δεν υπάρχει πρόβλημα. Οποιεσδήποτε άλλες ερωτήσεις; Σε αντίθετη περίπτωση, είμαστε έτοιμοι. Εντάξει. Ευχαριστώ. [Χειροκρότημα] ΚΟΙΝΟ: Σας ευχαριστώ. ROB: Ναι.