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