1 00:00:00,000 --> 00:00:03,381 >> [Παίζει μουσική] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [ΑΝΑΠΑΡΑΓΩΓΗ] 4 00:00:11,610 --> 00:00:13,640 >> -Αυτός Είναι ψέματα. 5 00:00:13,640 --> 00:00:14,380 >> -Σχετικά Με τι; 6 00:00:14,380 --> 00:00:17,182 >> -Δεν γνωρίζω. 7 00:00:17,182 --> 00:00:19,990 >> -Γι 'Ό, τι ξέρουμε; 8 00:00:19,990 --> 00:00:23,145 >> -ότι Στις 9:15, Ray Santoya ήταν στο ΑΤΜ. 9 00:00:23,145 --> 00:00:23,644 -Ναι. 10 00:00:23,644 --> 00:00:27,030 Έτσι, το ερώτημα είναι, τι κάνει αυτός στο 9:16; 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Το 9 χιλιοστών σε κάτι. 12 00:00:29,720 --> 00:00:31,540 Ίσως είδε τον ελεύθερο σκοπευτή. 13 00:00:31,540 --> 00:00:33,412 >> -Ή Δούλευε μαζί του. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Πήγαινε πίσω ένα. 16 00:00:36,200 --> 00:00:36,975 >> -Τι βλεπεις? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Φέρτε Το πρόσωπό του επάνω σε πλήρη οθόνη. 19 00:00:47,805 --> 00:00:48,680 >> -His Γυαλιά. 20 00:00:48,680 --> 00:00:50,060 >> -Υπάρχει Είναι μια αντανάκλαση. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Είναι Η ομάδα μπέιζμπολ Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Αυτό είναι το λογότυπό τους. 24 00:01:03,110 --> 00:01:05,820 >> -Και Μιλάει για την όποιος φοράει αυτό το σακάκι. 25 00:01:05,820 --> 00:01:06,670 >> [Σταματήσετε την αναπαραγωγή] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Εντάξει. 27 00:01:07,628 --> 00:01:11,210 Αυτό είναι CS50 και αυτό είναι λίγο πιο της [δεν ακούγεται] με το οποίο είστε 28 00:01:11,210 --> 00:01:12,890 απρόσεκτος με το πρόβλημα που τέσσερις. 29 00:01:12,890 --> 00:01:16,606 Σήμερα αρχίζουμε να κοιτάξουμε λίγο πιο βαθιά σε αυτά τα πράγματα που ονομάζεται δείκτες, 30 00:01:16,606 --> 00:01:18,480 το οποίο ακόμα κι αν είναι μια όμορφη απόκρυφες θέμα, 31 00:01:18,480 --> 00:01:20,813 αποδεικνύεται ότι πρόκειται να είναι τα μέσα με τα οποία θα 32 00:01:20,813 --> 00:01:24,320 μπορεί να ξεκινήσει την κατασκευή και τη συναρμολόγηση πολύ πιο εξελιγμένα προγράμματα. 33 00:01:24,320 --> 00:01:28,150 Αλλά το κάναμε για την περασμένη Τετάρτη μέσω κάποιας πλαστελίνης πρώτα. 34 00:01:28,150 --> 00:01:30,190 Έτσι αυτό, ανάκληση, είναι Binky και τον χρησιμοποίησε 35 00:01:30,190 --> 00:01:33,148 να ρίξετε μια ματιά σε ένα πρόγραμμα που στην πραγματικότητα δεν κάνει τίποτα ενδιαφέρον, 36 00:01:33,148 --> 00:01:34,950 αλλά αποκάλυψε μερικά προβλήματα. 37 00:01:34,950 --> 00:01:38,570 Έτσι για να αρχίσει σήμερα, γιατί δεν περπατάμε γρήγορα μέσα από μερικά από αυτά τα βήματα, 38 00:01:38,570 --> 00:01:41,920 προσπαθήστε να αποστάξει σε όρους ανθρώπου ακριβώς τι συμβαίνει εδώ 39 00:01:41,920 --> 00:01:45,410 και γιατί αυτό είναι κακό, και στη συνέχεια να προχωρήσουμε και πραγματικά να αρχίσει την οικοδόμηση κάτι 40 00:01:45,410 --> 00:01:46,309 με αυτήν την τεχνική; 41 00:01:46,309 --> 00:01:48,350 Έτσι, αυτές ήταν οι πρώτες δύο γραμμές σε αυτό το πρόγραμμα 42 00:01:48,350 --> 00:01:51,340 και σε απλή γλώσσα, αυτό κάνουν αυτοί οι δύο γραμμές; 43 00:01:51,340 --> 00:01:55,600 Κάποιος που είναι αρκετά άνετο με ό, τι δηλώνεται στην οθόνη; 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Ποιες είναι αυτές οι δύο γραμμές να κάνει; 46 00:02:00,120 --> 00:02:02,070 Δεν είναι ό, τι διαφορετικό από μία εβδομάδα, 47 00:02:02,070 --> 00:02:03,611 αλλά υπάρχει κάποια νέα ειδική σύμβολο. 48 00:02:03,611 --> 00:02:04,152 Ναι; 49 00:02:04,152 --> 00:02:05,628 Πίσω εκεί. 50 00:02:05,628 --> 00:02:07,092 >> Κοινό: Δηλώνοντας δείκτες; 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Πείτε ξανά; 52 00:02:08,050 --> 00:02:08,860 Κοινό: Δηλώνοντας δείκτες; 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Δηλώνοντας δείκτες και ας το περιορίσετε λίγο περισσότερο. 54 00:02:11,776 --> 00:02:14,050 Κοινό: [δεν ακούγεται] διεύθυνση x και, στη συνέχεια, y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: Και να τα αντιμετωπίσει. 56 00:02:15,300 --> 00:02:18,550 Έτσι, συγκεκριμένα, τι κάνουμε είναι που δηλώνει δύο μεταβλητές. 57 00:02:18,550 --> 00:02:21,252 Αυτές οι μεταβλητές, όμως, πρόκειται να είναι του τύπου int αστέρων, το οποίο 58 00:02:21,252 --> 00:02:23,210 πιο συγκεκριμένα σημαίνει πρόκειται για την αποθήκευση 59 00:02:23,210 --> 00:02:26,450 Η διεύθυνση ενός int, αντίστοιχα, Χ και Υ. 60 00:02:26,450 --> 00:02:27,660 Τώρα είναι οποιεσδήποτε τιμές υπάρχουν; 61 00:02:27,660 --> 00:02:32,621 Υπάρχουν πραγματικές διευθύνσεις σε αυτές υπάρχει δύο μεταβλητές σε αυτό το χρονικό σημείο; 62 00:02:32,621 --> 00:02:33,120 Κανένα. 63 00:02:33,120 --> 00:02:35,030 Είναι ακριβώς το λεγόμενο τιμές σκουπίδια. 64 00:02:35,030 --> 00:02:38,120 Αν δεν ορίσετε μια πραγματικότητα μεταβλητή, ό, τι ήταν στη μνήμη RAM 65 00:02:38,120 --> 00:02:42,224 προηγουμένως δεν πρόκειται να γεμίσει με μηδενικά και αυτοί οι δύο από αυτές τις μεταβλητές. 66 00:02:42,224 --> 00:02:44,140 Αλλά εμείς δεν γνωρίζουμε ακόμη τι είναι και ότι είναι 67 00:02:44,140 --> 00:02:47,060 πρόκειται να είναι το κλειδί για τους οποίους Binky έχασε το κεφάλι του την περασμένη εβδομάδα. 68 00:02:47,060 --> 00:02:49,980 >> Έτσι, αυτό ήταν το πλαστελίνης ενσάρκωση αυτής της 69 00:02:49,980 --> 00:02:53,580 σύμφωνα με την οποία έχετε μόνο δύο μεταβλητές, λίγο κυκλική κομμάτια από πηλό, 70 00:02:53,580 --> 00:02:57,330 ότι μπορεί να αποθηκεύσει τις μεταβλητές, αλλά ως οι τυλιγμένη βέλη δείχνουν, 71 00:02:57,330 --> 00:03:00,640 δεν είστε πραγματικά δείχνει οπουδήποτε γνωστές per se. 72 00:03:00,640 --> 00:03:03,670 Μέχρι τότε είχαμε αυτή τη γραμμή, και αυτό Ήταν νέα την περασμένη εβδομάδα, malloc για τη μνήμη 73 00:03:03,670 --> 00:03:07,130 κατανομής, το οποίο είναι μόνο ένα φανταχτερό τρόπο του λέει το λειτουργικό σύστημα, το Linux 74 00:03:07,130 --> 00:03:09,750 ή Mac OS ή Windows, hey, να μου δώσει κάποια μνήμη, 75 00:03:09,750 --> 00:03:11,780 και το μόνο που έχετε να πείτε το λειτουργικό σύστημα 76 00:03:11,780 --> 00:03:14,699 είναι ό, τι όταν ζητούν τη μνήμη. 77 00:03:14,699 --> 00:03:16,990 Δεν πρόκειται να με νοιάζει τι θα πάμε να κάνει με αυτό, 78 00:03:16,990 --> 00:03:19,786 αλλά εσείς πρέπει να πει το λειτουργικό το σύστημα αυτό μέσω της malloc. 79 00:03:19,786 --> 00:03:20,286 Ναι; 80 00:03:20,286 --> 00:03:21,078 >> Κοινό: Πόσο; 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Πόσο; 82 00:03:21,994 --> 00:03:25,280 Πόσο σε bytes, και έτσι, αυτό, και πάλι, μια σκηνοθετημένη παράδειγμα, είναι ακριβώς λέει, 83 00:03:25,280 --> 00:03:27,360 να μου δώσει το μέγεθος ενός int. 84 00:03:27,360 --> 00:03:30,550 Τώρα, το μέγεθος ενός int είναι τέσσερα byte ή 32 bit. 85 00:03:30,550 --> 00:03:32,850 Έτσι, αυτό είναι απλώς ένας τρόπος λέγοντας, hey, το λειτουργικό σύστημα, 86 00:03:32,850 --> 00:03:37,290 δώστε μου τέσσερα bytes της μνήμης που μπορώ να χρησιμοποιήσω στη διάθεσή μου, 87 00:03:37,290 --> 00:03:40,560 και συγκεκριμένα, τι κάνει malloc επιστροφή με σεβασμό 88 00:03:40,560 --> 00:03:41,795 σε αυτό το κομμάτι των τεσσάρων bytes; 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Κοινό: Διεύθυνση; 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Η διεύθυνση. 92 00:03:45,901 --> 00:03:47,580 Η διεύθυνση του εν λόγω κομμάτι των τεσσάρων bytes. 93 00:03:47,580 --> 00:03:48,190 Ακριβώς. 94 00:03:48,190 --> 00:03:51,430 Και έτσι αυτό είναι που αποθηκεύονται τελικά στο x και γι 'αυτό δεν το κάνουμε πραγματικότητα 95 00:03:51,430 --> 00:03:55,240 με νοιάζει τι ο αριθμός των ότι διεύθυνση είναι, είτε πρόκειται για ΟΧ1 ή ΟΧ2 96 00:03:55,240 --> 00:03:57,110 ή κάποια αινιγματικά διεύθυνση δεκαεξαδική. 97 00:03:57,110 --> 00:03:59,850 Εμείς απλά ενδιαφέρονται εικαστικά ότι η μεταβλητή x είναι τώρα 98 00:03:59,850 --> 00:04:01,630 που δείχνουν προς αυτή κομμάτι της μνήμης. 99 00:04:01,630 --> 00:04:05,570 Έτσι, το βέλος αντιπροσωπεύει ένα δείκτη, ή πιο συγκεκριμένα, μια διεύθυνση μνήμης. 100 00:04:05,570 --> 00:04:09,120 Αλλά και πάλι, δεν με νοιάζει συνήθως ποιοί είναι αυτοί οι πραγματικές διευθύνσεις. 101 00:04:09,120 --> 00:04:11,780 Τώρα, αυτή η γραμμή λέει ό, τι σε απλή γλώσσα; 102 00:04:11,780 --> 00:04:14,330 Αστέρι x παίρνει 42 ερωτηματικό. 103 00:04:14,330 --> 00:04:17,390 Τι σημαινει αυτο? 104 00:04:17,390 --> 00:04:18,200 Θες να πάμε; 105 00:04:18,200 --> 00:04:20,102 Μην ξύνετε το λαιμό σας. 106 00:04:20,102 --> 00:04:22,360 >> ΚΟΙΝΟ: Η διεύθυνση του x είναι στο 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Η διεύθυνση του x είναι 42. 108 00:04:24,300 --> 00:04:25,190 Όχι αρκετά. 109 00:04:25,190 --> 00:04:28,485 Τόσο κοντά, αλλά όχι αρκετά, γιατί δεν υπάρχει το αστέρι που είναι το πρόθεμα αυτό το x. 110 00:04:28,485 --> 00:04:29,860 Πρέπει λοιπόν να προσαρμόσεις λίγο. 111 00:04:29,860 --> 00:04:31,032 Ναι; 112 00:04:31,032 --> 00:04:36,044 >> ΚΟΙΝΟ: Η τιμή που το δείκτης χ δείχνει να είναι 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Η αξία ότι ο δείκτης χ είναι επισημαίνοντας, ας πούμε, θα είναι 42, 115 00:04:40,840 --> 00:04:44,165 ή με άλλα λόγια, το αστέρι x λέει, πάμε για οποιαδήποτε διεύθυνση 116 00:04:44,165 --> 00:04:48,340 είναι στο x, αν είναι 1 Οξφόρδη Οδός ή 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 ή OX1 ή ox33, ανεξαρτήτως ότι η αριθμητική διεύθυνση είναι, 118 00:04:51,850 --> 00:04:54,380 αστέρων x είναι η εύρεση τιμών του x. 119 00:04:54,380 --> 00:04:57,297 Έτσι πάει σε αυτή τη διεύθυνση και στη συνέχεια, τοποθετήστε τον αριθμό 42 εκεί. 120 00:04:57,297 --> 00:04:59,380 Έτσι, αυτό θα ήταν ένα ισοδύναμο τρόπος για να πούμε ότι. 121 00:04:59,380 --> 00:05:01,860 Έτσι ώστε να είναι όλα ωραία και, στη συνέχεια, θα αντιπροσωπεύει την εικόνα 122 00:05:01,860 --> 00:05:05,370 ως εξής: όπου έχουμε προσθέσει το 42 σε αυτό το κομμάτι των τεσσάρων 123 00:05:05,370 --> 00:05:09,370 bytes στην δεξιά πλευρά, αλλά αυτή η γραμμή ήταν όταν πήγαν στραβά τα πράγματα 124 00:05:09,370 --> 00:05:11,120 και το κεφάλι του Binky έσκασε off σε αυτό το σημείο, 125 00:05:11,120 --> 00:05:15,290 επειδή κακά πράγματα συμβαίνουν όταν Σας dereference τιμές σκουπίδια 126 00:05:15,290 --> 00:05:18,210 ή μπορείτε dereference άκυρο δείκτες, και το λέω άκυρο 127 00:05:18,210 --> 00:05:21,020 επειδή σε αυτό το σημείο η ιστορία, τι είναι μέσα στην ομάδα; 128 00:05:21,020 --> 00:05:24,440 Ποια είναι η τιμή του y με βάση για τα τελευταία βήματα; 129 00:05:24,440 --> 00:05:25,360 Ναι; 130 00:05:25,360 --> 00:05:26,115 Τι είναι αυτό? 131 00:05:26,115 --> 00:05:26,990 >> Κοινό: Μια διεύθυνση. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: Μια διεύθυνση. 133 00:05:28,460 --> 00:05:31,910 Θα πρέπει να είναι μια διεύθυνση αλλά την έχω προετοιμαστεί; 134 00:05:31,910 --> 00:05:32,800 Έτσι, δεν έχω ακόμα. 135 00:05:32,800 --> 00:05:35,430 Έτσι, αυτό που είναι γνωστό ότι είναι εκεί μέσα; 136 00:05:35,430 --> 00:05:37,590 Είναι απλά κάποια αξία σκουπίδια. 137 00:05:37,590 --> 00:05:41,500 Θα μπορούσε να είναι οποιαδήποτε διεύθυνση από μηδέν έως 2 δισεκατομμύρια, αν έχετε δύο συναυλίες της μνήμης RAM, 138 00:05:41,500 --> 00:05:44,289 ή μηδέν έως 4 δισ αν έχετε πήρε τέσσερα gigabytes μνήμης RAM. 139 00:05:44,289 --> 00:05:46,080 Είναι κάποια αξία σκουπίδια, αλλά το πρόβλημα είναι 140 00:05:46,080 --> 00:05:48,200 ότι το λειτουργικό σύστημα, αν δεν σας έχει δώσει 141 00:05:48,200 --> 00:05:51,140 ότι κομμάτι της μνήμης ειδικά ότι προσπαθείτε να πάνε, 142 00:05:51,140 --> 00:05:54,650 είναι γενικά πρόκειται να προκαλέσουν προβλήματα που έχουμε δει ως σφάλμα κατάτμησης. 143 00:05:54,650 --> 00:05:57,810 Έτσι, στην πραγματικότητα, καμία από εσάς που έχετε αγωνίστηκε σε προβλήματα σε ώρες γραφείου 144 00:05:57,810 --> 00:06:00,393 ή σε προβλήματα που είναι πιο γενικά με την προσπάθεια να καταλάβω 145 00:06:00,393 --> 00:06:02,150 ένα σφάλμα κατάτμησης, αυτό σημαίνει ότι σε γενικές γραμμές 146 00:06:02,150 --> 00:06:05,017 είστε σε επαφή με ένα τμήμα του μνήμη που δεν πρέπει να είναι. 147 00:06:05,017 --> 00:06:07,350 Είσαι μνήμης που αγγίζουν το λειτουργικό σύστημα δεν έχει 148 00:06:07,350 --> 00:06:10,450 επιτρέπεται να αγγίξει, αν είναι πηγαίνοντας πολύ μακριά σειρά σας 149 00:06:10,450 --> 00:06:12,870 ή που αρχίζει τώρα, αν είναι επειδή είστε σε επαφή με 150 00:06:12,870 --> 00:06:14,780 μνήμη που είναι μόνο κάποια αξία σκουπίδια. 151 00:06:14,780 --> 00:06:18,230 >> Έτσι κάνει αστέρων x εδώ είδος απροσδιόριστη συμπεριφορά. 152 00:06:18,230 --> 00:06:22,030 Δεν πρέπει ποτέ να το κάνω γιατί αποδόσεις Οι, το πρόγραμμα είναι ακριβώς πρόκειται να συντρίψει, 153 00:06:22,030 --> 00:06:24,050 γιατί λέτε, πηγαίνετε σε αυτή τη διεύθυνση 154 00:06:24,050 --> 00:06:27,000 και δεν έχετε καμία ιδέα για το πού ότι η διεύθυνση είναι στην πραγματικότητα. 155 00:06:27,000 --> 00:06:30,300 Έτσι, το λειτουργικό σύστημα είναι πιθανό πρόκειται να συντρίψει το πρόγραμμά σας 156 00:06:30,300 --> 00:06:33,840 ως αποτέλεσμα και μάλιστα, αυτό είναι τι συνέβη εκεί για να Binky. 157 00:06:33,840 --> 00:06:37,210 Έτσι, τελικά, Binky σταθερό Το πρόβλημα με αυτό. 158 00:06:37,210 --> 00:06:38,909 Έτσι, αυτό το ίδιο το πρόγραμμα ήταν λανθασμένη. 159 00:06:38,909 --> 00:06:41,450 Αλλά αν το είδος προχωρήσουμε και να εκτελέσει αυτή τη γραμμή αντ 'αυτού, 160 00:06:41,450 --> 00:06:45,580 y ισούται με x ακριβώς σημαίνει ανεξαρτήτως διεύθυνση είναι x, το έβαλε επίσης στην ομάδα. 161 00:06:45,580 --> 00:06:48,740 >> Και έτσι με εικόνες, έχουμε εκπροσωπούμενη αυτό με δύο βέλη 162 00:06:48,740 --> 00:06:51,570 από το x και y από κατάδειξης στο ίδιο μέρος. 163 00:06:51,570 --> 00:06:55,760 Έτσι σημασιολογικά, x είναι ίσο για y γιατί και τα δύο 164 00:06:55,760 --> 00:07:00,300 αποθηκεύετε τον ίδιο διεύθυνση, ergo δείχνοντας 42, 165 00:07:00,300 --> 00:07:04,910 και τώρα, όταν λέτε αστέρων y, μεταβείτε στη διεύθυνση y, 166 00:07:04,910 --> 00:07:06,790 αυτό έχει μια ενδιαφέρουσα παρενέργεια. 167 00:07:06,790 --> 00:07:10,320 Έτσι, η διεύθυνση του y είναι η ίδιο πράγμα όπως η διεύθυνση x. 168 00:07:10,320 --> 00:07:15,060 Έτσι, αν σας πω πηγαίνετε στη διεύθυνση στο y και αλλάξτε την τιμή σε 13, 169 00:07:15,060 --> 00:07:17,140 Ποιος άλλος επηρεάζεται; 170 00:07:17,140 --> 00:07:21,100 Χ, το σημείο Δ, να το πω έτσι, θα πρέπει επίσης να επηρεαστούν. 171 00:07:21,100 --> 00:07:24,340 >> Και πράγματι, πώς ο Nick επέστησε αυτή την εικόνα σε πλαστελίνης ήταν ακριβώς αυτό. 172 00:07:24,340 --> 00:07:28,665 Ακόμα κι αν ακολουθούμε το δείκτη y, καταλήξαμε στο ίδιο μέρος, 173 00:07:28,665 --> 00:07:32,780 και έτσι αν ήμασταν για να εκτυπώσετε έξω x ή y pointee του, 174 00:07:32,780 --> 00:07:35,720 Στη συνέχεια θα δούμε την αξία του 13. 175 00:07:35,720 --> 00:07:37,927 Τώρα, λέω να pointee συνεπής με το βίντεο. 176 00:07:37,927 --> 00:07:39,760 Προγραμματιστές, για να μου γνώση, στην πραγματικότητα ποτέ δεν 177 00:07:39,760 --> 00:07:42,460 πω τη λέξη pointee, αυτό που είναι μυτερό 178 00:07:42,460 --> 00:07:44,650 σε, αλλά για λόγους συνέπειας με το βίντεο, να συνειδητοποιήσουν 179 00:07:44,650 --> 00:07:47,520 αυτό είναι όλο που ήταν εννοείται σε αυτή την κατάσταση. 180 00:07:47,520 --> 00:07:54,190 Έτσι, οποιεσδήποτε ερωτήσεις σχετικά με πλαστελίνης ή δείκτες ή malloc ακριβώς ακόμα; 181 00:07:54,190 --> 00:07:54,850 Κανένα? 182 00:07:54,850 --> 00:07:55,470 Εντάξει. 183 00:07:55,470 --> 00:07:58,560 >> Έτσι, χωρίς περαιτέρω φασαρία, ας ρίξουμε μια ματιά 184 00:07:58,560 --> 00:08:00,700 πού αυτό έχει πράγματι έχουν χρησιμοποιηθεί για κάποιο χρονικό διάστημα. 185 00:08:00,700 --> 00:08:03,580 Έτσι είχαμε αυτή τη βιβλιοθήκη CS50 ότι πήρε όλες αυτές τις λειτουργίες. 186 00:08:03,580 --> 00:08:06,810 Έχουμε χρησιμοποιήσει GetInt πολλά, GetString, πιθανώς GetLongLong νωρίτερα 187 00:08:06,810 --> 00:08:09,840 σε PSET μου μία ή έτσι, αλλά τι πραγματικά συμβαίνει; 188 00:08:09,840 --> 00:08:12,920 Λοιπόν, ας ρίξουμε μια γρήγορη ματιά κάτω από την κουκούλα σε ένα πρόγραμμα που 189 00:08:12,920 --> 00:08:17,017 εμπνέει γιατί θα σας δώσει το CS50 βιβλιοθήκη, και μάλιστα από την περασμένη εβδομάδα, 190 00:08:17,017 --> 00:08:18,850 αρχίσαμε να παίρνουμε εκείνες ρόδες μακριά. 191 00:08:18,850 --> 00:08:21,080 Έτσι, αυτό είναι τώρα ταξινομημένο του μετά θάνατον για το τι 192 00:08:21,080 --> 00:08:23,690 έχει ξεκινήσει στο εσωτερικό της βιβλιοθήκης CS50, 193 00:08:23,690 --> 00:08:27,250 παρόλο που τώρα θα αρχίσει να κινείται μακριά από αυτό για τα περισσότερα προγράμματα. 194 00:08:27,250 --> 00:08:29,460 >> Έτσι, αυτό είναι ένα πρόγραμμα που ονομάζεται scanf 0. 195 00:08:29,460 --> 00:08:30,510 Είναι εξαιρετικά σύντομη. 196 00:08:30,510 --> 00:08:33,909 Έχει ακριβώς αυτές τις γραμμές, αλλά εισάγει μια λειτουργία που ονομάζεται scanf 197 00:08:33,909 --> 00:08:36,909 ότι είμαστε πραγματικά πρόκειται να δούμε σε μια στιγμή στο εσωτερικό της βιβλιοθήκης CS50, 198 00:08:36,909 --> 00:08:38,600 αν και με ελαφρώς διαφορετική μορφή. 199 00:08:38,600 --> 00:08:41,330 Έτσι, αυτό το πρόγραμμα στη γραμμή 16 η οποία μια μεταβλητή x. 200 00:08:41,330 --> 00:08:43,150 Έτσι δώστε μου τέσσερα byte για έναν int. 201 00:08:43,150 --> 00:08:45,750 Είναι πει χρήστη, αριθμό παρακαλώ, και στη συνέχεια, 202 00:08:45,750 --> 00:08:49,010 Αυτή είναι μια ενδιαφέρουσα γραμμή ότι στην πραγματικότητα ενώνει την περασμένη εβδομάδα 203 00:08:49,010 --> 00:08:49,790 και αυτό. 204 00:08:49,790 --> 00:08:53,230 Scanf, και στη συνέχεια παρατηρήσετε ότι παίρνει ένα συμβολοσειρά μορφοποίησης, όπως printf, 205 00:08:53,230 --> 00:08:57,480 % i σημαίνει int, και στη συνέχεια να παίρνει ένα Το δεύτερο επιχείρημα το οποίο φαίνεται λίγο 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Είναι ampersand x, και να θυμηθούμε, είδαμε μόνο μια φορά την περασμένη εβδομάδα. 208 00:09:01,880 --> 00:09:03,465 Τι εμπορικό και χ αντιπροσωπεύουν; 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Τι κάνουμε σε εμπορικό και C; 211 00:09:08,450 --> 00:09:08,950 Ναι; 212 00:09:08,950 --> 00:09:10,024 >> ΚΟΙΝΟ: Η διεύθυνση της. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Η διεύθυνση της. 214 00:09:11,190 --> 00:09:13,190 Έτσι είναι το αντίθετο του φορέα αστέρων, 215 00:09:13,190 --> 00:09:17,270 ενώ ο χειριστής αστέρι λέει, πηγαίνετε στο Αυτή η διεύθυνση, το εμπορικό και χειριστή 216 00:09:17,270 --> 00:09:20,280 λέει, να καταλάβω το διεύθυνση αυτής της μεταβλητής, 217 00:09:20,280 --> 00:09:23,530 και έτσι αυτό είναι το κλειδί, επειδή Σκοπός scanf στη ζωή 218 00:09:23,530 --> 00:09:26,320 είναι να σαρώσει το χρήστη είσοδο από το πληκτρολόγιο, 219 00:09:26,320 --> 00:09:29,970 ανάλογα με ό, τι αυτός ή αυτή τύπων, και στη συνέχεια να διαβάσουμε είσοδο του χρήστη 220 00:09:29,970 --> 00:09:32,970 σε μια μεταβλητή, αλλά εμείς είδε στις τελευταίες δύο εβδομάδες 221 00:09:32,970 --> 00:09:36,080 ότι η λειτουργία εναλλαγής που θα Προσπάθησα αβίαστα να εφαρμόσουν 222 00:09:36,080 --> 00:09:37,110 ήταν απλά σπασμένα. 223 00:09:37,110 --> 00:09:42,470 Υπενθυμίζεται ότι με τη λειτουργία εναλλαγής, αν δηλώσαμε απλά Α και Β όπως ints, 224 00:09:42,470 --> 00:09:47,040 κάναμε με επιτυχία το ανταλλάξετε δύο μεταβλητές μέσα της ανταλλαγής 225 00:09:47,040 --> 00:09:50,080 ακριβώς όπως με το γάλα και ΕΕ, αλλά μόλις επέστρεψε ανταλλαγής, 226 00:09:50,080 --> 00:09:55,200 ποιο ήταν το αποτέλεσμα σε σχέση με στο x και y, οι αρχικές τιμές; 227 00:09:55,200 --> 00:09:55,700 Τίποτα. 228 00:09:55,700 --> 00:09:56,200 Ναι. 229 00:09:56,200 --> 00:09:59,754 Τίποτα δεν συνέβη εκείνη την εποχή, επειδή swaps αλλάξετε μόνο τοπικά αντίγραφα της, 230 00:09:59,754 --> 00:10:01,670 που είναι να πω, όλα αυτή τη φορά, κάθε φορά που έχουμε 231 00:10:01,670 --> 00:10:04,010 έχουν περνώντας επιχειρήματα τις λειτουργίες, είμαστε 232 00:10:04,010 --> 00:10:05,939 απλά περνώντας τα αντίγραφα αυτών των επιχειρημάτων. 233 00:10:05,939 --> 00:10:07,980 Μπορείτε να το κάνετε με αυτό ό, τι θέλετε με αυτά, 234 00:10:07,980 --> 00:10:10,890 αλλά πρόκειται να έχει καμία επίδραση επί των αρχικών τιμών. 235 00:10:10,890 --> 00:10:13,650 Έτσι, αυτό είναι προβληματικό, αν θέλουν να έχουν μια λειτουργία όπως scanf 236 00:10:13,650 --> 00:10:17,170 στη ζωή, σκοπός του οποίου είναι να σαρώσει εισόδου του χρήστη από το πληκτρολόγιο 237 00:10:17,170 --> 00:10:22,010 και στη συνέχεια να συμπληρώσετε τα κενά, έτσι ώστε να μιλούν, δηλαδή, να δώσει μια μεταβλητή, όπως x 238 00:10:22,010 --> 00:10:25,410 μια τιμή, γιατί αν ήμουν για να περάσει ακριβώς x για να scanf, 239 00:10:25,410 --> 00:10:28,790 αν σκεφτεί κανείς τη λογική της τελευταίας εβδομάδα, scanf μπορεί να κάνει ό, τι θέλει 240 00:10:28,790 --> 00:10:33,100 με ένα αντίγραφο του x, αλλά δεν μπορούσε για να αλλάξετε μόνιμα χ, εάν δεν δώσουμε 241 00:10:33,100 --> 00:10:37,120 Scanf ένα χάρτη θησαυρού, να το πω έτσι, όπου x σηματοδοτεί το σημείο, σύμφωνα με την οποία 242 00:10:37,120 --> 00:10:41,860 περνάμε στη διεύθυνση του x ώστε scanf μπορεί να πάει εκεί και πραγματικά αλλαγή 243 00:10:41,860 --> 00:10:42,920 η τιμή του x. 244 00:10:42,920 --> 00:10:45,080 Και έτσι πράγματι, όλα ότι το πρόγραμμα αυτό δεν 245 00:10:45,080 --> 00:10:53,180 αν κάνω scanf 0, στην πηγή μου Κατάλογο 5m, κάνουν scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot κάθετος scanf, αριθμός 50 παρακαλώ, ευχαριστώ για το 50. 247 00:10:57,730 --> 00:11:01,020 >> Έτσι δεν είναι όλα αυτά ενδιαφέροντα, αλλά τι πραγματικά συμβαίνει 248 00:11:01,020 --> 00:11:04,820 είναι ότι το συντομότερο Καλώ scanf εδώ, η τιμή του x 249 00:11:04,820 --> 00:11:06,410 είναι να αλλάξει μόνιμα. 250 00:11:06,410 --> 00:11:08,335 Τώρα, αυτό φαίνεται ωραίο και καλό, και στην πραγματικότητα, 251 00:11:08,335 --> 00:11:11,200 Φαίνεται σαν να μην χρειάζεται πραγματικά η βιβλιοθήκη CS50 καθόλου πια. 252 00:11:11,200 --> 00:11:13,960 Για παράδειγμα, ας τρέξει Αυτό για άλλη μια φορά εδώ. 253 00:11:13,960 --> 00:11:15,750 Επιτρέψτε μου να το επαναλάβει για ένα δευτερόλεπτο. 254 00:11:15,750 --> 00:11:20,600 Ας δοκιμάσουμε μια σειρά παρακαλώ και αντί να λέει 50 όπως πριν, 255 00:11:20,600 --> 00:11:22,810 ας πούμε όχι. 256 00:11:22,810 --> 00:11:24,000 Εντάξει, αυτό είναι λίγο περίεργο. 257 00:11:24,000 --> 00:11:25,270 ΕΝΤΆΞΕΙ. 258 00:11:25,270 --> 00:11:28,680 Και μόνο μερικές ανοησίες εδώ. 259 00:11:28,680 --> 00:11:31,170 Έτσι δεν φαίνεται να χειριστεί λανθασμένες καταστάσεις. 260 00:11:31,170 --> 00:11:33,620 Γι 'αυτό και πρέπει να ελάχιστα αρχή προσθέτοντας κάποιο λάθος ελέγχου 261 00:11:33,620 --> 00:11:37,460 για να βεβαιωθείτε ότι ο χρήστης έχει δακτυλογραφημένες σε ένα πραγματικό αριθμό, όπως το 50, 262 00:11:37,460 --> 00:11:40,720 επειδή προφανώς πληκτρολογώντας λέξεις δεν αναγνωρίζεται ως προβληματική, 263 00:11:40,720 --> 00:11:42,020 αλλά μάλλον θα πρέπει να είναι. 264 00:11:42,020 --> 00:11:46,450 >> Ας ρίξουμε μια ματιά σε αυτή την έκδοση τώρα που είναι προσπάθειά μου να reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Αν scanf έχει όλα αυτά λειτουργικότητα χτίστηκε το, 266 00:11:48,437 --> 00:11:51,270 γιατί έχουμε απρόσεκτος με αυτούς ρόδες όπως GetString; 267 00:11:51,270 --> 00:11:55,450 Λοιπόν, εδώ είναι ίσως το δικό μου απλή έκδοση του GetString 268 00:11:55,450 --> 00:12:00,766 όπου πριν από μία εβδομάδα, μπορεί να έχω πει, να μου δώσει μια σειρά και να το ονομάσουμε buffer. 269 00:12:00,766 --> 00:12:03,390 Σήμερα, είμαι πρόκειται να ξεκινήσει μόνο λέγοντας αστέρων char, η οποία, ανάκληση, 270 00:12:03,390 --> 00:12:04,400 είναι ακριβώς συνώνυμες. 271 00:12:04,400 --> 00:12:06,629 Φαίνεται πιο τρομακτικός αλλά είναι ακριβώς το ίδιο πράγμα. 272 00:12:06,629 --> 00:12:09,420 Έτσι, δώστε μου μια μεταβλητή που ονομάζεται ρυθμιστικό ότι πρόκειται να αποθηκεύσετε ένα string, 273 00:12:09,420 --> 00:12:12,780 πείτε το string χρήστης παρακαλούμε, και, στη συνέχεια, ακριβώς όπως πριν, 274 00:12:12,780 --> 00:12:17,760 ας προσπαθήσουμε να δανειστεί αυτό το μάθημα scanf % s αυτή τη φορά και στη συνέχεια να περάσει σε ρυθμιστικό διάλυμα. 275 00:12:17,760 --> 00:12:19,310 Τώρα, ένα γρήγορο έλεγχο λογικότητας. 276 00:12:19,310 --> 00:12:22,120 Γιατί δεν λέμε εμπορικό και ρυθμιστικό αυτή τη φορά; 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Συναγάγει από το προηγούμενο παράδειγμα. 279 00:12:26,625 --> 00:12:28,000 Κοινό: Χαρ αστέρι είναι ένας δείκτης. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Ακριβώς, γιατί αυτή τη φορά, char 281 00:12:29,920 --> 00:12:34,080 αστέρων είναι ήδη ένας δείκτης, μια διεύθυνση, εξ ορισμού αυτής της αστέρι είναι εκεί. 282 00:12:34,080 --> 00:12:37,530 Και αν scanf αναμένει μια διεύθυνση, αρκεί μόνο να περάσει στο ρυθμιστικό. 283 00:12:37,530 --> 00:12:39,260 Δεν χρειάζεται να πω ρυθμιστικό Ampersand. 284 00:12:39,260 --> 00:12:42,177 Για τους περίεργους, θα μπορούσατε κάνει κάτι τέτοιο. 285 00:12:42,177 --> 00:12:43,510 Θα έχουν διαφορετικό νόημα. 286 00:12:43,510 --> 00:12:47,240 Αυτό θα σας δώσει ένα δείκτη σε ένα δείκτη, το οποίο είναι πραγματικά 287 00:12:47,240 --> 00:12:50,050 μια έγκυρη πράγμα σε C, αλλά για τώρα, ας το κρατήσουμε απλό 288 00:12:50,050 --> 00:12:51,750 και να κρατήσει την ιστορία συνεπής. 289 00:12:51,750 --> 00:12:54,100 Είμαι ακριβώς πρόκειται να περάσει σε buffer και αυτό είναι σωστό. 290 00:12:54,100 --> 00:12:56,487 Το πρόβλημα είναι όμως αυτό. 291 00:12:56,487 --> 00:12:58,820 Επιτρέψτε μου να πάει μπροστά και να τρέξει αυτό προγράμματος μετά τη μεταγλώττιση. 292 00:12:58,820 --> 00:13:00,902 Κάντε scanf 1. 293 00:13:00,902 --> 00:13:02,610 Γαμώτο, compiler μου πιάσει λάθος μου. 294 00:13:02,610 --> 00:13:04,090 Δώσε μου ένα δευτερόλεπτο. 295 00:13:04,090 --> 00:13:05,460 Κλαγγή. 296 00:13:05,460 --> 00:13:06,990 Ας πούμε scanf-1.γ. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ΕΝΤΆΞΕΙ. 299 00:13:11,380 --> 00:13:12,720 Εκεί πάμε. 300 00:13:12,720 --> 00:13:14,280 Το χρειάζομαι. 301 00:13:14,280 --> 00:13:16,750 CS50 ID έχει διάφορες ρυθμίσεις διαμόρφωσης 302 00:13:16,750 --> 00:13:18,280 ότι προστατεύουν από τον εαυτό σας. 303 00:13:18,280 --> 00:13:21,300 Έπρεπε να απενεργοποιήσετε εκείνα από τρέχει κλαγγή το χέρι αυτή τη φορά. 304 00:13:21,300 --> 00:13:22,140 Έτσι κορδόνι παρακαλώ. 305 00:13:22,140 --> 00:13:25,560 Πάω να πάει μπροστά και πληκτρολογήστε στην αγαπημένη μου γεια κόσμο. 306 00:13:25,560 --> 00:13:26,490 Εντάξει, null. 307 00:13:26,490 --> 00:13:27,700 Αυτό δεν είναι αυτό που πληκτρολογήσατε. 308 00:13:27,700 --> 00:13:29,690 Γι 'αυτό είναι ενδεικτικό της κάτι που είναι λάθος. 309 00:13:29,690 --> 00:13:33,920 Επιτρέψτε μου να πάω μπροστά και πληκτρολογήστε σε μια πολύ μακρά σειρά. 310 00:13:33,920 --> 00:13:37,210 Ευχαριστώ για τη μηδενική και δεν ξέρω αν Πάω να είναι σε θέση να συντρίψει. 311 00:13:37,210 --> 00:13:40,240 Ας δοκιμάσουμε ένα μικρό αντίγραφο επικόλληση και να δούμε αν αυτό βοηθάει. 312 00:13:40,240 --> 00:13:43,290 Απλά επικολλήστε σε πολλά από αυτά. 313 00:13:43,290 --> 00:13:47,310 Είναι σίγουρα ένα μεγαλύτερο κορδόνι από το συνηθισμένο. 314 00:13:47,310 --> 00:13:51,450 Ας πραγματικά να το γράψει. 315 00:13:51,450 --> 00:13:51,950 Κανένα. 316 00:13:51,950 --> 00:13:52,650 Ανάθεμα. 317 00:13:52,650 --> 00:13:53,480 Δεν βρέθηκε εντολή. 318 00:13:53,480 --> 00:13:54,550 Έτσι, αυτό είναι άσχετο. 319 00:13:54,550 --> 00:13:56,440 Αυτό συμβαίνει γιατί επικολληθεί κάποια κακά χαρακτήρες, 320 00:13:56,440 --> 00:13:59,780 αλλά που αυτό δεν πρόκειται να λειτουργήσει. 321 00:13:59,780 --> 00:14:03,510 >> Ας προσπαθήσουμε άλλη μία φορά, γιατί Είναι πιο διασκεδαστικό αν το συντριβή πραγματικότητα. 322 00:14:03,510 --> 00:14:09,116 Ας το είδος αυτό και τώρα, είμαι πρόκειται να αντιγράψετε ένα πραγματικά μεγάλο κορδόνι 323 00:14:09,116 --> 00:14:10,990 και τώρα ας δούμε αν μπορούμε μπορεί να διακοπεί η λειτουργία του αυτό το πράγμα. 324 00:14:10,990 --> 00:14:14,235 Ανακοίνωση παρέλειψα χώρους και νέες γραμμές και ερωτηματικά 325 00:14:14,235 --> 00:14:16,035 και όλα τα funky χαρακτήρες. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Και τώρα το δίκτυο είναι ακριβώς να είναι αργή. 329 00:14:22,880 --> 00:14:27,460 Κράτησα πατημένο το πλήκτρο Command-V πάρα πολύ καιρό, σαφώς. 330 00:14:27,460 --> 00:14:28,190 Ανάθεμα! 331 00:14:28,190 --> 00:14:29,260 Δεν βρέθηκε εντολή. 332 00:14:29,260 --> 00:14:29,780 >> ΕΝΤΆΞΕΙ. 333 00:14:29,780 --> 00:14:32,240 Λοιπόν, το θέμα είναι παρ 'όλα αυτά η ακόλουθη. 334 00:14:32,240 --> 00:14:36,910 Έτσι, αυτό που πραγματικά συμβαίνει σχετικά με την παρούσα δήλωση 335 00:14:36,910 --> 00:14:39,240 ρυθμιστικού char αστέρι στη γραμμή 16; 336 00:14:39,240 --> 00:14:41,820 Έτσι, αυτό που θέλω να πω όταν δηλώνουμε έναν pointer; 337 00:14:41,820 --> 00:14:47,440 Όλα τα παίρνω είναι μια τιμή τεσσάρων byte που ονομάζεται ρυθμιστικό, αλλά αυτό που είναι μέσα από αυτό 338 00:14:47,440 --> 00:14:49,540 αυτή τη στιγμή? 339 00:14:49,540 --> 00:14:50,930 Είναι απλά κάποια αξία σκουπίδια. 340 00:14:50,930 --> 00:14:54,170 Επειδή κάθε φορά που θα δηλώσετε μια μεταβλητή σε C, είναι μερικά μόνο από τα σκουπίδια αξίας, 341 00:14:54,170 --> 00:14:56,220 και αρχίζουμε να ταξίδι πάνω από αυτή την πραγματικότητα. 342 00:14:56,220 --> 00:14:59,720 Τώρα, όταν λέω scanf, πηγαίνετε σε αυτή τη διεύθυνση 343 00:14:59,720 --> 00:15:01,520 και βάλετε ό, τι πληκτρολογεί ο χρήστης. 344 00:15:01,520 --> 00:15:06,400 Αν ο χρήστης πληκτρολογήσει σε ένα γεια κόσμο, και, όπου μπορώ να το πω; 345 00:15:06,400 --> 00:15:07,750 Ρυθμιστικό είναι ένα τιμή σκουπίδια. 346 00:15:07,750 --> 00:15:11,510 >> Έτσι, αυτό είναι το είδος του σαν ένα βέλος αυτό είναι που δείχνουν ποιος ξέρει πού. 347 00:15:11,510 --> 00:15:13,880 Ίσως αυτό είναι που δείχνουν εδώ στη μνήμη μου. 348 00:15:13,880 --> 00:15:16,560 Και έτσι όταν ο χρήστης τύποι στο hello world, 349 00:15:16,560 --> 00:15:22,380 Το πρόγραμμα προσπαθεί να βάλει το κορδόνι hello world ανάποδη 0 350 00:15:22,380 --> 00:15:23,910 σε αυτό το κομμάτι της μνήμης. 351 00:15:23,910 --> 00:15:27,070 Αλλά με μεγάλη πιθανότητα, αλλά σαφώς δεν είναι 100% πιθανότητα, 352 00:15:27,070 --> 00:15:30,440 ο υπολογιστής θα συντριβή στη συνέχεια το πρόγραμμα, διότι αυτό δεν είναι 353 00:15:30,440 --> 00:15:32,490 μνήμη μου θα πρέπει να επιτρέπεται να αγγίξει. 354 00:15:32,490 --> 00:15:36,330 Έτσι, με λίγα λόγια, αυτό το πρόγραμμα είναι ελαττωματική ακριβώς για αυτόν τον λόγο. 355 00:15:36,330 --> 00:15:38,070 Είμαι ουσιαστικά δεν κάνει τι; 356 00:15:38,070 --> 00:15:42,366 Ποια μέτρα έχουν παρέλειψα, όπως ακριβώς θα παραλειφθεί με πρώτο παράδειγμα Binky του; 357 00:15:42,366 --> 00:15:42,866 Ναι; 358 00:15:42,866 --> 00:15:43,710 >> Κοινό: κατανομή μνήμης; 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: κατανομή μνήμης. 360 00:15:45,001 --> 00:15:48,400 Δεν έχω πραγματικά διατεθεί οποιαδήποτε μνήμη αυτής της πετονιάς. 361 00:15:48,400 --> 00:15:50,270 Έτσι μπορούμε να το διορθώσω αυτό σε μια-δυο τρόπους. 362 00:15:50,270 --> 00:15:52,700 Ένα, μπορούμε να το κρατήσετε απλό και στην πραγματικότητα, τώρα είστε 363 00:15:52,700 --> 00:15:55,116 Θα αρχίσουμε να βλέπουμε είναι δυσδιάκριτα των γραμμών ανάμεσα στο τι 364 00:15:55,116 --> 00:15:58,520 ένας πίνακας είναι, ό, τι είναι ένα string, τι char αστέρων είναι, ό, τι μια σειρά από χαρακτήρες 365 00:15:58,520 --> 00:15:59,020 είναι. 366 00:15:59,020 --> 00:16:02,450 Εδώ είναι ένα δεύτερο παράδειγμα που αφορούν χορδές και ειδοποίηση 367 00:16:02,450 --> 00:16:05,690 όλα τα έχω κάνει on line 16 είναι, αντί να λέει 368 00:16:05,690 --> 00:16:09,530 ότι το ρυθμιστικό θα είναι μια χαρα αστέρι, ένας δείκτης σε ένα κομμάτι της μνήμης, 369 00:16:09,530 --> 00:16:14,057 Πάω να δώσει πολύ δυναμικά τον εαυτό μου ένα ρυθμιστικό για 16 χαρακτήρες, 370 00:16:14,057 --> 00:16:16,390 και στην πραγματικότητα, εάν είστε εξοικειωμένοι με τον όρο buffering, 371 00:16:16,390 --> 00:16:20,570 πιθανότατα από τον κόσμο του βίντεο, Όταν ένα βίντεο είναι ρυθμιστικό, ρυθμιστικό, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Λοιπόν, ποια είναι η σύνδεση εδώ; 374 00:16:22,550 --> 00:16:24,960 Λοιπόν, Μέσα από το YouTube και στο εσωτερικό των παικτών βίντεο 375 00:16:24,960 --> 00:16:27,200 γενικά είναι ένας πίνακας αυτό είναι μεγαλύτερο από 16. 376 00:16:27,200 --> 00:16:30,340 Θα μπορούσε να είναι ένας πίνακας μεγέθους ενός megabyte, ίσως 10 ΜΒ, 377 00:16:30,340 --> 00:16:34,330 και σε αυτή την σειρά κάνει το πρόγραμμα περιήγησής σας κατεβάσετε ένα σωρό bytes, 378 00:16:34,330 --> 00:16:37,500 ένα σωρό ΜΒ βίντεο, και το video player, 379 00:16:37,500 --> 00:16:40,930 YouTube ή όποιος είναι, ξεκινά ανάγνωση του bytes από την εν λόγω διάταξη, 380 00:16:40,930 --> 00:16:43,530 και κάθε φορά που θα δείτε το λέξη buffering, buffering, 381 00:16:43,530 --> 00:16:46,350 αυτό σημαίνει ότι ο παίκτης έχει φτάσει στο τέλος της εν λόγω διάταξης. 382 00:16:46,350 --> 00:16:50,430 Το δίκτυο είναι τόσο αργός που δεν έχει ξαναγέμισε την σειρά με περισσότερα byte 383 00:16:50,430 --> 00:16:55,610 και έτσι είστε έξω από bits να εμφανιστεί στο χρήστη. 384 00:16:55,610 --> 00:16:59,430 >> Έτσι ρυθμιστικό είναι μια ικανή όρος εδώ στο ότι είναι απλά ένας πίνακας, ένα μεγάλο κομμάτι της μνήμης. 385 00:16:59,430 --> 00:17:02,530 Και αυτό θα το φτιάξω επειδή αποδεικνύεται 386 00:17:02,530 --> 00:17:07,410 ότι μπορείτε να προσφέρετε σαν συστοιχίες είναι διευθύνσεις, παρόλο ρυθμιστικού 387 00:17:07,410 --> 00:17:10,710 είναι απλώς ένα σύμβολο, είναι ένα ακολουθία χαρακτήρων, ρυθμιστικό, 388 00:17:10,710 --> 00:17:14,760 ότι είναι χρήσιμο για μένα, ο προγραμματιστής, μπορείτε να περάσετε γύρω από το όνομά του 389 00:17:14,760 --> 00:17:17,079 σαν να ήταν ένα δείκτη, σαν να 390 00:17:17,079 --> 00:17:21,000 ήταν η διεύθυνση της κομμάτι μνήμη για 16 χαρακτήρες. 391 00:17:21,000 --> 00:17:24,530 Έτσι, αυτό είναι να πω, μπορώ να περάσω η scanf ακριβώς αυτή η λέξη 392 00:17:24,530 --> 00:17:30,670 και έτσι τώρα, αν κάνω αυτό το πρόγραμμα, κάνουν scanf 2, κουκίδα κάθετος scanf 2, 393 00:17:30,670 --> 00:17:35,386 και πληκτρολογήστε hello world, Εισάγετε, ότι time-- 394 00:17:35,386 --> 00:17:37,590 >> Χμμ, τι συνέβη; 395 00:17:37,590 --> 00:17:39,340 String παρακαλώ. 396 00:17:39,340 --> 00:17:41,430 Τι έκανα λάθος; 397 00:17:41,430 --> 00:17:43,800 Γεια σας κόσμο, ρυθμιστικό. 398 00:17:43,800 --> 00:17:44,705 Γειά σου Κόσμε. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Αχ, ξέρω τι κάνει. 401 00:17:49,420 --> 00:17:49,920 ΕΝΤΆΞΕΙ. 402 00:17:49,920 --> 00:17:51,628 Έτσι είναι μέχρι και την ανάγνωση μέχρι την πρώτη χώρου. 403 00:17:51,628 --> 00:17:55,680 Ας εξαπατήσει για μια στιγμή και πω Ήθελα απλώς να πληκτρολογήσετε κάτι 404 00:17:55,680 --> 00:18:01,408 πραγματικά μεγάλο, όπως αυτό είναι μια μεγάλη πρόταση αυτό είναι ένα, δύο, τρία, τέσσερα, πέντε, 405 00:18:01,408 --> 00:18:04,420 έξι, επτά, οκτώ, εννέα, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 ΕΝΤΆΞΕΙ. 407 00:18:05,300 --> 00:18:07,600 Είναι πράγματι μια μεγάλη πρόταση. 408 00:18:07,600 --> 00:18:10,710 Έτσι, αυτή η πρόταση είναι περισσότερο από 16 χαρακτήρες 409 00:18:10,710 --> 00:18:13,670 και έτσι όταν πατήσω το enter, τι πρόκειται να συμβεί; 410 00:18:13,670 --> 00:18:16,940 Λοιπόν, σε αυτή την περίπτωση η ιστορία, είχα δηλώσει ρυθμιστικό 411 00:18:16,940 --> 00:18:22,190 να είναι στην πραγματικότητα μια σειρά με 16 χαρακτήρες είναι έτοιμα να ξεκινήσουν. 412 00:18:22,190 --> 00:18:27,426 Έτσι, ένα, δύο, τρία, τέσσερα, πέντε, έξι, επτά, οκτώ, εννέα, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Έτσι 16 χαρακτήρες, και τώρα, όταν read in κάτι τέτοιο είναι μια μακρά 415 00:18:34,410 --> 00:18:43,950 φράση, τι πρόκειται να συμβεί είναι ότι Πάω να διαβάσω σε αυτό είναι μια μακρά 416 00:18:43,950 --> 00:18:49,660 S-E-Ν-Τ-Ε-Ν-Ο-Ε, πρόταση. 417 00:18:49,660 --> 00:18:52,270 >> Έτσι, αυτό είναι σκόπιμα ένα κακό πράγμα που μπορώ 418 00:18:52,270 --> 00:18:55,060 συνεχίσουν να γράφουν πέραν της τα όρια του πίνακα μου, 419 00:18:55,060 --> 00:18:56,660 πέρα από τα όρια του ρυθμιστικού μου. 420 00:18:56,660 --> 00:19:00,100 Θα μπορούσα να πάρετε τυχεροί και το πρόγραμμα θα συνεχίσει να τρέχει και δεν με νοιάζει, 421 00:19:00,100 --> 00:19:03,450 αλλά μιλώντας γενικά, αυτό Θα διακοπεί η λειτουργία πράγματι το πρόγραμμά μου, 422 00:19:03,450 --> 00:19:06,440 και είναι ένα σφάλμα το οποίο μου κωδικοποιήσει τη στιγμή που μπαίνω 423 00:19:06,440 --> 00:19:08,576 πέρα από τα όρια της εν λόγω διάταξης, γιατί 424 00:19:08,576 --> 00:19:10,450 Δεν ξέρω αν είναι κατ 'ανάγκη θα συντριβή 425 00:19:10,450 --> 00:19:12,120 ή αν είμαι απλώς πρόκειται να πάρετε τυχεροί. 426 00:19:12,120 --> 00:19:15,750 Έτσι, αυτό είναι προβληματικό, διότι σε Στην περίπτωση αυτή, δεν φαίνεται να εργαστούν 427 00:19:15,750 --> 00:19:20,931 και ας βάλει στον πειρασμό τη μοίρα εδώ, έστω και αν η IDE φαίνεται να ανεχθεί αρκετά 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Εκεί πάμε. 430 00:19:22,040 --> 00:19:23,240 Τέλος. 431 00:19:23,240 --> 00:19:26,470 Έτσι είμαι η μόνη που μπορεί να δει αυτό. 432 00:19:26,470 --> 00:19:29,630 Γι 'αυτό μόλις είχε πολλή διασκέδαση πληκτρολόγηση από ένα πραγματικά μεγάλο χρονικό πραγματική φράση 433 00:19:29,630 --> 00:19:32,800 ότι σίγουρα υπέρβαση 16 bytes, γιατί 434 00:19:32,800 --> 00:19:38,050 δακτυλογραφημένες σε αυτό το τρελό καιρό πολλαπλών γραμμών φράση, και στη συνέχεια να παρατηρήσετε τι συνέβη. 435 00:19:38,050 --> 00:19:41,110 Το πρόγραμμα προσπάθησε να το εκτυπώσετε και στη συνέχεια πήρε ένα σφάλμα κατάτμησης 436 00:19:41,110 --> 00:19:44,430 και τα ελαττώματα τμηματοποίησης είναι όταν κάτι σαν αυτό που συμβαίνει 437 00:19:44,430 --> 00:19:47,650 και το λειτουργικό σύστημα, λέει ο Όχι, δεν μπορεί να αγγίξει τις μνήμες. 438 00:19:47,650 --> 00:19:49,570 Εμείς πάμε για να σκοτώσει το πρόγραμμα συνολικά. 439 00:19:49,570 --> 00:19:51,180 >> Έτσι, αυτό φαίνεται προβληματικό. 440 00:19:51,180 --> 00:19:54,540 Έχω βελτιωθεί το πρόγραμμα με το οποίο τουλάχιστον έχουν κάποια μνήμη, 441 00:19:54,540 --> 00:19:58,000 αλλά αυτό φαίνεται να περιορίζεται η GetString λειτουργία για να πάρει 442 00:19:58,000 --> 00:20:00,780 χορδές κάποιου πεπερασμένου μήκους 16. 443 00:20:00,780 --> 00:20:04,200 Έτσι, αν θέλετε να υποστηρίξετε περισσότερο ποινές από 16 χαρακτήρες, 444 00:20:04,200 --> 00:20:04,880 τι κάνεις? 445 00:20:04,880 --> 00:20:07,970 Λοιπόν, μπορείτε να αυξήσετε το μέγεθος αυτού του ρυθμιστικού για 32 446 00:20:07,970 --> 00:20:09,190 ή ότι φαίνεται το είδος της μικρής. 447 00:20:09,190 --> 00:20:12,260 Γιατί δεν μπορούμε απλά να το 1000 αλλά σπρώξετε προς τα πίσω. 448 00:20:12,260 --> 00:20:17,100 Ποια είναι η απάντηση της διαισθητικά μόλις αποφυγή αυτού του προβλήματος, κάνοντας 449 00:20:17,100 --> 00:20:20,660 ρυθμιστικό μου μεγαλύτερο, όπως και 1.000 χαρακτήρες; 450 00:20:20,660 --> 00:20:23,470 Με την εφαρμογή GetString με αυτόν τον τρόπο. 451 00:20:23,470 --> 00:20:27,130 Τι είναι καλό ή κακό εδώ; 452 00:20:27,130 --> 00:20:28,033 Ναι; 453 00:20:28,033 --> 00:20:30,574 Κοινό: Αν δέσουμε πολύ του χώρου και δεν το χρησιμοποιείτε, 454 00:20:30,574 --> 00:20:33,500 τότε δεν μπορεί να ανακατανείμει αυτό το χώρο. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Απολύτως. 456 00:20:34,500 --> 00:20:38,480 Είναι σπατάλη στο βαθμό που, αν δεν το κάνετε πραγματικά χρειάζονται 900 αυτών των bytes 457 00:20:38,480 --> 00:20:41,057 και όμως ρωτάτε για 1.000 συνολικά ούτως ή άλλως, 458 00:20:41,057 --> 00:20:44,140 είστε ακριβώς καταναλώνουν περισσότερη μνήμη υπολογιστή του χρήστη από ό, τι χρειάζεστε, 459 00:20:44,140 --> 00:20:45,740 Και μετά από όλα, μερικά από τα έχετε αντιμετωπίσει ήδη 460 00:20:45,740 --> 00:20:47,620 στη ζωή, όταν είσαι τρέχουν πολλά προγράμματα 461 00:20:47,620 --> 00:20:50,470 και από όπου και αν τρώει πολλή μνήμη, αυτό μπορεί πραγματικά να επηρεάσει την απόδοση 462 00:20:50,470 --> 00:20:52,220 και την εμπειρία του χρήστη στον υπολογιστη. 463 00:20:52,220 --> 00:20:56,090 Έτσι, αυτό είναι το είδος του ένα χαλαρό λύση, στα σίγουρα, και αντιστρόφως, 464 00:20:56,090 --> 00:21:00,140 δεν είναι μόνο περιττή, τι πρόβλημα εξακολουθεί να παραμένει, ακόμη και αν κάνω ρυθμιστικού μου 465 00:21:00,140 --> 00:21:02,100 1.000; 466 00:21:02,100 --> 00:21:02,600 Ναι; 467 00:21:02,600 --> 00:21:04,475 >> Κοινό: Το string είναι μήκους 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Ακριβώς. 469 00:21:05,350 --> 00:21:08,280 Αν χορδών σας είναι μήκους 1.001, έχετε ακριβώς το ίδιο πρόβλημα, 470 00:21:08,280 --> 00:21:10,705 και από το επιχείρημά μου, θα ήθελα μόνο τότε θα κάνει 2000, 471 00:21:10,705 --> 00:21:12,830 αλλά δεν ξέρετε σε εκ των προτέρων πόσο μεγάλο πρέπει να είναι, 472 00:21:12,830 --> 00:21:16,890 και όμως, έχω να καταρτίσει το πρόγραμμά μου πριν αφήσει οι άνθρωποι χρησιμοποιούν και να κατεβάσετε 473 00:21:16,890 --> 00:21:17,390 αυτό. 474 00:21:17,390 --> 00:21:21,490 Έτσι, αυτό είναι ακριβώς το είδος του ουσία ότι η βιβλιοθήκη προσπαθεί CS50 475 00:21:21,490 --> 00:21:24,750 για να μας βοηθήσει με και θα είμαστε μόνο ματιά σε μερικά από τα πίσω από την εφαρμογή 476 00:21:24,750 --> 00:21:29,790 εδώ, αλλά αυτό είναι CS50 dot C. Αυτό είναι το αρχείο που είναι ήδη σε CS50 IDE 477 00:21:29,790 --> 00:21:31,420 όλες αυτές οι εβδομάδες που έχετε χρησιμοποιήσει. 478 00:21:31,420 --> 00:21:34,280 Είναι προ-μεταγλωττισμένα και έχετε το χρησιμοποιεί αυτόματα 479 00:21:34,280 --> 00:21:38,780 από τη φύση του έχει την παύλα L σημαία CS50 με κλαγγή, 480 00:21:38,780 --> 00:21:42,300 αλλά αν μετακινηθείτε προς τα κάτω μέσα από το σύνολο των Αυτές οι λειτουργίες, εδώ είναι GetString, 481 00:21:42,300 --> 00:21:44,636 και μόνο για να σας δώσει μια γεύση του τι συμβαίνει, 482 00:21:44,636 --> 00:21:46,760 Ας ρίξουμε μια γρήγορη ματιά σε η σχετική πολυπλοκότητα. 483 00:21:46,760 --> 00:21:48,870 Δεν είναι μια πολύ μεγάλη λειτουργία, αλλά δεν το κάναμε 484 00:21:48,870 --> 00:21:52,530 Πρέπει να σκεφτούμε όλοι σκληρά για πώς να πάει για να πάρει χορδές. 485 00:21:52,530 --> 00:21:55,660 >> Τόσο εδώ είναι ρυθμιστικό μου και εγώ προφανώς η προετοιμασία σε null. 486 00:21:55,660 --> 00:21:57,990 Αυτό, φυσικά, είναι η ίδιο πράγμα όπως char αστέρων, 487 00:21:57,990 --> 00:22:00,585 αλλά αποφάσισα για την εφαρμογή της βιβλιοθήκης CS50 488 00:22:00,585 --> 00:22:02,460 ότι αν πρόκειται να είναι απολύτως δυναμική, 489 00:22:02,460 --> 00:22:05,770 Δεν ξέρω εκ των προτέρων πόσο μεγάλη είναι η Οι χρήστες κορδόνι πρόκειται να θέλουν να πάρουν. 490 00:22:05,770 --> 00:22:08,140 Έτσι, Πάω να ξεκινήσετε με μόνο μια κενή συμβολοσειρά 491 00:22:08,140 --> 00:22:11,507 και θα πάω να δημιουργήσει τόσο πολύ μνήμη όπως έχω ανάγκη να χωρέσει το string χρήστη 492 00:22:11,507 --> 00:22:13,340 και αν δεν έχω αρκετά, Πάω να ρωτήσω 493 00:22:13,340 --> 00:22:15,010 το λειτουργικό σύστημα για περισσότερη μνήμη. 494 00:22:15,010 --> 00:22:17,510 Πάω να κινηθεί εγχόρδων τους σε ένα μεγαλύτερο κομμάτι της μνήμης 495 00:22:17,510 --> 00:22:21,847 και θα πάω να απελευθερώσει ή να απελευθερώσει το επαρκώς μεγάλο κομμάτι της μνήμης 496 00:22:21,847 --> 00:22:23,680 και είμαστε ακριβώς πρόκειται για να γίνει αυτό επαναληπτικά. 497 00:22:23,680 --> 00:22:25,570 >> Έτσι, μια γρήγορη ματιά, εδώ είναι απλά μια μεταβλητή 498 00:22:25,570 --> 00:22:28,780 με την οποία Πάω να παρακολουθείτε της ικανότητας του ρυθμιστικού μου. 499 00:22:28,780 --> 00:22:30,071 Πόσα bytes μπορώ να ταιριάζει; 500 00:22:30,071 --> 00:22:32,070 Εδώ είναι μια μεταβλητή n και που Πάω να κρατήσει 501 00:22:32,070 --> 00:22:36,200 παρακολουθείτε πόσα bytes είναι πραγματικά σε το ρυθμιστικό ή ότι ο χρήστης έχει πληκτρολογήσει. 502 00:22:36,200 --> 00:22:39,900 Αν δεν έχετε δει πριν από αυτό, μπορείτε να καθορίσετε ότι μια μεταβλητή σαν int 503 00:22:39,900 --> 00:22:46,370 είναι ανυπόγραφο, η οποία, όπως υποδηλώνει το όνομα, σημαίνει ότι είναι μη αρνητική, και γιατί θα 504 00:22:46,370 --> 00:22:50,590 Ποτέ θέλετε να ασχοληθείτε προσδιορίζοντας ότι ένας int δεν είναι απλώς ένας int, 505 00:22:50,590 --> 00:22:52,540 αλλά είναι ένα ανυπόγραφο int; 506 00:22:52,540 --> 00:22:55,064 Είναι ένας μη αρνητικός int. 507 00:22:55,064 --> 00:22:56,355 Τι σημαίνει η [δεν ακούγεται] σημαίνει; 508 00:22:56,355 --> 00:22:58,910 >> Κοινό: Είναι περιγράφει ένα ποσό της μνήμης που μπορεί να είναι [δεν ακούγεται]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Ναι. 510 00:22:59,660 --> 00:23:03,710 Έτσι, αν λέω ανυπόγραφο, αυτό είναι πραγματικά δίνοντάς σας ένα κομμάτι της επιπλέον μνήμη 511 00:23:03,710 --> 00:23:07,440 και φαίνεται ότι το είδος ανόητο, αλλά αν έχουν ένα κομμάτι της επιπλέον μνήμη, ότι 512 00:23:07,440 --> 00:23:09,940 σημαίνει ότι έχετε διπλάσιες τιμές που μπορεί να αντιπροσωπεύει, 513 00:23:09,940 --> 00:23:11,570 επειδή μπορεί να είναι ένα μηδέν ή ένα 1. 514 00:23:11,570 --> 00:23:14,660 Έτσι, από προεπιλογή, ένας int μπορεί να είναι περίπου αρνητικό 2.000.000.000 σε όλη τη διαδρομή 515 00:23:14,660 --> 00:23:16,030 μέχρι θετική 2000000000. 516 00:23:16,030 --> 00:23:18,540 Αυτές είναι μεγάλες κλίμακες, αλλά εξακολουθεί να είναι το είδος της σπατάλης 517 00:23:18,540 --> 00:23:21,280 αν το μόνο που νοιάζονται μεγέθη, τα οποία απλά διαισθητικά 518 00:23:21,280 --> 00:23:24,620 θα πρέπει να είναι μη αρνητικές ή θετική ή 0, και τότε, 519 00:23:24,620 --> 00:23:28,884 γιατί εσείς σπαταλάτε 2000000000 πιθανές τιμές για τους αρνητικούς αριθμούς 520 00:23:28,884 --> 00:23:30,300 αν δεν πρόκειται ποτέ να τα χρησιμοποιούν; 521 00:23:30,300 --> 00:23:35,350 Έτσι, λέγοντας ανυπόγραφα, τώρα μπορείτε int μου να είναι μεταξύ 0 και περίπου 4 δισεκατομμύρια. 522 00:23:35,350 --> 00:23:39,280 >> Τόσο εδώ είναι απλά ένας int C για λόγους δεν θα μπει μόλις τώρα ως 523 00:23:39,280 --> 00:23:42,280 γιατί είναι ένας int αντί του κάρβουνου, αλλά εδώ είναι 524 00:23:42,280 --> 00:23:44,630 η ουσία του τι συμβαίνει σχετικά, και κάποιοι από εσάς 525 00:23:44,630 --> 00:23:48,340 ενδέχεται να χρησιμοποιούν, για παράδειγμα, η fgetc λειτουργία ακόμη και σε τέσσερις PSET 526 00:23:48,340 --> 00:23:51,580 ή, εν συνεχεία, θα το δείτε και πάλι στο πρόβλημα που πέντε, 527 00:23:51,580 --> 00:23:55,410 fgetc είναι ωραία γιατί με το όνομα του είδος, το είδος της arcanely προτείνει, 528 00:23:55,410 --> 00:23:57,940 είναι μια λειτουργία που παίρνει ένα χαρακτήρα και έτσι, 529 00:23:57,940 --> 00:24:00,690 τι είναι θεμελιωδώς διαφορετικό σχετικά με το τι κάνουμε στο GetString 530 00:24:00,690 --> 00:24:03,110 είναι ότι δεν χρησιμοποιείτε scanf με τον ίδιο τρόπο. 531 00:24:03,110 --> 00:24:07,550 Είμαστε μόνο σέρνεται μαζί βήμα-βήμα πάνω από ό, τι ο χρήστης έχει πληκτρολογήσει, 532 00:24:07,550 --> 00:24:10,970 γιατί μπορεί να διαθέσει πάντα ένα char, και έτσι μπορούμε πάντα με ασφάλεια 533 00:24:10,970 --> 00:24:15,599 ματιά σε ένα char σε έναν χρόνο, και η μαγεία αρχίζει να συμβεί εδώ. 534 00:24:15,599 --> 00:24:17,890 Πάω να μετακινηθείτε προς τα κάτω για να η μέση αυτής της λειτουργίας 535 00:24:17,890 --> 00:24:20,360 απλά να εισαγάγει εν συντομία αυτή τη λειτουργία. 536 00:24:20,360 --> 00:24:22,670 Μεγάλο σαν να υπάρχει μια συνάρτηση malloc, υπάρχει 537 00:24:22,670 --> 00:24:27,740 μια λειτουργία realloc όπου realloc σας επιτρέπει να ανακατανέμουν ένα κομμάτι της μνήμης 538 00:24:27,740 --> 00:24:29,570 και να είναι μεγαλύτερο ή μικρότερο. 539 00:24:29,570 --> 00:24:33,060 Έτσι μακρά ιστορία σύντομη και με ένα κύμα το χέρι μου για σήμερα, 540 00:24:33,060 --> 00:24:35,620 γνωρίζουμε ότι αυτό GetString κάνει είναι ότι είναι είδος 541 00:24:35,620 --> 00:24:39,720 της αυξανόμενης μαγικά ή συρρίκνωση του ρυθμιστικού διαλύματος καθώς ο χρήστης 542 00:24:39,720 --> 00:24:41,440 τύποι στο κορδόνι του ή της. 543 00:24:41,440 --> 00:24:43,962 >> Έτσι, αν ο χρήστης πληκτρολογήσει μια μικρή κλωστή, αυτός ο κώδικας 544 00:24:43,962 --> 00:24:45,920 μόνο διαθέτει αρκετές μνήμη για να χωρέσει το string. 545 00:24:45,920 --> 00:24:48,086 Εάν ο χρήστης κρατά πληκτρολόγηση όπως το έκανα ξανά και ξανά 546 00:24:48,086 --> 00:24:50,330 και ξανά, καλά, εάν το ρυθμιστικό του αρχικά αυτό το μεγάλο 547 00:24:50,330 --> 00:24:53,310 και το πρόγραμμα αντιλαμβάνεται, να περιμένετε ένα λεπτό, είμαι από το διάστημα, 548 00:24:53,310 --> 00:24:55,410 πρόκειται να διπλασιαστεί το μέγεθος του buffer 549 00:24:55,410 --> 00:24:59,110 και στη συνέχεια το διπλάσιο του μεγέθους του buffer και ο κώδικας που κάνει το διπλασιασμό, 550 00:24:59,110 --> 00:25:03,170 αν το δούμε εδώ, είναι μόνο αυτό το έξυπνο ένα-liner. 551 00:25:03,170 --> 00:25:06,830 Μπορεί να μην έχετε δει αυτήν τη σύνταξη πριν, αλλά αν λέτε αστέρων ισούται με, 552 00:25:06,830 --> 00:25:10,470 αυτό είναι το ίδιο πράγμα με λέγοντας φορές χωρητικότητας 2. 553 00:25:10,470 --> 00:25:13,390 Γι 'αυτό κρατά μόνο διπλασιάζοντας η ικανότητα του ρυθμιστικού 554 00:25:13,390 --> 00:25:17,480 και, στη συνέχεια, λέγοντας realloc να δώσει η ίδια ότι πολύ περισσότερη μνήμη. 555 00:25:17,480 --> 00:25:19,720 >> Τώρα, ως ένα μέρος, εκεί είναι άλλες λειτουργίες εδώ 556 00:25:19,720 --> 00:25:23,680 ότι δεν θα εξετάσει λεπτομερώς εκτός από το να δείξει σε GetInt, 557 00:25:23,680 --> 00:25:26,150 χρησιμοποιούμε GetString σε GetInt. 558 00:25:26,150 --> 00:25:28,192 Θα βεβαιωθείτε ότι δεν είναι null, η οποία, ανάκληση, 559 00:25:28,192 --> 00:25:30,400 είναι η ιδιαίτερη αξία που σημαίνει κάτι πήγε στραβά. 560 00:25:30,400 --> 00:25:31,233 Είμαστε έξω από τη μνήμη. 561 00:25:31,233 --> 00:25:32,310 Καλύτερα ελέγξτε για αυτό. 562 00:25:32,310 --> 00:25:33,710 Και έχουμε επιστρέψει μια τιμή φρουρού. 563 00:25:33,710 --> 00:25:37,850 Αλλά θα αναβάλει τα σχόλια ως προς το γιατί και στη συνέχεια να χρησιμοποιήσουμε αυτό τον ξάδελφό της scanf 564 00:25:37,850 --> 00:25:42,100 ονομάζεται sscanf και αποδεικνύεται ότι scanf sscanf, ή κορδόνι, 565 00:25:42,100 --> 00:25:45,310 σας επιτρέπει να ρίξετε μια ματιά στη γραμμή της ο χρήστης έχει πληκτρολογήσει και θα σας 566 00:25:45,310 --> 00:25:49,610 αναλύσει την ουσία και τι είμαι κάνουμε εδώ είναι που λέω sscanf, 567 00:25:49,610 --> 00:25:54,440 αναλύσει ό, τι ο χρήστης έχει πληκτρολογήσει στο και βεβαιωθείτε% i, 568 00:25:54,440 --> 00:25:59,250 υπάρχει ένας ακέραιος σε αυτό, και δεν θα μπει σήμερα ακριβώς γιατί υπάρχει, επίσης, 569 00:25:59,250 --> 00:26:03,760 α% c εδώ, αλλά με λίγα λόγια επιτρέπει μας για να ανιχνεύσει αν ο χρήστης έχει δακτυλογραφήσει 570 00:26:03,760 --> 00:26:06,050 σε κάτι ψεύτικο μετά τον αριθμό. 571 00:26:06,050 --> 00:26:11,766 Έτσι, ο λόγος για τον οποίο GetInt και GetString να σας πω για να ξαναπροσπαθήσετε, ξανά, δοκιμάστε ξανά 572 00:26:11,766 --> 00:26:13,640 οφείλεται στο γεγονός ότι το σύνολο των ότι ο κώδικας που έχω γράψει, 573 00:26:13,640 --> 00:26:17,900 Είναι το είδος του κοιτάζοντας είσοδο του χρήστη στο να διασφαλίσει ότι είναι απόλυτα αριθμητικά 574 00:26:17,900 --> 00:26:21,700 ή είναι μια πραγματική Πλωτό Σημείο αξία ή τα παρόμοια, 575 00:26:21,700 --> 00:26:24,233 ανάλογα με το ποια τιμή λειτουργία που χρησιμοποιείτε. 576 00:26:24,233 --> 00:26:25,060 >> Μπά. 577 00:26:25,060 --> 00:26:25,710 ΕΝΤΆΞΕΙ. 578 00:26:25,710 --> 00:26:27,592 Αυτό ήταν μια μπουκιά αλλά το σημείο εδώ είναι 579 00:26:27,592 --> 00:26:29,550 ότι ο λόγος που είχαμε αυτές οι βοηθητικές ρόδες για 580 00:26:29,550 --> 00:26:32,880 οφείλεται στο γεγονός ότι στο χαμηλότερο επίπεδο, υπάρχει μόνο τόσα πολλά πράγματα που 581 00:26:32,880 --> 00:26:35,674 μπορεί να πάει στραβά ότι θέλαμε να χειριστεί προληπτικά 582 00:26:35,674 --> 00:26:38,090 αυτά τα πράγματα σίγουρα στο πρώτες εβδομάδες της κατηγορίας, 583 00:26:38,090 --> 00:26:42,230 αλλά τώρα με το chipset τέσσερα και πέντε και PSET πέρα θα δείτε ότι είναι πιο εις 584 00:26:42,230 --> 00:26:45,570 σας αλλά και είστε πιο ικανοί επίλυσης αυτών των ειδών προβλήματα 585 00:26:45,570 --> 00:26:47,180 τον εαυτό σας. 586 00:26:47,180 --> 00:26:51,770 Οποιεσδήποτε ερωτήσεις σχετικά με GetString ή GetInt; 587 00:26:51,770 --> 00:26:52,630 Ναι; 588 00:26:52,630 --> 00:26:55,130 >> Κοινό: Γιατί θα διπλασιαστεί η ικανότητα του ρυθμιστικού 589 00:26:55,130 --> 00:26:57,630 όχι απλώς στην αύξηση ότι κατά το ακριβές ποσό; 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Καλή ερώτηση. 591 00:26:58,100 --> 00:27:00,474 Γιατί θα διπλασιάσει την ικανότητα του ρυθμιστικού σε αντίθεση 592 00:27:00,474 --> 00:27:02,800 με απλά αυξάνοντας από κάποια σταθερή τιμή; 593 00:27:02,800 --> 00:27:03,900 Ήταν μια απόφαση σχεδιασμού. 594 00:27:03,900 --> 00:27:08,590 Εμείς απλά αποφάσισε ότι, επειδή τείνει να είναι λίγο ακριβό χρόνο σοφό να ρωτήσετε 595 00:27:08,590 --> 00:27:10,440 το λειτουργικό σύστημα για τη μνήμη, δεν το κάναμε 596 00:27:10,440 --> 00:27:13,210 θέλετε να καταλήξετε σε μια κατάσταση για μεγάλες χορδές 597 00:27:13,210 --> 00:27:14,960 ότι θα ζητούσαν το λειτουργικό σύστημα ξανά και ξανά 598 00:27:14,960 --> 00:27:17,500 και ξανά και ξανά σε γρήγορη διαδοχή για τη μνήμη. 599 00:27:17,500 --> 00:27:20,387 Γι 'αυτό ακριβώς αποφασίσαμε, κάπως αυθαίρετα, αλλά ελπίζουμε λογικά, 600 00:27:20,387 --> 00:27:22,720 ότι, ξέρετε τι, ας προσπαθήσει να πάρει μπροστά από τον εαυτό μας 601 00:27:22,720 --> 00:27:25,520 και να κρατήσει μόνο διπλασιάζοντας έτσι ώστε θα ελαχιστοποιηθεί το ποσό των φορές 602 00:27:25,520 --> 00:27:29,010 θα πρέπει να καλέσετε ή malloc realloc, αλλά μια συνολική κρίση 603 00:27:29,010 --> 00:27:31,820 καλούν απουσία γνωρίζοντας τι οι χρήστες μπορεί να θέλουν να πληκτρολογήσετε. 604 00:27:31,820 --> 00:27:33,600 Και οι δύο τρόποι θα μπορούσαν να είναι συζητήσιμο. 605 00:27:33,600 --> 00:27:35,430 Αναμφισβήτητα καλό. 606 00:27:35,430 --> 00:27:39,240 >> Έτσι, ας ρίξουμε μια ματιά σε ένα ζευγάρι από άλλες παρενέργειες της μνήμης, 607 00:27:39,240 --> 00:27:41,610 πράγματα που μπορεί να πάει στραβά και εργαλεία που μπορείτε να 608 00:27:41,610 --> 00:27:43,880 χρησιμοποιήσετε για να πιάσουν αυτά τα είδη των λαθών. 609 00:27:43,880 --> 00:27:47,800 Βγάζει όλους εσάς, ακόμη και αν check50 δεν σας έχει πει τόσο πολύ, 610 00:27:47,800 --> 00:27:50,050 έχουν εγγράφως λάθη Κωδικός δεδομένου εβδομάδα ένα, 611 00:27:50,050 --> 00:27:53,630 ακόμη και αν όλες οι δοκιμές είναι check50 πέρασαν, και ακόμα κι αν και TF σας 612 00:27:53,630 --> 00:27:56,010 είναι εξαιρετικά σίγουροι ότι κωδικό σας λειτουργεί όπως θα έπρεπε. 613 00:27:56,010 --> 00:27:59,190 Ο κωδικός σας έχει λάθη ή πλημμελής ότι όλοι σας, 614 00:27:59,190 --> 00:28:02,540 στη χρήση της βιβλιοθήκης CS50, έχουν διαρροή μνήμης. 615 00:28:02,540 --> 00:28:06,040 Έχετε ήδη ζητήσει το λειτουργικό σύστημα για τη μνήμη στα περισσότερα από τα προγράμματα 616 00:28:06,040 --> 00:28:08,850 έχετε γράψει, αλλά έχετε στην πραγματικότητα ποτέ δεν έδωσε πίσω. 617 00:28:08,850 --> 00:28:12,110 Έχετε ονομάζεται GetString και GetInt και GetFloat, 618 00:28:12,110 --> 00:28:15,270 αλλά με GetString, έχετε Ποτέ δεν ζήτησε unGetString ή δώστε 619 00:28:15,270 --> 00:28:19,890 String Επιστροφή ή τα παρόμοια, αλλά έχουμε δει ότι GetString κάνει εκχωρήσει μνήμη 620 00:28:19,890 --> 00:28:22,810 μέσω της malloc ή αυτό realloc λειτουργία, η οποία είναι μόλις 621 00:28:22,810 --> 00:28:25,670 πολύ παρόμοια στο πνεύμα, και όμως, έχουμε ήδη 622 00:28:25,670 --> 00:28:28,629 ζητώντας από το λειτουργικό σύστημα για μνήμη και μνήμη ξανά και ξανά 623 00:28:28,629 --> 00:28:29,670 αλλά ποτέ δεν δίνουν πίσω. 624 00:28:29,670 --> 00:28:33,550 >> Τώρα, ως ένα μέρος, αποδεικνύεται ότι όταν ένα πρόγραμμα τερματίζεται, όλες της μνήμης 625 00:28:33,550 --> 00:28:34,870 αυτόματα απελευθερωθεί. 626 00:28:34,870 --> 00:28:36,150 Έτσι δεν είναι μια τεράστια συμφωνία. 627 00:28:36,150 --> 00:28:38,590 Δεν πρόκειται να σπάσει το IDE ή αργά τα πράγματα κάτω, 628 00:28:38,590 --> 00:28:40,670 αλλά όταν κάνουμε προγράμματα γενικά διαρροή μνήμης 629 00:28:40,670 --> 00:28:42,170 και τρέχετε για μεγάλο χρονικό διάστημα. 630 00:28:42,170 --> 00:28:45,640 Αν έχετε δει ποτέ το ηλίθιο μικρό μπάλα παραλία σε Mac OS ή την κλεψύδρα 631 00:28:45,640 --> 00:28:51,160 για Windows όπου είναι το είδος του επιβραδύνοντας ή σκέψης ή σκέψης 632 00:28:51,160 --> 00:28:53,770 ή μόλις αρχίζει πραγματικά να επιβραδύνει σε ένα crawl, 633 00:28:53,770 --> 00:28:56,960 πολύ πιθανόν θα μπορούσε να είναι το αποτέλεσμα μιας διαρροής μνήμης. 634 00:28:56,960 --> 00:28:59,970 Οι προγραμματιστές που έγραψαν το λογισμικό που χρησιμοποιείτε 635 00:28:59,970 --> 00:29:03,570 να ζητήσει από το λειτουργικό σύστημα για τη μνήμη κάθε λίγα λεπτά, κάθε ώρα. 636 00:29:03,570 --> 00:29:05,570 Αλλά αν τρέχετε το λογισμικό, ακόμη και αν είναι 637 00:29:05,570 --> 00:29:08,680 ελαχιστοποιούνται στον υπολογιστή σας για τις ώρες ή τις ημέρες στο τέλος, 638 00:29:08,680 --> 00:29:11,980 ίσως να ζητά όλο και περισσότερο μνήμη και στην πραγματικότητα ποτέ δεν το χρησιμοποιεί 639 00:29:11,980 --> 00:29:15,180 και έτσι τον κωδικό σας μπορεί να είναι, ή προγράμματα μπορεί να έχει διαρροή μνήμης, 640 00:29:15,180 --> 00:29:18,350 και αν ξεκινήσετε να προκαλέσει απώλεια μνήμης, υπάρχει λιγότερη μνήμη για άλλα προγράμματα, 641 00:29:18,350 --> 00:29:21,220 και το αποτέλεσμα είναι να επιβραδύνει τα πάντα. 642 00:29:21,220 --> 00:29:23,600 >> Τώρα, αυτό είναι κατά πολύ ένα από Οι πιο αποτρόπαιες προγράμματα 643 00:29:23,600 --> 00:29:26,350 θα έχετε ευκαιρίες ώστε να εκτελείται σε βαθμό CS50 644 00:29:26,350 --> 00:29:31,650 όπως η παραγωγή της είναι ακόμη πιο απόκρυφα από κλαγγή ή να κάνετε ή οποιαδήποτε της εντολής 645 00:29:31,650 --> 00:29:35,930 προγράμματα γραμμή που έχουμε κάνει στο παρελθόν, αλλά Ευτυχώς, που είναι ενταγμένα στην παραγωγή της 646 00:29:35,930 --> 00:29:39,810 είναι μερικές χρήσιμες συμβουλές σούπερ ότι θα είναι χρήσιμο είτε για το chipset τέσσερις 647 00:29:39,810 --> 00:29:41,510 ή σίγουρα το chipset πέντε. 648 00:29:41,510 --> 00:29:44,250 Έτσι valgrind είναι ένα εργαλείο που μπορούν να χρησιμοποιηθούν για να δούμε 649 00:29:44,250 --> 00:29:46,930 για διαρροές μνήμης στο πρόγραμμά σας. 650 00:29:46,930 --> 00:29:48,570 Είναι σχετικά εύκολο να τρέξει. 651 00:29:48,570 --> 00:29:51,420 Μπορείτε να εκτελέσετε valgrind και, στη συνέχεια, ακόμη και αν και είναι λίγο φλύαρο, 652 00:29:51,420 --> 00:29:54,440 παύλα έλεγχο διαρροής παύλα ίσον πλήρης, και στη συνέχεια dot 653 00:29:54,440 --> 00:29:56,320 κάθετο και το όνομα του προγράμματός σας. 654 00:29:56,320 --> 00:30:00,010 Έτσι valgrind θα τρέξει, τότε το πρόγραμμα σας και στο τέλος του προγράμματός σας 655 00:30:00,010 --> 00:30:02,240 τρέχει πριν από την παραίτησή του και σας δίνει μια άλλη γραμμή, 656 00:30:02,240 --> 00:30:04,980 πρόκειται να αναλύσουμε σας πρόγραμμα, ενώ είναι ήδη σε λειτουργία 657 00:30:04,980 --> 00:30:07,740 και να σας πω δεν θα διαρρεύσει κάθε μνήμη και ακόμα καλύτερα, 658 00:30:07,740 --> 00:30:10,610 δεν αγγίζετε μνήμης που δεν ανήκει σε σας; 659 00:30:10,610 --> 00:30:13,700 Δεν μπορεί να πιάσει τα πάντα, αλλά είναι αρκετά καλή στο να πιάσει περισσότερα πράγματα. 660 00:30:13,700 --> 00:30:19,700 >> Έτσι, εδώ είναι ένα παράδειγμα που έχει τρέξιμό μου αυτό το πρόγραμμα, τα οποία έχουν διανύσει valgrind, 661 00:30:19,700 --> 00:30:21,470 σε ένα πρόγραμμα που ονομάζεται μνήμη, και θα πάω 662 00:30:21,470 --> 00:30:24,730 να τονίσει τις γραμμές που είναι τελικά που μας ενδιαφέρει. 663 00:30:24,730 --> 00:30:27,690 Έτσι, υπάρχει ακόμη πιο περισπασμούς ότι έχω διαγραφεί από το κλείστρο. 664 00:30:27,690 --> 00:30:30,930 Αλλά ας δούμε τι είναι αυτό πρόγραμμα είναι σε θέση να μας πει. 665 00:30:30,930 --> 00:30:34,800 Είναι σε θέση να μας πουν τα πράγματα όπως άκυρο εγγραφής μεγέθους 4. 666 00:30:34,800 --> 00:30:38,020 Με άλλα λόγια, αν αγγίξετε τη μνήμη, Ειδικότερα 4 bytes της μνήμης 667 00:30:38,020 --> 00:30:40,350 ότι δεν πρέπει να έχετε, valgrind να σας πω ότι. 668 00:30:40,350 --> 00:30:41,660 Άκυρη εγγραφής μεγέθους 4. 669 00:30:41,660 --> 00:30:43,640 Μπορείτε άγγιξε τέσσερα bytes ότι δεν πρέπει να έχετε. 670 00:30:43,640 --> 00:30:44,840 Πού το έκανες αυτό; 671 00:30:44,840 --> 00:30:45,900 Αυτή είναι η ομορφιά. 672 00:30:45,900 --> 00:30:50,000 Dot μνήμης γ γραμμή 21 είναι όπου μπορείτε να σκάτωσε και γι 'αυτό είναι χρήσιμο. 673 00:30:50,000 --> 00:30:53,410 Μοιάζει πολύ με GDB, μπορεί να βοηθήσει το σημείο σας στο πραγματικό σφάλμα. 674 00:30:53,410 --> 00:30:57,170 >> Τώρα, αυτό είναι λίγο πιο φλύαρη, αν όχι σύγχυση. 675 00:30:57,170 --> 00:31:01,307 40 bytes σε 1 μπλοκ είναι σίγουρα έχασε στο αρχείο απώλειας 1 από 1. 676 00:31:01,307 --> 00:31:02,140 Τι σημαίνει αυτό? 677 00:31:02,140 --> 00:31:05,920 Λοιπόν, αυτό σημαίνει απλώς ζητήσατε 40 bytes και ποτέ δεν το έδωσε πίσω. 678 00:31:05,920 --> 00:31:08,930 Θα ονομάζεται malloc ή καλέσατε GetString και το λειτουργικό σύστημα 679 00:31:08,930 --> 00:31:12,450 σας 40 bytes, αλλά ποτέ δεν έδωσε ελευθερωθούν ή να κυκλοφορήσει ότι η μνήμη, 680 00:31:12,450 --> 00:31:15,400 και για να είμαστε δίκαιοι, ποτέ δεν έχουμε δείξει πώς να δώσει πίσω τη μνήμη. 681 00:31:15,400 --> 00:31:17,910 Βγάζει υπάρχει ένα σούπερ απλή λειτουργία που ονομάζεται δωρεάν. 682 00:31:17,910 --> 00:31:21,170 Παίρνει ένα επιχείρημα, το πράγμα Θέλετε να απελευθερώσει ή να δώσει πίσω, 683 00:31:21,170 --> 00:31:23,430 αλλά 40 bytes, προφανώς, σε αυτό το πρόγραμμα 684 00:31:23,430 --> 00:31:27,300 έχουν χαθεί στη γραμμή 20 της μνήμης dot γ. 685 00:31:27,300 --> 00:31:28,650 >> Ας δούμε λοιπόν αυτό το πρόγραμμα. 686 00:31:28,650 --> 00:31:31,020 Είναι σούπερ άχρηστο. 687 00:31:31,020 --> 00:31:33,980 Δείχνει μόνο αυτό το συγκεκριμένο σφάλμα. 688 00:31:33,980 --> 00:31:34,920 Έτσι, ας ρίξουμε μια ματιά. 689 00:31:34,920 --> 00:31:39,920 Εδώ είναι η κύρια και κύρια, ανακοίνωση, κλήσεις μια λειτουργία που ονομάζεται f και στη συνέχεια επιστρέφει. 690 00:31:39,920 --> 00:31:41,550 Έτσι, δεν είναι όλα αυτά ενδιαφέροντα. 691 00:31:41,550 --> 00:31:42,664 Τι σημαίνει στ κάνω; 692 00:31:42,664 --> 00:31:44,330 Παρατηρήστε ότι δεν έκαναν τον κόπο με ένα πρωτότυπο. 693 00:31:44,330 --> 00:31:46,520 Ήθελα να κρατήσει τον κωδικό όσο το δυνατό λιγότερο. 694 00:31:46,520 --> 00:31:49,530 Έτσι έβαλα στ πάνω από την κύρια και ότι είναι εντάξει, σίγουρα, 695 00:31:49,530 --> 00:31:51,500 για συντομία προγράμματα όπως αυτό. 696 00:31:51,500 --> 00:31:56,910 Έτσι f δεν επιστρέφει τίποτα και κάνει δεν λαμβάνουν τίποτα, αλλά το κάνει αυτό. 697 00:31:56,910 --> 00:31:59,620 Δηλώνει, σαν στο παράδειγμα Binky, 698 00:31:59,620 --> 00:32:02,682 Ένας δείκτης που ονομάζεται x ότι πρόκειται για να αποθηκεύσετε τη διεύθυνση ενός int. 699 00:32:02,682 --> 00:32:03,890 Έτσι, αυτή είναι η αριστερή πλευρά. 700 00:32:03,890 --> 00:32:07,230 Στην αγγλική γλώσσα, ποια είναι η δεξιά πλευρά κάνει; 701 00:32:07,230 --> 00:32:09,770 Όποιος; 702 00:32:09,770 --> 00:32:13,665 Τι είναι αυτό που κάνει για μας; 703 00:32:13,665 --> 00:32:14,651 Ναι; 704 00:32:14,651 --> 00:32:16,623 >> Κοινό: [δεν ακούγεται] φορές το μέγεθος ενός int 705 00:32:16,623 --> 00:32:19,175 η οποία είναι 10 φορές ότι [δεν ακούγεται] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Καλό και επιτρέψτε μου να συνοψίσω. 707 00:32:20,800 --> 00:32:25,480 Έτσι διαθέσουν αρκετό χώρο για 10 ακέραιοι ή 10, ποιο είναι το μέγεθος ενός int, 708 00:32:25,480 --> 00:32:29,340 είναι τέσσερα bytes, έτσι 10 φορές 4 40, έτσι ώστε στη δεξιά πλευρά που έχω 709 00:32:29,340 --> 00:32:33,930 τονισμένο είναι να μου δώσει 40 bytes και αποθηκεύσετε τη διεύθυνση του πρώτου byte 710 00:32:33,930 --> 00:32:34,940 μέσα στο x. 711 00:32:34,940 --> 00:32:38,380 Και τώρα, τέλος, και εδώ είναι όπου Το πρόγραμμα αυτό είναι προβληματικό, τι είναι 712 00:32:38,380 --> 00:32:41,540 λάθος με τη γραμμή 21 με βάση αυτή τη λογική; 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Ποιο είναι το πρόβλημα με τη γραμμή 21; 715 00:32:46,280 --> 00:32:46,780 Ναι; 716 00:32:46,780 --> 00:32:49,550 Κοινό: Δεν μπορείτε δείκτη μέσα στο x [δεν ακούγεται]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Ναι. 718 00:32:50,300 --> 00:32:52,270 Δεν θα πρέπει δείκτη μέσα στο x έτσι. 719 00:32:52,270 --> 00:32:53,850 Έτσι συντακτικά, αυτό είναι εντάξει. 720 00:32:53,850 --> 00:32:56,990 Τι ωραίο είναι, σαν σας μπορεί να θεραπεύσει το όνομα ενός πίνακα 721 00:32:56,990 --> 00:33:01,080 σαν να είναι ένας δείκτης, ομοίως μπορεί να σας κεράσω ένα δείκτη, όπως κι αν είναι 722 00:33:01,080 --> 00:33:06,425 μια σειρά, και έτσι μπορώ συντακτικά έστωχ βραχίονα κάτι, χ βραχίονα I, 723 00:33:06,425 --> 00:33:07,800 αλλά το 10 είναι προβληματική. 724 00:33:07,800 --> 00:33:09,096 Γιατί; 725 00:33:09,096 --> 00:33:10,910 >> Κοινό: Επειδή δεν είναι μέσα. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Δεν είναι μέσα σε αυτό το κομμάτι της μνήμης. 727 00:33:12,390 --> 00:33:15,306 Ποια είναι η μεγαλύτερη τιμή που θα πρέπει να πρέπει να θέτει σε αυτές τις αγκύλες; 728 00:33:15,306 --> 00:33:16,870 9, 0 έως 9. 729 00:33:16,870 --> 00:33:18,160 Λόγω της μηδενικής ευρετηρίασης. 730 00:33:18,160 --> 00:33:20,190 Έτσι, 0 έως 9 θα ήταν μια χαρά. 731 00:33:20,190 --> 00:33:23,960 Στήριγμα 10 δεν είναι καλή και αλλά, αν θυμηθούμε, κάθε φορά 732 00:33:23,960 --> 00:33:27,017 Μου φαίνεται να προσπαθήσει να κάνει CS50 IDE συντριβή πληκτρολογώντας σε ψεύτικες αξίες, 733 00:33:27,017 --> 00:33:29,100 δεν είναι πάντα συνεργάζονται, και μάλιστα, συχνά 734 00:33:29,100 --> 00:33:31,460 πάρετε τυχεροί ακριβώς επειδή το το λειτουργικό σύστημα δεν 735 00:33:31,460 --> 00:33:35,467 παρατηρήσετε ότι ποτέ τόσο ελαφρά περάσει κάποιο κομμάτι της μνήμης, 736 00:33:35,467 --> 00:33:38,300 γιατί έμεινε εντός τεχνικά το τμήμα σας, αλλά περισσότερα για αυτό 737 00:33:38,300 --> 00:33:40,940 Σε ένα μάθημα λειτουργικών συστημάτων, και έτσι κάτι σαν αυτό 738 00:33:40,940 --> 00:33:43,000 θα μπορούσε πολύ εύκολα να περάσουν απαρατήρητα. 739 00:33:43,000 --> 00:33:48,120 Το πρόγραμμά σας ποτέ δεν πρόκειται να διακοπεί η λειτουργία του σταθερά αλλά ίσως φορά σε λίγο. 740 00:33:48,120 --> 00:33:50,610 >> Και γι 'αυτό ας προσπαθήσουμε valgrind για το θέμα αυτό, και εδώ είναι 741 00:33:50,610 --> 00:33:52,870 όπου θα πάρουμε συγκλονισμένοι από την έξοδο στιγμιαία. 742 00:33:52,870 --> 00:34:00,810 Έτσι κάνουν μνήμη ελέγχου διαρροών valgrind ίσον πλήρης μνήμη dot κάθετος. 743 00:34:00,810 --> 00:34:03,040 Και είναι εδώ γιατί υπόσχομαι αυτό θα συντρίψει. 744 00:34:03,040 --> 00:34:05,700 Εδώ είναι τι valgrind, εδώ είναι ό, τι προγραμματιστής, μερικά χρόνια ago- 745 00:34:05,700 --> 00:34:08,469 αποφάσισε ότι θα ήταν μια καλή ιδέα Για την έξοδο για να μοιάσει. 746 00:34:08,469 --> 00:34:09,750 Ας βγάλουμε νόημα από αυτό. 747 00:34:09,750 --> 00:34:13,120 Έτσι, σε όλη τη διαδρομή στο αριστερό χέρι πλευρά για κανέναν καλό λόγο 748 00:34:13,120 --> 00:34:16,620 είναι το ID της διεργασίας του προγράμματος εμείς απλά τρέχει, το μοναδικό αναγνωριστικό 749 00:34:16,620 --> 00:34:18,030 για το πρόγραμμα που μόλις έτρεξε. 750 00:34:18,030 --> 00:34:19,738 Θα διαγραφεί από ότι η διαφάνεια, αλλά υπάρχει 751 00:34:19,738 --> 00:34:22,190 είναι μερικές χρήσιμες πληροφορίες εδώ. 752 00:34:22,190 --> 00:34:24,684 >> Ας μετακινηθείτε προς τα επάνω στην κορυφή. 753 00:34:24,684 --> 00:34:25,600 Εδώ είναι όπου ξεκινήσαμε. 754 00:34:25,600 --> 00:34:27,040 Έτσι, δεν είναι όλα τόσο πολύ εξόδου. 755 00:34:27,040 --> 00:34:30,429 Εδώ είναι άκυρη ότι γράφουν του μεγέθους 4 στη γραμμή 21. 756 00:34:30,429 --> 00:34:31,760 Λοιπόν, τι ήταν γραμμής 21; 757 00:34:31,760 --> 00:34:34,500 Γραμμή 21 ήταν ακριβώς αυτό και είναι λογικό 758 00:34:34,500 --> 00:34:37,290 ότι είμαι σε έγκυρα γραπτώς 4 bytes επειδή είμαι 759 00:34:37,290 --> 00:34:40,389 προσπαθεί να βάλει αυτό το ακέραιο, η οποία θα μπορούσε να είναι οτιδήποτε, 760 00:34:40,389 --> 00:34:42,370 αυτό συμβαίνει ακριβώς να είναι το μηδέν, αλλά εγώ προσπαθώ 761 00:34:42,370 --> 00:34:44,940 για να το θέσω σε μια θέση ότι δεν ανήκει σε μένα. 762 00:34:44,940 --> 00:34:50,900 Επιπλέον, εδώ κάτω, 40 bytes σε ένα μπλοκ χάσει οριστικά στο αρχείο 1. 763 00:34:50,900 --> 00:34:56,500 Αυτό συμβαίνει γιατί όταν καλώ malloc εδώ, εγώ ποτέ δεν είναι δωρεάν πραγματικά τη μνήμη. 764 00:34:56,500 --> 00:34:58,140 >> Λοιπόν, πώς μπορούμε να το διορθώσω αυτό; 765 00:34:58,140 --> 00:35:02,970 Επιτρέψτε μου να προχωρήσει και να είναι λίγο πιο ασφαλείς και να κάνει 9 εκεί και επιτρέψτε μου εδώ δωρεάν x. 766 00:35:02,970 --> 00:35:04,820 Αυτή είναι η νέα λειτουργία για σήμερα. 767 00:35:04,820 --> 00:35:11,520 Αν μου τώρα να επαναληφθεί τελεία μνήμη κάθετος, ας τρέξει valgrind σε αυτό και πάλι, 768 00:35:11,520 --> 00:35:14,990 μεγιστοποιηθεί το παράθυρό μου και πατήστε Enter. 769 00:35:14,990 --> 00:35:16,900 Τώρα, αυτό είναι καλό. 770 00:35:16,900 --> 00:35:19,590 Θάβουν τα καλά νέα σε όλη αυτήν την έξοδο. 771 00:35:19,590 --> 00:35:20,810 Όλα τα μπλοκ σωρού ήταν δωρεάν. 772 00:35:20,810 --> 00:35:23,604 Θα επανέλθω σε αυτό το σωρό είναι, αλλά δεν υπάρχουν διαρροές είναι δυνατές. 773 00:35:23,604 --> 00:35:25,520 Έτσι, αυτό είναι ακριβώς μια άλλη εργαλείο για την εργαλειοθήκη σας 774 00:35:25,520 --> 00:35:30,220 με το οποίο μπορείτε να αρχίσετε να βρείτε τώρα τα λάθη όπως αυτό. 775 00:35:30,220 --> 00:35:34,532 >> Αλλά ας δούμε τι περισσότερο μπορεί να πάει στραβά εδώ. 776 00:35:34,532 --> 00:35:38,890 Ας μετάβασης τώρα πραγματικά την επίλυση ενός προβλήματος. 777 00:35:38,890 --> 00:35:42,440 Παρεμπιπτόντως, αν αυτό θα ανακουφίσει την λίγο σύγχυση ή ένταση, 778 00:35:42,440 --> 00:35:43,430 Αυτό είναι πλέον αστείο. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Ναι. 781 00:35:46,900 --> 00:35:49,040 Αυτό είναι πολύ καλό. 782 00:35:49,040 --> 00:35:50,890 Επειδή δείκτες είναι διευθύνσεις και διευθύνσεις 783 00:35:50,890 --> 00:35:53,098 είναι γενικά κατά συνθήκη γραμμένο με δεκαεξαδικό. 784 00:35:53,098 --> 00:35:54,650 Χα, χα, αυτό είναι αστείο πλέον. 785 00:35:54,650 --> 00:35:58,390 Εν πάση περιπτώσει, ας τώρα πραγματικά να λύσει ένα πρόβλημα. 786 00:35:58,390 --> 00:36:00,840 Αυτό ήταν σούπερ, σούπερ χαμηλό επίπεδο μέχρι σήμερα, 787 00:36:00,840 --> 00:36:03,950 και μπορούμε πραγματικά να κάνουμε χρήσιμα τα πράγματα με αυτές τις χαμηλού επιπέδου λεπτομέρειες. 788 00:36:03,950 --> 00:36:06,710 >> Γι 'αυτό και εισήγαγε μερικές εβδομάδες Πριν από την ιδέα ενός πίνακα. 789 00:36:06,710 --> 00:36:09,177 Μια σειρά ήταν ωραία γιατί είναι δύσκολο να καθαρίσει τον κωδικό μας 790 00:36:09,177 --> 00:36:11,760 γιατί αν ήθελε να γράψει ένα πρόγραμμα με πολλαπλά τους μαθητές 791 00:36:11,760 --> 00:36:15,270 ή πολλαπλά ονόματα και τα σπίτια και κοιτώνες και κολέγια και όλα αυτά, 792 00:36:15,270 --> 00:36:19,430 θα μπορούσαμε να αποθηκεύουν τα πάντα πιο καθαρά μέσα από μία συστοιχία. 793 00:36:19,430 --> 00:36:23,039 Αλλά προτείνω ένα μειονέκτημα μιας συστοιχίας μέχρι στιγμής. 794 00:36:23,039 --> 00:36:26,080 Ακόμα κι αν δεν έχετε υπέστη τον εαυτό σας σε ένα πρόγραμμα, απλά ενστικτωδώς, 795 00:36:26,080 --> 00:36:30,870 τι είναι κακό πράγμα σχετικά με μια σειρά, ίσως; 796 00:36:30,870 --> 00:36:32,337 Ακούω κάποιους μουρμουρίζει. 797 00:36:32,337 --> 00:36:34,170 Κοινό: Είναι δύσκολο να αλλάξετε το μέγεθος. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Είναι δύσκολο να αλλάξετε το μέγεθος. 799 00:36:36,128 --> 00:36:38,660 Δεν μπορείτε να αλλάξετε το μέγεθος μίας συστοιχίας, στην πραγματικότητα, per se 800 00:36:38,660 --> 00:36:43,040 σε C. Μπορείτε να διαθέσει άλλη σειρά, μετακινήσετε τα πάντα από την παλιά 801 00:36:43,040 --> 00:36:45,380 στο νέο, και τώρα έχουν κάποια επιπλέον χώρο, 802 00:36:45,380 --> 00:36:47,469 αλλά δεν είναι σαν ένα γλώσσα όπως η Java ή Python 803 00:36:47,469 --> 00:36:49,760 ή οποιοδήποτε αριθμό άλλων γλώσσες με τις οποίες ορισμένα από σας 804 00:36:49,760 --> 00:36:52,070 μπορεί να είναι εξοικειωμένοι όπου μπορείτε μπορεί απλά να συνεχίσουμε να προσθέτουμε πράγματα 805 00:36:52,070 --> 00:36:53,930 κατά κόρον στο τέλος του πίνακα. 806 00:36:53,930 --> 00:36:57,880 Όταν έχετε μια σειρά από μέγεθος 6, η οποία είναι το μέγεθός του, 807 00:36:57,880 --> 00:37:01,970 και τόσο πολύ όπως και η ιδέα νωρίτερα που έχει ένα ρυθμιστικό διάλυμα από ένα ορισμένο μέγεθος, 808 00:37:01,970 --> 00:37:05,940 θα πρέπει να μαντέψει την πύλη τι μέγεθος θέλετε να είναι; 809 00:37:05,940 --> 00:37:07,880 Αν μαντέψετε πάρα πολύ μεγάλο, σπαταλάτε χώρο. 810 00:37:07,880 --> 00:37:10,950 Αν μαντέψετε πολύ μικρό, μπορείτε δεν μπορεί να αποθηκεύσει τα δεδομένα, τουλάχιστον 811 00:37:10,950 --> 00:37:12,940 χωρίς πολλή περισσότερη δουλειά. 812 00:37:12,940 --> 00:37:18,180 >> Έτσι, σήμερα, χάρη σε δείκτες, μπορούμε ξεκινήσετε το ράψιμο μαζί το δικό μας έθιμο 813 00:37:18,180 --> 00:37:20,989 δομές δεδομένων, και Πράγματι, εδώ είναι κάτι 814 00:37:20,989 --> 00:37:23,030 ότι φαίνεται λίγο περισσότερο αινιγματικά με την πρώτη ματιά, 815 00:37:23,030 --> 00:37:26,440 αλλά αυτό είναι αυτό που θα ονομάσουμε ένα συνδεδεμένο λίστα και το όνομα του είδους του συνοψίζει 816 00:37:26,440 --> 00:37:26,940 αυτό. 817 00:37:26,940 --> 00:37:29,550 Είναι μια λίστα με τους αριθμούς, ή σε Στην περίπτωση αυτή, μια λίστα των αριθμών, 818 00:37:29,550 --> 00:37:33,480 αλλά θα μπορούσε να είναι μια λίστα με τίποτα, αλλά αυτό είναι συνδέονται μεταξύ τους με τον τρόπο των βελών, 819 00:37:33,480 --> 00:37:36,380 και απλά ρίξτε μια εικασία με ποια τεχνική 820 00:37:36,380 --> 00:37:38,310 θα πάμε να είναι σε θέση να ενωθούν, 821 00:37:38,310 --> 00:37:42,540 είδος σαν ποπ-κορν με ένα νήμα, ένα συνδεδεμένες λίστες ορθογώνια εδώ; 822 00:37:42,540 --> 00:37:43,936 Αριθμούς του; 823 00:37:43,936 --> 00:37:45,560 Ποιο είναι το χαρακτηριστικό υποκείμενη γλώσσα; 824 00:37:45,560 --> 00:37:46,350 >> Κοινό: Ένας δείκτης. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Ένας δείκτης. 826 00:37:47,308 --> 00:37:51,700 Έτσι, κάθε ένα από αυτά τα βέλη εδώ αντιπροσωπεύει ένα δείκτη ή απλώς μια διεύθυνση. 827 00:37:51,700 --> 00:37:54,590 Έτσι με άλλα λόγια, αν θέλω για να αποθηκεύσετε μια λίστα με αριθμούς, 828 00:37:54,590 --> 00:37:59,040 Δεν μπορώ να το αποθηκεύσετε αν θέλω η ικανότητα να αναπτύσσονται και να συρρικνωθεί 829 00:37:59,040 --> 00:38:00,990 δομή δεδομένων μου σε μια σειρά. 830 00:38:00,990 --> 00:38:03,000 Γι 'αυτό και πρέπει να έχουν μια μικρή περισσότερα επιτήδευση, 831 00:38:03,000 --> 00:38:05,720 αλλά παρατηρήσετε ότι αυτό εικόνα δείχνει το είδος του 832 00:38:05,720 --> 00:38:08,650 ότι αν έχετε μόνο λίγο τα θέματα που συνδέει τα πάντα μαζί, 833 00:38:08,650 --> 00:38:13,100 κατά πάσα πιθανότητα δεν είναι ότι σκληρά για να κάνουν χώρο ανάμεσα σε δύο από αυτά τα ορθογώνια 834 00:38:13,100 --> 00:38:16,750 ή δύο από τους κόμβους αυτούς, όπως θα αρχίσουμε αποκαλώντας τους, βάλτε σε ένα νέο κόμβο, 835 00:38:16,750 --> 00:38:19,547 και στη συνέχεια με κάποιο νέο νήμα, απλά χαντάκι τις τρεις κόμβους μαζί, 836 00:38:19,547 --> 00:38:22,880 η πρώτη, η τελευταία, και το ένα ότι το μόνο που παρεμβάλλεται στη μέση. 837 00:38:22,880 --> 00:38:26,000 >> Και πράγματι μια συνδεδεμένη λίστα, σε αντίθεση με μια σειρά, είναι δυναμική. 838 00:38:26,000 --> 00:38:27,840 Μπορεί να αναπτυχθούν και να συρρικνώνονται και δεν το κάνετε 839 00:38:27,840 --> 00:38:32,434 πρέπει να γνωρίζουν ή να φροντίσει εκ των προτέρων πώς όγκο των δεδομένων που πρόκειται να αποθήκευση, 840 00:38:32,434 --> 00:38:35,600 αλλά αποδεικνύεται ότι πρέπει να είμαστε λίγο προσεκτικοί για το πώς να εφαρμόσουν αυτό. 841 00:38:35,600 --> 00:38:39,070 Έτσι, πρώτα ας εξετάσουμε πώς μπορούμε να εφαρμόσουν ένα από αυτά τα μικρά ορθογώνια. 842 00:38:39,070 --> 00:38:40,690 Είναι εύκολο να εφαρμόσει ένα int. 843 00:38:40,690 --> 00:38:44,000 Μπορείτε απλώς να πω int n και, στη συνέχεια, μπορείτε να πάρετε 4 byte για έναν int, 844 00:38:44,000 --> 00:38:49,089 αλλά πώς μπορώ να πάρω έναν int, το αποκαλούν n, και στη συνέχεια ένας δείκτης, ας το ονομάσουμε επόμενο. 845 00:38:49,089 --> 00:38:50,880 Θα μπορούσαμε να ονομάσουμε αυτά πράγματα οτιδήποτε θέλουμε 846 00:38:50,880 --> 00:38:53,590 αλλά χρειάζομαι μια δομή προσαρμοσμένη δεδομένων. 847 00:38:53,590 --> 00:38:54,257 Ναι; 848 00:38:54,257 --> 00:38:57,020 >> Κοινό: Ampersand [δεν ακούγεται]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Έτσι εμπορικό και θα χρησιμοποιήσουμε για να λάβετε τη διεύθυνση ενός κόμβου δυνητικά. 850 00:39:00,940 --> 00:39:02,740 Αλλά χρειαζόμαστε άλλο χαρακτηριστικό της C για 851 00:39:02,740 --> 00:39:06,700 να μου δώσει τη δυνατότητα να δημιουργήσουν Το έθιμο αυτό ορθογώνιο, το έθιμο αυτό 852 00:39:06,700 --> 00:39:08,919 μεταβλητή αν θέλετε, στη μνήμη. 853 00:39:08,919 --> 00:39:09,710 Κοινό: Μια struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: Α struct. 855 00:39:10,626 --> 00:39:14,310 Ανάκληση από την περασμένη εβδομάδα, εισαγάγαμε struct, αυτή η σχετικά απλή λέξη-κλειδί 856 00:39:14,310 --> 00:39:16,254 ότι μας επιτρέπει να κάνουμε τα πράγματα όπως αυτό. 857 00:39:16,254 --> 00:39:18,420 C δεν ήρθε με τα δεδομένα δομή που ονομάζεται μαθητή. 858 00:39:18,420 --> 00:39:22,190 Έρχεται με int και float και άνθρακας και όπως, αλλά δεν έρχεται με τον φοιτητή, 859 00:39:22,190 --> 00:39:26,750 αλλά μπορούμε να δημιουργήσουμε έναν τύπο δεδομένων των μαθητών, μια δομή φοιτητής, με αυτή τη σύνταξη 860 00:39:26,750 --> 00:39:27,250 εδώ. 861 00:39:27,250 --> 00:39:28,350 Και θα το δείτε ξανά και ξανά. 862 00:39:28,350 --> 00:39:30,426 Γι 'αυτό μην ανησυχείτε για απομνημόνευση τις λέξεις-κλειδιά, 863 00:39:30,426 --> 00:39:33,300 αλλά η λέξη-κλειδί που είναι σημαντικό είναι μόνο το γεγονός ότι είπαμε struct 864 00:39:33,300 --> 00:39:37,590 και στη συνέχεια κάλεσε μαθητή και μέσα του μαθητή ήταν ένα όνομα και ένα σπίτι 865 00:39:37,590 --> 00:39:39,390 ή ένα dorm ή τα παρόμοια. 866 00:39:39,390 --> 00:39:41,980 >> Και έτσι τώρα σήμερα, ας προτείνει κάτι τέτοιο. 867 00:39:41,980 --> 00:39:45,240 Έχω προσθέσει μερικές λέξεις, αλλά αν θέλω για την εφαρμογή αυτού του ορθογωνίου που είναι 868 00:39:45,240 --> 00:39:48,440 και οι δύο πήραν έναν int και ένα δείκτη, ξέρετε τι, είμαι 869 00:39:48,440 --> 00:39:51,540 θα κηρύξει ένα struct που ονομάζεται κόμβος. 870 00:39:51,540 --> 00:39:55,630 Είμαι, επίσης, μέσα από αυτό, πρόκειται να πω ότι ένας κόμβος, αυτό ορθογώνιο, έχει μια int 871 00:39:55,630 --> 00:39:59,730 και εμείς θα το ονομάσουμε n και έχει ένα επόμενο δείκτη. 872 00:39:59,730 --> 00:40:02,540 Και αυτό είναι λίγο φλύαρο, αλλά αν το σκεφτείτε, 873 00:40:02,540 --> 00:40:07,300 τα βέλη που ήταν στην εικόνα πριν από λίγο είναι τι είδους δεδομένα; 874 00:40:07,300 --> 00:40:12,330 Όπου κάθε μία από αυτές βέλη είναι στραμμένο σε τι είδους δομή δεδομένων; 875 00:40:12,330 --> 00:40:14,332 Δεν είναι μόνο που δείχνουν προς έναν int per se. 876 00:40:14,332 --> 00:40:16,165 Είναι δείχνουν προς το ολόκληρο το ορθογώνιο πράγμα 877 00:40:16,165 --> 00:40:18,720 και ότι ορθογώνια πράγμα, είπαμε, ονομάζεται κόμβος. 878 00:40:18,720 --> 00:40:21,720 Και γι 'αυτό το είδος πρέπει να αναδρομικά αυτής ορίζονται όπως 879 00:40:21,720 --> 00:40:26,270 ότι ένα κόμβο, θα πούμε, θα περιέχει μια int που ονομάζεται n 880 00:40:26,270 --> 00:40:31,070 και ένα δείκτη που ονομάζεται επόμενη και η τύπος δομής δεδομένων στην οποία 881 00:40:31,070 --> 00:40:35,770 ότι τα σημεία δείκτης είναι προφανώς πρόκειται να είναι struct node. 882 00:40:35,770 --> 00:40:41,550 >> Έτσι, αυτό είναι ενοχλητικά φλύαρη και ακριβώς για να είναι σχολαστικός, 883 00:40:41,550 --> 00:40:44,100 ο λόγος για τον οποίο δεν μπορούμε να απλά λέω αυτό, το οποίο ειλικρινά 884 00:40:44,100 --> 00:40:46,860 φαίνεται πολύ πιο ευανάγνωστη, είναι γιατί ανάκληση ότι η C διαβάσετε 885 00:40:46,860 --> 00:40:48,710 πράγματα πάνω προς τα κάτω, αριστερά προς τα δεξιά. 886 00:40:48,710 --> 00:40:54,120 Δεν είναι μέχρι να πάρει το ερωτηματικό ότι υπάρχει πραγματικά η λέξη-κλειδί του κόμβου. 887 00:40:54,120 --> 00:40:57,980 Έτσι, αν θέλουμε να έχουμε αυτό το είδος του κυκλική αναφορά εσωτερικό των δεδομένων 888 00:40:57,980 --> 00:41:02,120 δομή, πρέπει να το κάνουμε αυτό, όταν λέμε struct node στην κορυφή, η οποία 889 00:41:02,120 --> 00:41:06,770 μας δίνει ένα μεγαλύτερο τρόπος περιγραφής αυτό πράγμα που, στη συνέχεια, μέσα λέμε struct node, 890 00:41:06,770 --> 00:41:09,560 και στη συνέχεια στο πολύ τελευταία γραμμή ας πούμε, εντάξει, C, από τον τρόπο, 891 00:41:09,560 --> 00:41:12,060 απλά καλέστε ολόκληρο αυτό το καταραμένο πράγμα που ένας κόμβος και να σταματήσει 892 00:41:12,060 --> 00:41:14,360 χρησιμοποιώντας εντελώς τη λέξη-κλειδί struct. 893 00:41:14,360 --> 00:41:18,030 Έτσι, αυτό είναι ακριβώς το είδος της μια συντακτική τέχνασμα που τελικά μας επιτρέπει να δημιουργήσουμε 894 00:41:18,030 --> 00:41:21,370 κάτι που μοιάζει ακριβώς με αυτό. 895 00:41:21,370 --> 00:41:25,010 >> Έτσι, αν υποθέσουμε τώρα μπορούμε εφαρμόσει αυτό το πράγμα C, 896 00:41:25,010 --> 00:41:28,040 πώς μπορούμε πραγματικά ξεκινήστε διέρχονται αυτό; 897 00:41:28,040 --> 00:41:32,360 Λοιπόν, στην πραγματικότητα, το μόνο που έχουμε να κάνουμε είναι να επαναλάβει από αριστερά προς τα δεξιά και μόλις 898 00:41:32,360 --> 00:41:35,960 το είδος των κόμβων εισάγετε ή να διαγράψετε κόμβους ή αναζητήστε τα πράγματα όπου θέλουμε, 899 00:41:35,960 --> 00:41:39,560 αλλά για να γίνει αυτό, ας πάει μπροστά και να κάνουν τα πράγματα λίγο πιο πραγματικό, γιατί αυτό 900 00:41:39,560 --> 00:41:42,560 υπήρξε εξαιρετικά χαμηλό επίπεδο μέχρι σήμερα. 901 00:41:42,560 --> 00:41:45,700 Θα μπορούσε κάποιος ήθελε κυριολεκτικά να είναι η πρώτη; 902 00:41:45,700 --> 00:41:46,200 ΕΝΤΆΞΕΙ. 903 00:41:46,200 --> 00:41:47,092 Έλα επάνω. 904 00:41:47,092 --> 00:41:47,800 Ποιο είναι το όνομά σου? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: David. 907 00:41:49,290 --> 00:41:49,998 Χάρηκα για τη γνωριμία. 908 00:41:49,998 --> 00:41:50,960 Κι εγώ. 909 00:41:50,960 --> 00:41:52,450 Εντάξει. 910 00:41:52,450 --> 00:41:53,990 Και χρειαζόμαστε έναν αριθμό 9. 911 00:41:53,990 --> 00:41:55,240 Δεν είναι τόσο καλό όσο το πρώτο, ίσως. 912 00:41:55,240 --> 00:41:56,430 Εντάξει, τον αριθμό 9. 913 00:41:56,430 --> 00:41:59,667 Ένας αριθμός 17, παρακαλώ. 914 00:41:59,667 --> 00:42:01,000 Επιτρέψτε μου να επιστρέψω λίγο μακρύτερα. 915 00:42:01,000 --> 00:42:03,980 Αριθμός 22, παρακαλώ, και σχετικά με το πώς πιο πίσω 916 00:42:03,980 --> 00:42:06,344 αν μπορώ να δω κάποιο από τα χέρια με όλο το φως ή όχι. 917 00:42:06,344 --> 00:42:08,010 Κάποιος που εθελοντικά εκεί. 918 00:42:08,010 --> 00:42:08,968 Θέλετε να καταλήξει; 919 00:42:08,968 --> 00:42:10,450 Αντιβράχιο σας δεν θα εξαναγκάζεται να ανεβαίνει. 920 00:42:10,450 --> 00:42:12,340 Εντάξει, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 έρχεται προς τα κάτω. 923 00:42:15,120 --> 00:42:18,450 Θα μπορούσε κάποιος άλλος ήθελε να forcefully-- Έλα επάνω. 924 00:42:18,450 --> 00:42:21,030 Ένα πραγματικό εθελοντή. 925 00:42:21,030 --> 00:42:23,330 >> Έτσι πολύ γρήγορα, εάν εσείς θα μπορούσε να οργανώσει 926 00:42:23,330 --> 00:42:26,550 τον εαυτό σας όπως ακριβώς οι κόμβοι στην οθόνη. 927 00:42:26,550 --> 00:42:27,510 Ευχαριστώ. 928 00:42:27,510 --> 00:42:29,234 Και θα είναι 26. 929 00:42:29,234 --> 00:42:30,650 Όλα τα δεξιά και γρήγορη εισαγωγή. 930 00:42:30,650 --> 00:42:32,139 Έτσι, είμαι ο Δαβίδ και είστε επίσης; 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: Και είσαι; 933 00:42:33,721 --> 00:42:34,229 JAKE: Τζέικ. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 ΑΛΕΞ: Αλεξ. 936 00:42:35,229 --> 00:42:36,475 ΡΑΦΑΗΛ: Ραφαήλ. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Εξαιρετική. 940 00:42:37,590 --> 00:42:39,810 Έτσι, αυτές είναι οι εθελοντές μας για το σήμερα και να προχωρήσει 941 00:42:39,810 --> 00:42:43,090 και στροφή λίγο με αυτό τον τρόπο, και απλά να προχωρήσει και να κρατήσει 942 00:42:43,090 --> 00:42:47,024 κρατώντας τους αριθμούς σας καθώς είστε ή σας πρώτο σημάδι και με το αριστερό χέρι σας, 943 00:42:47,024 --> 00:42:48,940 να προχωρήσει και να εφαρμόσει μόνο Αυτά τα βέλη, μόλις 944 00:42:48,940 --> 00:42:51,360 έτσι ώστε το αριστερό χέρι σας είναι κυριολεκτικά δείχνει σε ό, τι πρέπει να επισημάνω 945 00:42:51,360 --> 00:42:54,610 σε, και δώστε στον εαυτό σας κάποια περιθώρια έτσι ώστε μπορούμε να δούμε οπτικά τα χέρια σας πραγματικότητα 946 00:42:54,610 --> 00:42:58,120 κατάδειξης, και μπορείτε να το σημείο ακριβώς είδος στο έδαφος είναι μια χαρά. 947 00:42:58,120 --> 00:43:03,040 >> Έτσι, εδώ έχουμε μια συνδεδεμένη λίστα του ενός, δύο, τρεις, τέσσερις, πέντε κόμβους αρχικά, 948 00:43:03,040 --> 00:43:05,860 και να παρατηρήσετε έχουμε αυτή την ειδική δείκτη στην αρχή που είναι 949 00:43:05,860 --> 00:43:09,770 βασικά επειδή έχουμε να παρακολουθείτε όλη τη λίστα μήκος κάπως. 950 00:43:09,770 --> 00:43:13,590 Αυτά τα παιδιά, ακόμα κι αν είστε αριστερά προς τα δεξιά, πλάτη με πλάτη στη μνήμη, 951 00:43:13,590 --> 00:43:15,950 μπορούν στην πραγματικότητα να είναι οπουδήποτε στη μνήμη του υπολογιστή. 952 00:43:15,950 --> 00:43:18,240 Έτσι, αυτοί οι τύποι θα μπορούσαν να είναι στέκεται οπουδήποτε στη σκηνή 953 00:43:18,240 --> 00:43:20,960 και ότι είναι εντάξει, εφ 'όσον είναι στην πραγματικότητα δείχνει σε ένα άλλο, 954 00:43:20,960 --> 00:43:22,770 αλλά για να κρατήσει τα πράγματα καθαρό και απλό, θα 955 00:43:22,770 --> 00:43:25,728 απλά να τους επιστήσει αριστερά προς τα δεξιά, όπως αυτό, αλλά θα μπορούσαν να υπάρξουν τεράστιες ελλείψεις 956 00:43:25,728 --> 00:43:26,790 μεταξύ αυτών των κόμβων. 957 00:43:26,790 --> 00:43:30,710 >> Τώρα, αν θέλετε να εισάγετε στην πραγματικότητα κάποια νέα τιμή, ας πάμε μπροστά και να το κάνουμε αυτό. 958 00:43:30,710 --> 00:43:33,720 Έχουμε μια ευκαιρία τώρα να επιλέξει ένα άλλο κόμβο. 959 00:43:33,720 --> 00:43:39,820 Πείτε ας ξεκινήσουμε με mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Θα με πείραζε να είναι κάποιος malloc; 961 00:43:41,320 --> 00:43:42,280 Εντάξει, έλα επάνω. 962 00:43:42,280 --> 00:43:42,992 Ποιο είναι το όνομά σου? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Rainbow; 965 00:43:44,050 --> 00:43:44,810 Εντάξει. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Έλα επάνω. 968 00:43:47,450 --> 00:43:51,610 Έτσι τώρα έχουμε να αναρωτηθούμε αλγοριθμικά όπου μπορούμε να βάλουμε 55. 969 00:43:51,610 --> 00:43:53,610 Έτσι, όλοι μας γνωρίζουμε, Προφανώς, όπου κατά πάσα πιθανότητα 970 00:43:53,610 --> 00:43:55,401 Ανήκει αν προσπαθούμε για να κρατήσει αυτό το ταξινομημένο 971 00:43:55,401 --> 00:43:58,299 και αν εσείς μπορούσε να πάρει μία βήμα προς τα πίσω έτσι ώστε να μην πέσουν 972 00:43:58,299 --> 00:43:59,590 το στάδιο, αυτό θα ήταν μεγάλη. 973 00:43:59,590 --> 00:44:01,420 Έτσι, στην πραγματικότητα, το Rainbow, ξεκινήσει εδώ μαζί μου, 974 00:44:01,420 --> 00:44:04,200 γιατί με τον υπολογιστή μπορεί τώρα δει μόνο μία μεταβλητή κάθε φορά. 975 00:44:04,200 --> 00:44:05,190 Έτσι, αν αυτή είναι η πρώτη κόμβο. 976 00:44:05,190 --> 00:44:07,160 Παρατηρήστε ότι δεν είναι ένας κόμβος, αυτός είναι απλά ένας δείκτης, 977 00:44:07,160 --> 00:44:10,270 και αυτός είναι ο λόγος αυτός είναι που να είναι μόνο το μέγεθος ενός δείκτη, δεν 978 00:44:10,270 --> 00:44:11,780 ένα από αυτά τα πλήρους ορθογώνια. 979 00:44:11,780 --> 00:44:16,650 Έτσι θα πάμε για να ελέγξετε σε κάθε επανάληψη είναι μικρότερη από 55 9; 980 00:44:16,650 --> 00:44:17,150 Κανένα. 981 00:44:17,150 --> 00:44:19,060 Είναι μικρότερη από 55 17; 982 00:44:19,060 --> 00:44:19,720 Κανένα. 983 00:44:19,720 --> 00:44:20,800 Λιγότερο από 22; 984 00:44:20,800 --> 00:44:22,020 Λιγότερο από 26; 985 00:44:22,020 --> 00:44:23,390 Λιγότερο από 34; 986 00:44:23,390 --> 00:44:25,890 Και έτσι τώρα, προφανώς Rainbow ανήκει στο τέλος. 987 00:44:25,890 --> 00:44:27,270 Έτσι για να είναι σαφής, και τι ήταν το όνομά σου, Τέιλορ; 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Έτσι μεταξύ του Taylor το αριστερό χέρι και τα χέρια της Rainbow εδώ, 990 00:44:32,510 --> 00:44:38,324 του οποίου το χέρι πρέπει να σημειωθεί σε ό, τι στην Για να εισάγετε 55 σε αυτή τη λίστα; 991 00:44:38,324 --> 00:44:39,240 Τι πρέπει να κάνουμε; 992 00:44:39,240 --> 00:44:39,700 Ναι; 993 00:44:39,700 --> 00:44:41,140 >> Κοινό: το χέρι του Taylor Πρέπει να επισημάνω αριστερά. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Ακριβώς. 995 00:44:41,680 --> 00:44:43,800 Έτσι, την εισαγωγή ενός κόμβου στο τέλος της λίστας 996 00:44:43,800 --> 00:44:47,140 Είναι αρκετά απλό, επειδή ακριβώς Taylor πρέπει να επισημάνω, αντί στο έδαφος 997 00:44:47,140 --> 00:44:49,640 ή θα το ονομάσουμε μηδενική, null είναι το είδος της απουσίας 998 00:44:49,640 --> 00:44:51,640 ενός δείκτη ή ένα ειδικό μηδενικό δείκτη, είστε 999 00:44:51,640 --> 00:44:53,740 πρόκειται να επισημάνω με το αριστερό σας χέρι στο Rainbow και, στη συνέχεια, Rainbow, 1000 00:44:53,740 --> 00:44:55,910 όπου θα πρέπει να αφήνεται σας χέρι, πιθανώς δείχνουν; 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Δεν είναι καλό, αν το χέρι είναι είδος του δείχνει off εδώ ή οποιοδήποτε είδος της 1003 00:45:00,140 --> 00:45:00,640 προς ποια κατεύθυνση. 1004 00:45:00,640 --> 00:45:02,407 Αυτό θα μπορούσε να θεωρηθεί μια τιμή σκουπίδια, 1005 00:45:02,407 --> 00:45:04,240 αλλά εάν δείχνει κάποια γνωστή τιμή, θα 1006 00:45:04,240 --> 00:45:07,360 καλέστε το μηδέν ή μηδενική, αυτό είναι εντάξει γιατί έχουμε έναν όρο αυτό 1007 00:45:07,360 --> 00:45:09,390 και ξέρουμε ότι ο κατάλογος τώρα είναι πλήρης. 1008 00:45:09,390 --> 00:45:11,550 >> Έτσι τι είναι ένα άλλο σχετικά απλή υπόθεση; 1009 00:45:11,550 --> 00:45:13,125 Θα μπορούσαμε να malloc 5; 1010 00:45:13,125 --> 00:45:14,010 Έλα επάνω. 1011 00:45:14,010 --> 00:45:14,782 Ποιο είναι το όνομά σου? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Λυπάμαι; 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID Malan: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Εντάξει. 1017 00:45:17,110 --> 00:45:19,071 Tiffany έχει malloced με την τιμή 5. 1018 00:45:19,071 --> 00:45:19,570 Έλα επάνω. 1019 00:45:19,570 --> 00:45:23,820 Αυτό και μόνο είναι σχετικά εύκολο πάρα πολύ, αλλά ας εξετάσει σειρά των πράξεων τώρα. 1020 00:45:23,820 --> 00:45:25,820 Ήταν αρκετά εύκολο με Taylor στο τέλος. 1021 00:45:25,820 --> 00:45:30,302 Αριθμός 5 είναι φυσικά μικρότερη από 9, και έτσι έχουμε Ντέιβιντ, έχουμε Tiffany, 1022 00:45:30,302 --> 00:45:31,260 και ποιο ήταν το όνομά σας; 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Τζέικ. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID Malan: Τζέικ. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Τζέικ, και ο David. 1026 00:45:34,300 --> 00:45:36,580 Του οποίου το χέρι θα πρέπει να ενημερωθεί πρώτα; 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Τι θέλετε να κάνετε εδώ; 1029 00:45:40,590 --> 00:45:45,244 Υπάρχει ένα ζευγάρι δυνατούς τρόπους, αλλά υπάρχει επίσης ένα ή περισσότερα λάθος τρόπους. 1030 00:45:45,244 --> 00:45:46,620 >> Κοινό: Ξεκινήστε με αριστερότερα. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Ξεκινήστε με το αριστερότερο. 1032 00:45:47,800 --> 00:45:49,008 Ποιος είναι το αριστερότερο εδώ τότε; 1033 00:45:49,008 --> 00:45:49,700 Κοινό: Πρώτον. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Έτσι, ξεκινούν με την πρώτη και πού να κάνετε Θέλετε να ενημερώσετε τα χέρια του Δαβίδ για να είναι; 1036 00:45:53,781 --> 00:45:54,780 Κοινό: Προς το 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Έτσι ο Δαβίδ, σημείο σε πέντε ή Tiffany εδώ και τώρα; 1039 00:45:59,026 --> 00:46:01,072 >> Κοινό: Tiffany επισημαίνει το 9; 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Τέλεια, εκτός του Binky το κεφάλι ακριβώς το είδος του έπεσε, έτσι δεν είναι; 1041 00:46:04,030 --> 00:46:06,820 Διότι τι είναι λάθος με Αυτή η εικόνα στην κυριολεξία; 1042 00:46:06,820 --> 00:46:08,070 Κοινό: Τίποτα δεν δείχνει. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Τίποτα δεν είναι επισημαίνοντας Τζέικ τώρα. 1044 00:46:09,945 --> 00:46:13,360 Έχουμε κυριολεκτικά ορφανά 9 και 17, και έχουμε κυριολεκτικά 1045 00:46:13,360 --> 00:46:18,450 διαρρεύσει όλη αυτή τη μνήμη, επειδή με ενημερώνοντας το χέρι του Δαβίδ πρώτον, ότι είναι 1046 00:46:18,450 --> 00:46:21,660 πρόστιμο στον βαθμό που αυτό είναι σωστά δείχνοντας Tiffany τώρα, 1047 00:46:21,660 --> 00:46:25,410 αλλά αν κανείς δεν είχε το προνοητικότητα να επισημάνει Τζέικ, 1048 00:46:25,410 --> 00:46:27,490 τότε έχουμε χάσει το όλα τα μέρη του εν λόγω καταλόγου. 1049 00:46:27,490 --> 00:46:28,200 Ας αναιρέσετε. 1050 00:46:28,200 --> 00:46:30,950 Έτσι, αυτό ήταν ένα καλό πράγμα για να σκοντάψετε αλλά ας διορθώσουμε τώρα. 1051 00:46:30,950 --> 00:46:33,624 Τι πρέπει να κάνουμε πρώτα αντ 'αυτού; 1052 00:46:33,624 --> 00:46:34,124 Ναι; 1053 00:46:34,124 --> 00:46:35,791 >> Κοινό: Tiffany θα πρέπει να επισημανθεί το 9; 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Δεν μπορώ να να πάρει ότι κοντά σας. 1055 00:46:37,582 --> 00:46:38,720 Ποιος θα πρέπει να επισημανθεί το 9; 1056 00:46:38,720 --> 00:46:39,220 >> Κοινό: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Εντάξει. 1058 00:46:39,390 --> 00:46:41,200 Έτσι, θα πρέπει Tiffany πρώτο σημείο στο 9. 1059 00:46:41,200 --> 00:46:43,550 Έτσι θα πρέπει να λαμβάνει Tiffany στον ίδιο αξίας 1060 00:46:43,550 --> 00:46:45,820 με τον David, ο οποίος φαίνεται περιττή για μια στιγμή, 1061 00:46:45,820 --> 00:46:48,820 αλλά αυτό είναι εντάξει, επειδή τώρα, δεύτερο βήμα, να μπορέσουμε να ενημερώσουμε το χέρι του Δαβίδ 1062 00:46:48,820 --> 00:46:52,680 στο σημείο στο Tiffany, και στη συνέχεια, αν έχουμε ακριβώς το είδος της καθαρά τα πράγματα 1063 00:46:52,680 --> 00:46:55,740 όπως και αν αυτό είναι το είδος του σαν ελατήριο, τώρα αυτό είναι μια σωστή εισαγωγή. 1064 00:46:55,740 --> 00:46:56,700 Έτσι εξαιρετική. 1065 00:46:56,700 --> 00:46:57,970 Έτσι τώρα είμαστε σχεδόν εκεί. 1066 00:46:57,970 --> 00:47:01,075 Ας προστεθεί ένα τελικό αξίας, όπως την τιμή 20. 1067 00:47:01,075 --> 00:47:03,010 Αν μπορούσαμε να malloc ένα τελικό εθελοντής; 1068 00:47:03,010 --> 00:47:04,140 Έλα επάνω. 1069 00:47:04,140 --> 00:47:06,224 Έτσι, αυτό είναι λίγο πιο δύσκολο. 1070 00:47:06,224 --> 00:47:08,390 Αλλά πραγματικά, ο κώδικας είμαστε γραπτώς, έστω και προφορικά, 1071 00:47:08,390 --> 00:47:10,610 Είναι ακριβώς σαν να έχεις ένα μάτσο του αν οι συνθήκες τώρα, έτσι δεν είναι; 1072 00:47:10,610 --> 00:47:12,318 Είχαμε μια κατάσταση ελέγχοντας αν ανήκει 1073 00:47:12,318 --> 00:47:13,840 στο τέλος, ίσως στην αρχή. 1074 00:47:13,840 --> 00:47:15,940 Χρειαζόμαστε κάποιο είδος βρόχου να βρείτε το σημείο στη μέση. 1075 00:47:15,940 --> 00:47:17,400 Ας το κάνουμε αυτό με το τι είναι το όνομά σας; 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID Malan: Eric; 1078 00:47:18,340 --> 00:47:18,660 Έρικ. 1079 00:47:18,660 --> 00:47:19,368 Χάρηκα για τη γνωριμία. 1080 00:47:19,368 --> 00:47:20,490 Έτσι έχουμε 20. 1081 00:47:20,490 --> 00:47:21,220 Λιγότερο από πέντε; 1082 00:47:21,220 --> 00:47:21,530 Κανένα. 1083 00:47:21,530 --> 00:47:22,160 Λιγότερο από εννέα; 1084 00:47:22,160 --> 00:47:22,410 Κανένα. 1085 00:47:22,410 --> 00:47:23,050 Λιγότερο από 17; 1086 00:47:23,050 --> 00:47:23,550 Κανένα. 1087 00:47:23,550 --> 00:47:23,740 ΕΝΤΆΞΕΙ. 1088 00:47:23,740 --> 00:47:25,701 Ανήκει εδώ και τα ονόματά σας και πάλι είναι; 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Sue. 1091 00:47:26,880 --> 00:47:27,379 ΑΛΕΞ: Αλεξ. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Άλεξ, και; 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID Malan: Eric. 1095 00:47:30,120 --> 00:47:32,140 Ποιανού τα χέρια πρέπει να ενημερωθούν πρώτα; 1096 00:47:32,140 --> 00:47:32,930 >> Κοινό: Eric. 1097 00:47:32,930 --> 00:47:33,429 ΕΝΤΆΞΕΙ. 1098 00:47:33,429 --> 00:47:35,200 Έτσι, ο Eric θα πρέπει να επισημάνει πού; 1099 00:47:35,200 --> 00:47:35,930 Στα 22. 1100 00:47:35,930 --> 00:47:36,430 Καλή. 1101 00:47:36,430 --> 00:47:38,180 Και τώρα τι γίνεται στη συνέχεια; 1102 00:47:38,180 --> 00:47:40,800 Sue μπορεί να επισημάνει στο Eric και τώρα, αν εσείς απλά 1103 00:47:40,800 --> 00:47:44,077 κάνει κάποια αίθουσα, η οποία είναι μια χαρά οπτικά, τώρα έχουμε κάνει την εισαγωγή. 1104 00:47:44,077 --> 00:47:47,160 Ας εξετάσουμε τώρα ένα ερώτημα, αλλά σας ευχαριστώ πολύ για τους εθελοντές μας. 1105 00:47:47,160 --> 00:47:48,090 Πολύ καλά κάνει. 1106 00:47:48,090 --> 00:47:50,831 Μπορείτε να διατηρήσουμε αυτά, αν θέλετε. 1107 00:47:50,831 --> 00:47:54,140 Και έχουμε ένα υπέροχο δώρο χωρίστρα, αν θέλετε κάθε θέλατε να ρίξετε μια μπάλα για το άγχος. 1108 00:47:54,140 --> 00:47:56,030 Επιτρέψτε μου να περάσει αυτό κάτω. 1109 00:47:56,030 --> 00:47:58,430 Έτσι, ποιο είναι το πακέτο αυτό; 1110 00:47:58,430 --> 00:48:02,430 Αυτό φαίνεται να είναι καταπληκτικό στο βαθμό που έχουμε τώρα 1111 00:48:02,430 --> 00:48:06,360 εισήγαγε μια εναλλακτική λύση για μια συστοιχία που δεν περιορίζεται έτσι 1112 00:48:06,360 --> 00:48:07,780 σε μια σειρά κάποιου σταθερού μεγέθους. 1113 00:48:07,780 --> 00:48:09,380 Μπορούν να αναπτυχθούν δυναμικά. 1114 00:48:09,380 --> 00:48:13,220 >> Αλλά μοιάζει πολύ έχουμε δει σε εβδομάδες παρελθόν, δεν μπορούμε ποτέ να πάρει κάτι δωρεάν, 1115 00:48:13,220 --> 00:48:15,740 όπως σίγουρα υπάρχει ένα trade-off εδώ. 1116 00:48:15,740 --> 00:48:18,890 Έτσι, με ένα ανάποδο ενός συνδεδεμένου λίστα, είναι ο δυναμισμός; 1117 00:48:18,890 --> 00:48:21,590 Αυτή η ικανότητα να αναπτύσσονται και ειλικρινά, θα μπορούσαμε να είχαμε κάνει delete 1118 00:48:21,590 --> 00:48:23,570 και θα μπορούσαμε να συρρικνωθεί, όπως απαιτείται. 1119 00:48:23,570 --> 00:48:24,710 Τι τιμή πληρώνουμε; 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Διπλάσιο χώρο, πρώτα απ 'όλα. 1122 00:48:30,340 --> 00:48:34,010 Αν κοιτάξετε την εικόνα, δεν είναι πλέον είμαι αποθήκευση ενός πίνακα ακεραίων. 1123 00:48:34,010 --> 00:48:36,740 Είμαι αποθήκευση μια λίστα ακέραιοι συν δείκτες. 1124 00:48:36,740 --> 00:48:38,240 Έτσι είμαι διπλασιάζοντας την ποσότητα του χώρου. 1125 00:48:38,240 --> 00:48:40,740 Τώρα, ίσως αυτό δεν είναι τέτοια ένα big deal 4 bytes, 8 bytes, 1126 00:48:40,740 --> 00:48:43,160 αλλά θα μπορούσε σίγουρα να προσθέσετε για μεγάλα σύνολα δεδομένων. 1127 00:48:43,160 --> 00:48:45,570 Τι είναι ένα άλλο μειονέκτημα; 1128 00:48:45,570 --> 00:48:46,070 Ναι; 1129 00:48:46,070 --> 00:48:48,010 >> Κοινό: Πρέπει να διασχίζουν τα ένα-ένα. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Ναι. 1131 00:48:48,760 --> 00:48:50,260 Πρέπει να τους διασχίσει ένα-ένα. 1132 00:48:50,260 --> 00:48:53,860 Ξέρεις τι, δώσαμε αυτό το σούπερ βολικό χαρακτηριστικό της αγκύλη 1133 00:48:53,860 --> 00:48:57,240 σημειογραφία, πιο σωστά γνωστή ως τυχαία πρόσβαση, 1134 00:48:57,240 --> 00:48:59,280 όπου μπορούμε να πηδήσει μόνο σε ένα επιμέρους στοιχείο 1135 00:48:59,280 --> 00:49:01,470 αλλά τώρα αν είχα ακόμα εθελοντές μου εδώ, 1136 00:49:01,470 --> 00:49:04,660 αν ήθελα να βρουν το αριθμός 22, δεν μπορώ απλά 1137 00:49:04,660 --> 00:49:06,620 άλμα για στήριγμα κάτι κάτι. 1138 00:49:06,620 --> 00:49:10,530 Θα πρέπει να κοιτάξω πάνω από τη λίστα, πολύ σαν παραδείγματα αναζήτηση μας γραμμικά, 1139 00:49:10,530 --> 00:49:12,260 για να βρείτε τον αριθμό 22. 1140 00:49:12,260 --> 00:49:14,340 Γι 'αυτό και φαίνεται να έχουν πληρώσει ένα τίμημα εκεί. 1141 00:49:14,340 --> 00:49:16,430 Αλλά μπορούμε ωστόσο να επίλυση άλλων προβλημάτων. 1142 00:49:16,430 --> 00:49:18,587 >> Στην πραγματικότητα, επιτρέψτε μου να εισαγάγει μόνο ένα ζευγάρι των visuals. 1143 00:49:18,587 --> 00:49:20,920 Έτσι, εάν έχετε πάει κάτω για να Mather αίθουσα του δείπνου πρόσφατα, 1144 00:49:20,920 --> 00:49:23,320 θα θυμάστε ότι τους στοίβες των δίσκων όπως αυτό, 1145 00:49:23,320 --> 00:49:26,300 έχουμε δανειστεί από αυτά Annenberg πριν το μάθημα. 1146 00:49:26,300 --> 00:49:28,930 Έτσι, αυτό στοίβα των δίσκων, όμως, είναι αντιπροσωπευτική πραγματικότητα 1147 00:49:28,930 --> 00:49:30,860 μιας δομής δεδομένων της επιστήμης των υπολογιστών. 1148 00:49:30,860 --> 00:49:32,910 Υπάρχει μια δομή δεδομένων στην επιστήμη των υπολογιστών 1149 00:49:32,910 --> 00:49:38,010 γνωστή ως μια στοίβα η οποία είναι πολύ ωραία προσφέρεται για αυτό ακριβώς το οπτικό. 1150 00:49:38,010 --> 00:49:41,380 Έτσι, αν κάθε ένα από αυτούς τους δίσκους δεν είναι δίσκος αλλά σαν μια σειρά και θα ήθελα 1151 00:49:41,380 --> 00:49:45,010 για να αποθηκεύσετε αριθμούς, Ι θα μπορούσε να θέσει ένα εδώ κάτω, 1152 00:49:45,010 --> 00:49:48,320 και θα μπορούσα να βάλω άλλο ένα εδώ κάτω, και να συνεχίσει στοίβαγμα αριθμούς 1153 00:49:48,320 --> 00:49:53,180 πάνω από το ένα το άλλο, και τι είναι δυνητικά χρήσιμο γι 'αυτό 1154 00:49:53,180 --> 00:49:55,450 είναι ότι ό, τι είναι η επίπτωση αυτής της δομής δεδομένων; 1155 00:49:55,450 --> 00:49:58,045 Ποια αριθμός μπορεί να βγάζω πρώτη πιο εύκολα; 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Ο πιο πρόσφατα ένας θέσει εκεί. 1158 00:50:03,030 --> 00:50:06,430 >> Έτσι, αυτό είναι αυτό που θα λέγαμε σε επιστήμη των υπολογιστών μια δομή δεδομένων LIFO. 1159 00:50:06,430 --> 00:50:08,070 Τελευταία in, first out. 1160 00:50:08,070 --> 00:50:10,800 Και θα δούμε σε λίγο γιατί ότι μπορεί να είναι χρήσιμο, αλλά για τώρα, 1161 00:50:10,800 --> 00:50:12,200 Για σκέψου το ακίνητο. 1162 00:50:12,200 --> 00:50:15,158 Και είναι κάπως ανόητο αν νομίζετε σχετικά με το πώς η τραπεζαρία που κάνει. 1163 00:50:15,158 --> 00:50:17,910 Κάθε φορά που οι δίσκοι και τα καθαρά βάλτε τα πιο φρέσκα αυτά στην κορυφή, 1164 00:50:17,910 --> 00:50:22,160 θα μπορούσατε να έχετε ένα καθαρό παρελθόν αλλά τελικά είναι πολύ βρώμικο και σκονισμένο 1165 00:50:22,160 --> 00:50:24,360 δίσκο στο κάτω μέρος αν ποτέ πραγματικά 1166 00:50:24,360 --> 00:50:26,820 πάτε στο κάτω μέρος της ότι στοίβα, γιατί απλά 1167 00:50:26,820 --> 00:50:29,380 κρατήσει τη θέση του νέου και Τα καθαρά αυτά που πάνω του. 1168 00:50:29,380 --> 00:50:31,840 Το ίδιο πράγμα μπορεί να συμβεί σε ένα σούπερ μάρκετ πολύ. 1169 00:50:31,840 --> 00:50:35,450 Αν έχετε μια περίπτωση επίδειξης του γάλακτος και κάθε φορά που το CVS 1170 00:50:35,450 --> 00:50:37,610 ή όποιος παίρνει περισσότερο γάλα, μπορείτε απλά να χώσουν τα γάλατα 1171 00:50:37,610 --> 00:50:39,880 έχετε ήδη προς τα πίσω και βάζετε τα καινούργια μπροστά, 1172 00:50:39,880 --> 00:50:43,088 θα πάμε να έχουν κάποια πολύ άσχημη γάλα στο τέλος της δομής των δεδομένων, 1173 00:50:43,088 --> 00:50:46,390 επειδή είναι πάντα στο κάτω μέρος ή ισοδύναμα είναι πάντα στο πίσω μέρος. 1174 00:50:46,390 --> 00:50:50,407 >> Αλλά υπάρχει ένας άλλος τρόπος για να σκεφτούμε παράταξη δεδομένων και, για παράδειγμα, αυτό. 1175 00:50:50,407 --> 00:50:53,490 Αν είστε ένας από εκείνους τους ανθρώπους που του αρέσει να παρατάξει έξω από καταστήματα της Apple 1176 00:50:53,490 --> 00:50:55,610 όταν ένα νέο προϊόν έρχεται έξω, είστε πιθανώς 1177 00:50:55,610 --> 00:50:58,780 Δεν χρησιμοποιώντας μια στοίβα δεδομένων δομή γιατί 1178 00:50:58,780 --> 00:51:03,070 θα αποξενώσει όλοι οι άλλοι που είναι επένδυση μέχρι να αγοράσουν κάποιο νέο παιχνίδι. 1179 00:51:03,070 --> 00:51:06,610 Μάλλον, είστε πιθανώς χρησιμοποιώντας τι είδους δομή δεδομένων 1180 00:51:06,610 --> 00:51:10,050 ή τι είδους σύστημα στον πραγματικό κόσμο; 1181 00:51:10,050 --> 00:51:13,493 Ας ελπίσουμε ότι αυτό είναι μια γραμμή, ή περισσότερο σωστά ή περισσότεροι Βρετανοί-όπως, μια ουρά. 1182 00:51:13,493 --> 00:51:17,700 Και αποδεικνύεται μια ουρά είναι επίσης ένα δομή δεδομένων στην επιστήμη των υπολογιστών, 1183 00:51:17,700 --> 00:51:19,700 αλλά μια ουρά έχει μια πολύ διαφορετική ιδιότητα. 1184 00:51:19,700 --> 00:51:20,820 Δεν είναι LIFO. 1185 00:51:20,820 --> 00:51:21,990 Τελευταία in, first out. 1186 00:51:21,990 --> 00:51:22,800 Θεός φυλάξοι. 1187 00:51:22,800 --> 00:51:24,280 Είναι αντ 'αυτού FIFO. 1188 00:51:24,280 --> 00:51:26,110 First in, first out. 1189 00:51:26,110 --> 00:51:27,970 Και αυτό είναι ένα καλό πράγμα για τη δικαιοσύνη του Θεού, 1190 00:51:27,970 --> 00:51:30,428 Σίγουρα όταν είστε επένδυση up σούπερ νωρίς το πρωί. 1191 00:51:30,428 --> 00:51:33,400 Αν φτάσετε εκεί πρώτα, θα θέλουν να βγούμε από την πρώτη, καθώς και. 1192 00:51:33,400 --> 00:51:35,880 >> Και έτσι όλα αυτά τα δεδομένα δομές, ουρές και στοίβες 1193 00:51:35,880 --> 00:51:39,220 και τσαμπιά των άλλων, αποδεικνύεται ότι σας μπορώ να σκεφτώ αυτή, όπως ακριβώς μια σειρά. 1194 00:51:39,220 --> 00:51:41,820 Αυτή είναι μια συστοιχία, ίσως ένα σταθερό μέγεθος 4, αλλά θα έπαιρνα 1195 00:51:41,820 --> 00:51:44,990 είναι το είδος της ωραίο αν θα μπορούσαμε απλά να συσσωρεύονται δίσκους σχεδόν απείρως ψηλό αν 1196 00:51:44,990 --> 00:51:46,780 έχουν πολλούς δίσκους ότι ή αριθμούς. 1197 00:51:46,780 --> 00:51:48,840 Έτσι ίσως θέλουμε να χρησιμοποιήστε μια συνδεδεμένη λίστα εδώ, 1198 00:51:48,840 --> 00:51:51,800 αλλά το εμπόριο-off θα είναι ενδεχομένως ότι χρειαζόμαστε περισσότερη μνήμη, 1199 00:51:51,800 --> 00:51:55,930 παίρνει λίγο περισσότερο χρόνο, αλλά εμείς δεν περιορίζουν το ύψος της στοίβας, 1200 00:51:55,930 --> 00:51:59,550 σαν προθήκη του Mather θα μπορούσε να περιορίσει το μέγεθος της στοίβας, 1201 00:51:59,550 --> 00:52:03,117 και έτσι αυτά είναι αποφάσεις σχεδιασμού ή επιλογές στη διάθεσή μας τελικά. 1202 00:52:03,117 --> 00:52:04,950 Έτσι, με αυτά τα δεδομένα δομές, έχουμε αρχίσει 1203 00:52:04,950 --> 00:52:09,360 βλέπουμε νέες άνω φράγματα δυνητικά Σε ό, τι στο παρελθόν ήταν πολύ γρήγορη 1204 00:52:09,360 --> 00:52:11,260 και πού θα φύγουν off, όπου και σήμερα 1205 00:52:11,260 --> 00:52:13,200 θα ελπίζουμε να φτάσουμε είναι την Τετάρτη, θα 1206 00:52:13,200 --> 00:52:15,740 να αρχίσουμε να εξετάζουμε σε δεδομένα δομή που μας επιτρέπει να αναζητήσετε 1207 00:52:15,740 --> 00:52:18,260 μέσω των δεδομένων στο ημερολόγιο τέλος του χρόνου πάλι. 1208 00:52:18,260 --> 00:52:21,470 Και είδαμε ότι, υπενθυμίζουν, στο μηδέν εβδομάδα και ένα με δυαδική αναζήτηση ή συνθλίβεται 1209 00:52:21,470 --> 00:52:22,180 και βασίλευε. 1210 00:52:22,180 --> 00:52:26,240 Έρχεται πίσω και ακόμα καλύτερα, το Άγιο Δισκοπότηρο για αυτή την Τετάρτη 1211 00:52:26,240 --> 00:52:29,510 θα είναι να καταλήξουμε με το δομή δεδομένων που τρέχει πραγματικά 1212 00:52:29,510 --> 00:52:32,070 ή θεωρητικά σταθερά χρόνου, οπότε 1213 00:52:32,070 --> 00:52:34,760 δεν έχει σημασία πόσες εκατομμύρια ή δισεκατομμύρια των πραγμάτων 1214 00:52:34,760 --> 00:52:38,470 έχουμε στη δομή δεδομένων, θα να μας σταθερά χρόνου, ίσως ένα βήμα 1215 00:52:38,470 --> 00:52:41,387 ή δύο βήματα ή 10 βήματα, αλλά σταθερή αριθμοί των βημάτων 1216 00:52:41,387 --> 00:52:42,970 να αναζητήσετε μέσα από αυτή τη δομή δεδομένων. 1217 00:52:42,970 --> 00:52:46,300 Αυτό πράγματι θα είναι το Ιερό Δισκοπότηρο αλλά περισσότερα για αυτό την Τετάρτη. 1218 00:52:46,300 --> 00:52:49,045 Τα λέμε τότε. 1219 00:52:49,045 --> 00:52:53,704 >> [Παίζει μουσική] 1220 00:52:53,704 --> 00:56:08,448