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