1 00:00:00,000 --> 00:00:11,242 >> [Παίζει μουσική] 2 00:00:11,242 --> 00:00:16,630 >> David J. MALAN: Εντάξει αυτό είναι CS50 και αυτή είναι η αρχή της εβδομάδας πέντε. 3 00:00:16,630 --> 00:00:21,480 Έτσι, σήμερα, κάτω από μαξιλάρια του καθίσματος σας, δεν θα βρείτε τίποτα. 4 00:00:21,480 --> 00:00:24,790 Αλλά πάνω, θα πρέπει να βρείτε αυτά, ένα μικρό δείγμα της εκτίμησής μας για 5 00:00:24,790 --> 00:00:26,970 όλη τη δουλειά που βάζετε στο παιχνίδι των Δεκαπέντε. 6 00:00:26,970 --> 00:00:30,290 Απλά αφαιρέστε το μικρό κύκλο στο κάτω μέρος για να ξεκινήσετε να παίζετε για την 7 00:00:30,290 --> 00:00:31,680 υπόλοιπο της κατηγορίας. 8 00:00:31,680 --> 00:00:38,930 >> Έτσι, υπενθυμίζουν ότι, ή να γνωρίζουν ότι το πρόβλημα που τέσσερις, που βγήκε αυτό το Σαββατοκύριακο, 9 00:00:38,930 --> 00:00:40,340 περιλαμβάνει γράψιμο ένα άλλο παιχνίδι. 10 00:00:40,340 --> 00:00:43,740 Αλλά αυτή τη φορά περιλαμβάνει τη χρήση ενός πραγματική γραφική διεπαφή χρήστη, δεν είναι 11 00:00:43,740 --> 00:00:46,310 κειμενικό περιβάλλον εργασίας, όπως Παιχνίδι των Δεκαπέντε ήταν. 12 00:00:46,310 --> 00:00:50,210 Και το παιχνίδι που βρίσκεται μπροστά σας, Εάν δεν έχετε δει ακόμα αυτό το επόμενο, 13 00:00:50,210 --> 00:00:52,310 μοιάζει λίγο κάτι σαν αυτό. 14 00:00:52,310 --> 00:00:55,170 Πάω να μπω σε τερματικό μου παράθυρο εδώ στην GDB. 15 00:00:55,170 --> 00:00:58,600 Και Πάω να πάει μπροστά και να τρέξει το λύση του προσωπικού, το οποίο μπορείτε να έχετε πρόσβαση 16 00:00:58,600 --> 00:01:01,010 μετά την εκτέλεση ενημέρωση 50 ως συνήθως. 17 00:01:01,010 --> 00:01:04,090 >> Αλλά Πάω να το βάλετε σε ένα μικρό μυστικό τρόπο, λίγο Πασχαλινό αυγό, 18 00:01:04,090 --> 00:01:08,480 λεγόμενη Θεός λειτουργία, με βάζοντας τον Θεό στην argv1. 19 00:01:08,480 --> 00:01:12,920 Και εγώ πρέπει να ακολουθήσει το δικό οδηγίες μου, τρέχει στη δική μου 20 00:01:12,920 --> 00:01:14,220 πρόβλημα που directory. 21 00:01:14,220 --> 00:01:19,190 Έτσι τώρα μπορείτε να δείτε μια πλήρη έκδοση το παιχνίδι του ξεμπλοκαρίσματος. 22 00:01:19,190 --> 00:01:21,090 Στην πραγματικότητα, αυτό δεν είναι-χέρια λειτουργία. 23 00:01:21,090 --> 00:01:24,850 Έτσι είναι στην πραγματικότητα - 24 00:01:24,850 --> 00:01:26,470 εντυπωσίασε αν και θα μπορούσε να είναι - 25 00:01:26,470 --> 00:01:30,850 πολύ ασήμαντο για να εφαρμόσουν τον Θεό σε λειτουργία Breakout, σε αντίθεση με το παιχνίδι των Δεκαπέντε, 26 00:01:30,850 --> 00:01:33,590 που κάποιοι από εσάς μπορεί να έχουν αντιμετωπιστεί για την έκδοση του χάκερ. 27 00:01:33,590 --> 00:01:37,890 >> Σε Breakout αρκεί στο Θεό τρόπος για να κάνει απλά αυτό, 28 00:01:37,890 --> 00:01:41,220 διαισθητικά με το κουπί; 29 00:01:41,220 --> 00:01:45,630 Απλά να είναι ίσο με το ό, τι η οριζόντια θέση είναι της μπάλας. 30 00:01:45,630 --> 00:01:49,220 Και εφ 'όσον μπορείτε να το κάνετε αυτό στο lockstep με την μπάλα να κινείται αυτό το παιχνίδι θα 31 00:01:49,220 --> 00:01:53,100 Ποτέ, ποτέ, ποτέ να χάσει την μπάλα και θα κερδίσετε κάθε φορά. 32 00:01:53,100 --> 00:01:55,430 >> Αλλά στην έκδοση του χάκερ αυτής της εβδομάδας Είναι κάτι περισσότερο από τρόπος του Θεού. 33 00:01:55,430 --> 00:01:56,720 Υπάρχει μια σειρά από άλλα χαρακτηριστικά. 34 00:01:56,720 --> 00:01:58,140 Μεταξύ αυτών, τα λέιζερ. 35 00:01:58,140 --> 00:02:01,070 Έτσι ώστε, αν είστε πραγματικά ανυπόμονοι σας μπορεί να ξεκινήσει κατάρριψη τα τούβλα 36 00:02:01,070 --> 00:02:02,120 και μερικοί άλλοι. 37 00:02:02,120 --> 00:02:04,560 Και για όσους από εσάς θα θέλατε να βαθμονόμηση πρότυπο έναντι χάκερ 38 00:02:04,560 --> 00:02:08,750 έκδοση, μπορώ να δω ότι αυτή η εβδομάδα έκδοση χάκερ είναι σκόπιμα μια 39 00:02:08,750 --> 00:02:12,830 λίγο πιο εφικτό, ας πούμε, από τον Θεό Λειτουργία ήταν με το παιχνίδι των Δεκαπέντε. 40 00:02:12,830 --> 00:02:15,300 >> Έτσι, αν ψάχνετε για ένα τέντωμα και ψάχνετε για κάποια επιπλέον διασκέδαση 41 00:02:15,300 --> 00:02:18,400 χαρακτηριστικά κάνουν βουτιά στο αν ενδιαφέροντος. 42 00:02:18,400 --> 00:02:21,280 Τώρα, περισσότερο πρακτικά, επιτρέψτε μου να επισημάνω από ένα πράγμα, καθώς και. 43 00:02:21,280 --> 00:02:24,780 GDB, που κάποιοι από εσάς μπορεί να μην έχουν ακόμη άγγιξε προσωπικά, η οποία είναι μια χαρά. 44 00:02:24,780 --> 00:02:28,530 Αλλά τώρα είναι πραγματικά το χρόνο για να συνηθίσουν σε αυτό και άνετα με αυτό το εργαλείο 45 00:02:28,530 --> 00:02:31,510 γιατί αυτό θα κάνει τη ζωή σας πολύ πιο εύκολο, πραγματικά. 46 00:02:31,510 --> 00:02:34,900 >> Ανά διάλεξη Rob για GDB ένα ζευγάρι εβδομάδες πριν, ανάκληση 47 00:02:34,900 --> 00:02:36,810 ότι η GDB είναι ένα πρόγραμμα εντοπισμού σφαλμάτων. 48 00:02:36,810 --> 00:02:41,230 Είναι ένα εργαλείο που σας επιτρέπει να εκτελέσετε σας πρόγραμμα, αλλά το εκτελέσετε βήμα προς βήμα, γραμμή 49 00:02:41,230 --> 00:02:45,680 από τη γραμμή, έτσι ώστε να μπορείτε να σακί γύρω, έτσι ώστε να δούμε τα πράγματα συμβαίνουν, οπότε 50 00:02:45,680 --> 00:02:47,310 που μπορείτε να εκτυπώσετε τιμές των μεταβλητών. 51 00:02:47,310 --> 00:02:50,580 Με λίγα λόγια, αυτό σας δίνει πολύ περισσότερα ενέργεια από printDef κάνει. 52 00:02:50,580 --> 00:02:52,900 >> Τώρα, κατά γενική ομολογία, η διεπαφή είναι αρκετά απόκρυφες. 53 00:02:52,900 --> 00:02:55,180 Μαύρο και άσπρο κειμένου interface για το μεγαλύτερο μέρος. 54 00:02:55,180 --> 00:02:57,400 Οι εντολές είναι κάπως δύσκολο να θυμάστε κατά την πρώτη. 55 00:02:57,400 --> 00:03:01,230 Αλλά ακόμα κι αν μπορεί να πάρει τα μισά μια ώρα, μια ώρα, να τεθεί η εκ των προτέρων 56 00:03:01,230 --> 00:03:02,940 επένδυση σε χρόνο σε αυτό, πιστέψτε με. 57 00:03:02,940 --> 00:03:06,440 Σίγουρα μέχρι το τέλος του εξαμήνου θα σώσει σας μια τάξη μεγέθους πιο 58 00:03:06,440 --> 00:03:07,600 χρόνο από αυτόν. 59 00:03:07,600 --> 00:03:09,200 >> Έτσι, στις αρχές της εβδομάδας έκανε βουτιά 60 00:03:09,200 --> 00:03:13,200 Και από την άποψη της Breakout, ξέρετε ότι να το κάνετε αυτό, εφόσον έχετε 61 00:03:13,200 --> 00:03:18,230 ο κωδικός διανομή ή τον δικό σας κώδικα σε εξέλιξη Pst4 σας κατάλογο. 62 00:03:18,230 --> 00:03:21,680 Να ξέρετε ότι μπορείτε να εκτελέσετε gdb. / Ξεμπλοκάρισμα. 63 00:03:21,680 --> 00:03:23,490 >> Αυτό πρόκειται να ανοίξει ένα παράθυρο σαν αυτό. 64 00:03:23,490 --> 00:03:25,530 Επιτρέψτε μου να δώσω στον εαυτό μου περισσότερο από ένα παράθυρο τερματικού. 65 00:03:25,530 --> 00:03:27,770 Και τότε τι Πάω να προχωρήσει και να το κάνουμε, δεν είναι να τρέξει μόνο. 66 00:03:27,770 --> 00:03:30,690 Πάω να πρώτα να ορίσετε ένα σημείο καμπής ανάκληση, η οποία σας επιτρέπει να διακόψετε 67 00:03:30,690 --> 00:03:32,500 εκτέλεση σε ένα συγκεκριμένο τόπο. 68 00:03:32,500 --> 00:03:35,750 >> Ακριβώς για να κρατήσει τα πράγματα απλά Πάω να σπάσει σε μία γραμμή απλά πληκτρολογώντας 69 00:03:35,750 --> 00:03:37,000 ο αριθμός ένα. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Επιτρέψτε μου πραγματικότητα ξανανοίξει αυτό το παράθυρο επειδή είναι να πάρει ένα 72 00:03:43,250 --> 00:03:45,700 λίγο μικρό εκεί. 73 00:03:45,700 --> 00:03:53,270 Έτσι, αυτό που είμαι τώρα πρόκειται να κάνουμε εδώ είναι αν ανοίξει παράθυρο τερματικού μου. 74 00:03:53,270 --> 00:03:53,910 Έλα, εκεί πάμε. 75 00:03:53,910 --> 00:03:59,850 >> Έτσι τώρα, αν πάω πίσω στο dropbox, Pst4 και να τρέξει gdb. / ξεμπλοκάρισμα εισάγετε, παρατηρήστε 76 00:03:59,850 --> 00:04:02,600 Πάω να σπάσει ένα για να ορίσετε ένα σημείο καμπής σε μία γραμμή. 77 00:04:02,600 --> 00:04:04,840 Και τώρα είμαι πρόκειται να πάει μπροστά και το είδος τρέξει. 78 00:04:04,840 --> 00:04:07,370 Και όταν το κάνω, τίποτε δεν φαίνεται να συμβαίνει. 79 00:04:07,370 --> 00:04:08,120 >> Δεν υπάρχει μέχρι pop. 80 00:04:08,120 --> 00:04:09,790 Δεν υπάρχει καμία γραφική διεπαφή χρήστη ακόμα. 81 00:04:09,790 --> 00:04:13,340 Αλλά αυτό είναι κατανοητό γιατί είμαι κυριολεκτικά σε μία γραμμή στο πρόγραμμά μου. 82 00:04:13,340 --> 00:04:17,110 Και παρατηρήσετε ότι έχω γρήγορα προς τα εμπρός, ειδικά τώρα με 62, επειδή όλα 83 00:04:17,110 --> 00:04:20,600 τα πράγματα στην κορυφή αυτού του αρχείου είναι τα πράγματα όπως τα σχόλια και τις σταθερές και 84 00:04:20,600 --> 00:04:22,460 πληκτικός πράγματα για τώρα. 85 00:04:22,460 --> 00:04:25,840 >> Έτσι τώρα είμαι στο εσωτερικό της κύριας, φαίνεται, στη γραμμή 62. 86 00:04:25,840 --> 00:04:27,960 Και αυτό είναι μόνο η διανομή κώδικα, ανάκληση. 87 00:04:27,960 --> 00:04:33,810 Αν ανοίξω αυτό επάνω με τη μετάβαση, ομοίως, σε κατάλογο κουτί πτώση μου σε Pst4, 88 00:04:33,810 --> 00:04:35,450 σε breakout.c. 89 00:04:35,450 --> 00:04:40,670 Και αν μετακινηθείτε προς τα κάτω και προς τα κάτω και προς τα κάτω, και επιτρέψτε μου να πάει μπροστά και να ενεργοποιήσετε 90 00:04:40,670 --> 00:04:44,990 αριθμοί γραμμή μου. 91 00:04:44,990 --> 00:04:50,300 >> Αυτό που θα δείτε, αν μετακινηθείτε προς τα κάτω για να γραμμής 62, είναι ακριβώς η γραμμή που 92 00:04:50,300 --> 00:04:50,910 έχουμε παύση του. 93 00:04:50,910 --> 00:04:53,720 Έτσι, αυτή η γραμμή εδώ, 62, είναι όπου είμαστε έτοιμοι να είναι. 94 00:04:53,720 --> 00:04:57,470 Έτσι τώρα το GDB, αν πάω μπροστά και πληκτρολογήστε τώρα το επόμενο, εισάγετε πρόκειται να 95 00:04:57,470 --> 00:04:58,450 εκτελέσει αυτή τη γραμμή. 96 00:04:58,450 --> 00:05:00,610 Και voila, έχουμε την λεγόμενο παράθυρο γρ. 97 00:05:00,610 --> 00:05:02,800 Αν δεν είναι εξοικειωμένοι με αυτό που ένα GWindow είναι, για να μην ανησυχείτε. 98 00:05:02,800 --> 00:05:05,740 Το spec θα σας παρουσιάσουμε σε αυτό, όπως καθώς και μια σειρά από βίντεο περιδιάβαση 99 00:05:05,740 --> 00:05:06,830 ενσωματωμένο στο spec. 100 00:05:06,830 --> 00:05:08,610 >> Αλλά τώρα ας κάνουν αυτό ένα λίγο πιο ενδιαφέρουσα. 101 00:05:08,610 --> 00:05:10,960 Επιτρέψτε μου να περάσω αυτό το παράθυρο πάνω προς την πλευρά λίγο. 102 00:05:10,960 --> 00:05:13,480 Επιτρέψτε μου να κάνω το παράθυρο λίγο μεγαλύτερο έτσι μπορώ να δω περισσότερα. 103 00:05:13,480 --> 00:05:16,140 >> Και τώρα επιτρέψτε μου να πάμε μπροστά και να κάνετε στη συνέχεια και πάλι. 104 00:05:16,140 --> 00:05:17,550 Και υπάρχουν τούβλα μου. 105 00:05:17,550 --> 00:05:20,490 Αν μου πληκτρολογήσετε στη συνέχεια και πάλι τώρα βλέπω την μπάλα. 106 00:05:20,490 --> 00:05:23,520 Και αν πληκτρολογήσετε στη συνέχεια και πάλι τώρα βλέπω το κουπί. 107 00:05:23,520 --> 00:05:26,690 >> Και ευτυχώς αυτό gedit δεν είναι πραγματικά συνεργάζεται με την επίδειξη μου 108 00:05:26,690 --> 00:05:27,660 ό, τι θέλω. 109 00:05:27,660 --> 00:05:30,820 Αλλά τώρα αν κάνω το επόμενο και πάλι, επόμενη φορά, είμαι απλά 110 00:05:30,820 --> 00:05:32,260 με την οποία ορισμένες μεταβλητές. 111 00:05:32,260 --> 00:05:34,750 Και μπορώ να εκτυπώσετε οποιοδήποτε από αυτά τα παιδιά έξω. 112 00:05:34,750 --> 00:05:37,170 Τούβλα εκτύπωσης, εκτυπώσεις ζωές. 113 00:05:37,170 --> 00:05:39,910 >> Και τώρα αν συνεχίζω να κάνω Στη συνέχεια, παρατηρούμε ότι θα είμαι 114 00:05:39,910 --> 00:05:40,870 στο εσωτερικό του εν λόγω βρόχου. 115 00:05:40,870 --> 00:05:43,380 Αλλά ο κώδικας πρόκειται να εκτελέσει ακριβώς όπως περιμένω. 116 00:05:43,380 --> 00:05:45,810 Έτσι, όταν χτύπησα αυτή τη λειτουργία, περιμένετε Κάντε κλικ για, πρόκειται να κάνει 117 00:05:45,810 --> 00:05:46,830 κυριολεκτικά αυτό. 118 00:05:46,830 --> 00:05:48,870 Γι 'αυτό και φάνηκε να έχουν χάσει τον έλεγχο πάνω από το πρόγραμμα. 119 00:05:48,870 --> 00:05:50,480 >> GDB δεν μου δίνει μια άλλη ερώτηση. 120 00:05:50,480 --> 00:05:51,500 Αλλά μην ανησυχείτε. 121 00:05:51,500 --> 00:05:53,720 Πηγαίνετε στο παιχνίδι μου, κάντε κλικ κάπου. 122 00:05:53,720 --> 00:05:56,270 >> Και ιδού, τώρα προχωρά στη γραμμή 86. 123 00:05:56,270 --> 00:05:59,460 Έτσι και πάλι, είναι ανεκτίμητη, σε τελική ανάλυση, για τα προβλήματα debugging. 124 00:05:59,460 --> 00:06:03,050 Επειδή δεν μπορείτε κυριολεκτικά να βγείτε από κωδικό σας, τα πράγματα εκτύπωση και πολύ, 125 00:06:03,050 --> 00:06:03,640 πολύ, περισσότερο. 126 00:06:03,640 --> 00:06:07,210 Αλλά για τώρα, αυτά τα εργαλεία μόνο θα πρέπει να έχετε αρκετά μακριά. 127 00:06:07,210 --> 00:06:10,050 >> Έτσι είμαστε, φυσικά, ρίχνοντας μια ματιά στα γραφικά τώρα, ξαφνικά. 128 00:06:10,050 --> 00:06:12,350 Και τώρα ο κόσμος μας παίρνει λίγο πιο ενδιαφέρουσα. 129 00:06:12,350 --> 00:06:15,680 Και ξέρετε, ίσως, από κάποιες από τις βίντεο σε απευθείας σύνδεση που έχουμε αυτά τα 130 00:06:15,680 --> 00:06:18,280 σορτς που έχετε προσέξει ως μέρος των συνόλων προβλήματος. 131 00:06:18,280 --> 00:06:20,460 >> Και να έχουν πυροβοληθεί, σκόπιμα, σε λευκό φόντο. 132 00:06:20,460 --> 00:06:23,380 Και μερικοί από αυτούς έχουν τη διδασκαλία Fellows αντλώντας κάποιο κείμενο σχετικά με την 133 00:06:23,380 --> 00:06:25,490 οθόνη που είναι υπέρθεση από την πλευρά τους. 134 00:06:25,490 --> 00:06:27,760 Αλλά φυσικά, αυτό δεν είναι όλα αυτά ενδιαφέρον στον πραγματικό κόσμο. 135 00:06:27,760 --> 00:06:30,520 Αυτό είναι απλά μια αίθουσα διαλέξεων με μεγάλη λευκή οθόνη και ένα σκηνικό. 136 00:06:30,520 --> 00:06:33,330 Και την απίστευτη ομάδα μας παραγωγής της κάνει όλα να φαίνονται όμορφα 137 00:06:33,330 --> 00:06:36,620 μετά το γεγονός με περικοπή out επικάλυψη ή τίποτα 138 00:06:36,620 --> 00:06:37,840 κάνουμε ή δεν θέλουν. 139 00:06:37,840 --> 00:06:41,560 >> Τώρα απλά να παρακινήσει αυτή την εβδομάδα και Πραγματικά, όπου μπορείτε να πάτε, σε τελική ανάλυση, 140 00:06:41,560 --> 00:06:42,560 με την επιστήμη των υπολογιστών. 141 00:06:42,560 --> 00:06:44,260 Όχι μόνο μετά από το πρόβλημα που έχει τέσσερις. 142 00:06:44,260 --> 00:06:48,240 Αλλά μετά το άλλο μάθημα ή μια ολόκληρη πρόγραμμα σπουδών είναι καταπληκτικό το τι μπορείτε να κάνετε 143 00:06:48,240 --> 00:06:51,090 κάνει αυτές τις μέρες από την άποψη της γραφικών ειδικότερα. 144 00:06:51,090 --> 00:06:53,440 >> Κάποιοι από εσάς μπορεί να έχετε δει αυτό ρέει γύρω σε απευθείας σύνδεση. 145 00:06:53,440 --> 00:06:56,240 Αλλά σκέφτηκα να σας δείξω, μόνο για ένα λίγα λεπτά, μια γεύση από το τι 146 00:06:56,240 --> 00:07:01,890 τεχνολογία των υπολογιστών και τι CGI, γραφικά υπολογιστών μπορεί να κάνει αυτές τις μέρες 147 00:07:01,890 --> 00:07:04,510 με ένα γνωστό τραγούδι και ίσως ταινία. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Η νεαρή και όμορφη] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ΟΜΙΛΗΤΗΣ 1: Είναι λίγο εκπληκτικό, ίσως, πόσο 151 00:10:52,470 --> 00:10:52,857 πανταχού παρούσα - 152 00:10:52,857 --> 00:10:57,040 >> [Χειροκρότημα] 153 00:10:57,040 --> 00:10:59,230 >> ΟΜΙΛΗΤΗΣ 1: Έχω κατεβάσει απλά. 154 00:10:59,230 --> 00:11:02,920 Αλλά είναι πραγματικά εκπληκτικό, νομίζω, απλά Πώς πανταχού παρών λογισμικού και κώδικα και 155 00:11:02,920 --> 00:11:04,230 εργαλεία όπως αυτό πραγματικά είναι. 156 00:11:04,230 --> 00:11:07,685 Έτσι, αυτό είναι μια γεύση από την κατεύθυνση στο οποίο μπορείτε να πάτε. 157 00:11:07,685 --> 00:11:10,620 Ω, όχι περισσότερο Appliance σήμερα. 158 00:11:10,620 --> 00:11:14,640 Λοιπόν, αυτό είναι πραγματικά τραγικό το χρονοδιάγραμμα δίνεται το σημείο εγώ απλά προσπάθησα να κάνω. 159 00:11:14,640 --> 00:11:18,670 >> Εντάξει, ας ξεκινήσει Fusion και πάλι. 160 00:11:18,670 --> 00:11:20,800 Υπενθύμιση αργότερα. 161 00:11:20,800 --> 00:11:24,190 Εντάξει, και θα πρέπει να έχεις ένα e-mail ως ένα μέρος, αν είχε πάρει ένα 162 00:11:24,190 --> 00:11:25,460 παρατηρήσετε έτσι. 163 00:11:25,460 --> 00:11:29,940 Εντάξει, έτσι Υπενθυμίζεται ότι την περασμένη εβδομάδα αρχίσαμε να φλούδα πίσω αυτό 164 00:11:29,940 --> 00:11:31,380 αργότερα γνωστό ως string. 165 00:11:31,380 --> 00:11:34,700 >> εγχόρδων υπενθυμίζει έναν τύπο δεδομένων που είναι δηλωθεί στη βιβλιοθήκη CS50. 166 00:11:34,700 --> 00:11:37,740 Και αυτό είναι μέρος των ρόδες που θα αρχίσει τώρα να απογειωθεί. 167 00:11:37,740 --> 00:11:41,280 Ήταν μια χρήσιμη έννοια νωρίς. 168 00:11:41,280 --> 00:11:43,750 Αλλά τώρα πρόκειται να πάρει περισσότερο ενδιαφέρουσα και πιο ισχυρή για να 169 00:11:43,750 --> 00:11:48,330 πραγματικά να δείτε ότι κάτω από το καπό, ένα string είναι ακριβώς αυτό, δεν είπαμε; 170 00:11:48,330 --> 00:11:50,500 >> Ναι, έτσι είναι το λεγόμενο char *. 171 00:11:50,500 --> 00:11:53,860 Και η * εκεί σημαίνει ότι υπάρχει κάποια διεύθυνση που εμπλέκονται. 172 00:11:53,860 --> 00:11:58,690 Και έτσι όταν λέτε char * απλά σημαίνει μια μεταβλητή του οποίου ο τύπος δεδομένων είναι ένα 173 00:11:58,690 --> 00:11:59,290 pointer τώρα. 174 00:11:59,290 --> 00:12:01,770 Το γεγονός ότι υπάρχει το αστέρι εκεί απλά σημαίνει ότι είστε με την οποία μια 175 00:12:01,770 --> 00:12:03,020 λεγόμενη δείκτη. 176 00:12:03,020 --> 00:12:06,220 Και αυτό δείκτη πρόκειται να φαινομενικά αποθηκεύσετε τη διεύθυνση, του 177 00:12:06,220 --> 00:12:07,810 Φυσικά, μια χαρα. 178 00:12:07,810 --> 00:12:08,960 >> Τώρα γιατί αυτό το νόημα; 179 00:12:08,960 --> 00:12:11,200 Λοιπόν, αυτό είναι ένα string κάτω από την κουκούλα; 180 00:12:11,200 --> 00:12:15,130 Λοιπόν, εδώ και αρκετό καιρό έχουμε πει ότι μια σειρά κάτω από το καπό είναι 181 00:12:15,130 --> 00:12:18,460 μόλις h-E-L-L-O, για παράδειγμα. 182 00:12:18,460 --> 00:12:21,585 >> Αλλά έχουμε μιλήσει για αυτό, όπως είναι, ουσιαστικά, μια σειρά. 183 00:12:21,585 --> 00:12:25,410 Και μια σειρά θα δούμε στη συνέχεια, λίγο περισσότερο όπως αυτό, με κάθε μία από αυτές 184 00:12:25,410 --> 00:12:26,460 ανάληψη μια μπουκιά. 185 00:12:26,460 --> 00:12:28,710 Και τότε έχουμε πει ότι υπάρχει κάτι το ιδιαίτερο πίσω εδώ, η 186 00:12:28,710 --> 00:12:31,270 backslash 0 ή null τερματισμού. 187 00:12:31,270 --> 00:12:35,230 >> Έτσι, όλο αυτό το διάστημα, αυτό εδώ υπήρξε ένα string. 188 00:12:35,230 --> 00:12:38,320 Αλλά πραγματικά, ένα string είναι στην πραγματικότητα μια διεύθυνση. 189 00:12:38,320 --> 00:12:43,210 Και διευθύνσεις, όπως θα δούμε, είναι συχνά πρόθεμα 0x κατά συνθήκη. 190 00:12:43,210 --> 00:12:44,540 Τι σημαίνει 0x δηλώνουν; 191 00:12:44,540 --> 00:12:45,970 Ξέρει κανείς; 192 00:12:45,970 --> 00:12:47,320 >> Έτσι, αυτό σημαίνει απλώς δεκαεξαδικό. 193 00:12:47,320 --> 00:12:52,360 Έτσι, μπορείτε να θυμάστε, στην πραγματικότητα, από PST 1, πιστεύω, ένας από τους προθέρμανσης 194 00:12:52,360 --> 00:12:55,740 ερωτήσεις στην πραγματικότητα ρώτησε για δεκαεξαδικό συμβολισμό πέραν 195 00:12:55,740 --> 00:12:57,100 δυαδικό και δεκαδικό. 196 00:12:57,100 --> 00:13:00,460 Και το κίνητρο εδώ είναι ότι με δεκαεξαδικό έχετε 16 197 00:13:00,460 --> 00:13:01,770 ψηφία στη διάθεσή σας. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ακολουθούμενη από α, β, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Και αν υπολογίσουμε όλα αυτά επάνω, μπορείτε να πάρετε ένα σύνολο 16. 200 00:13:10,430 --> 00:13:13,200 Έτσι, αυτό είναι σε αντίθεση με τις δεκαδικό, όπου έχουμε 10 201 00:13:13,200 --> 00:13:14,690 ψηφία 0 έως εννέα. 202 00:13:14,690 --> 00:13:17,750 Είναι σε αντίθεση με το δυαδικό όπου έχουμε μόνο 0 και 1. 203 00:13:17,750 --> 00:13:21,450 >> Αλλά στο τέλος της ημέρας μπορείτε απλά αντιπροσωπεύουν τους ίδιους αριθμούς, αλλά 204 00:13:21,450 --> 00:13:22,500 κάπως διαφορετικά. 205 00:13:22,500 --> 00:13:25,840 Και δεκαεξαδικό είναι κοινή, επειδή, όπως αποδεικνύεται - και θα δούμε αυτό 206 00:13:25,840 --> 00:13:28,790 αργότερα κατά την πορεία - ακόμα και όταν παίρνουμε για web προγραμματισμό στο πλαίσιο της 207 00:13:28,790 --> 00:13:32,100 HTML και τους χρωματικούς κώδικες, δεκαεξαδικό είναι ωραίο. 208 00:13:32,100 --> 00:13:36,390 Επειδή κάθε ψηφίο, αποδεικνύεται ότι, αντιπροσωπεύει τέσσερα κομμάτια τέλεια. 209 00:13:36,390 --> 00:13:39,280 Γι 'αυτό ακριβώς το είδος των γραμμών επάνω ωραία όπως θα δούμε τελικά. 210 00:13:39,280 --> 00:13:44,720 Έτσι, αυτό θα μπορούσε να είναι Ox123 ή κάτι όπως αυτό, που δηλώνει 123 διεύθυνση 211 00:13:44,720 --> 00:13:47,050 κάπου μέσα μου μνήμη του υπολογιστή. 212 00:13:47,050 --> 00:13:50,600 >> Αλλά φυσικά, προκύπτουν ορισμένα προβλήματα εξαιτίας αυτού του υποκείμενου 213 00:13:50,600 --> 00:13:51,520 εφαρμογή. 214 00:13:51,520 --> 00:13:55,930 Και υπενθυμίζουν ότι πήρα μια μαχαιριά στο εφαρμογή μια λειτουργία όπως αυτό - 215 00:13:55,930 --> 00:14:00,260 συγκρίνουν παύλα 0 dot γ περασμένη εβδομάδα, ότι ακόμα κι αν φαινόταν σαν να ήταν 216 00:14:00,260 --> 00:14:04,270 Εντάξει, απλά δεν συγκρίνετε δύο χορδές σωστά. 217 00:14:04,270 --> 00:14:07,470 >> Έχω πετάξει κύρια, και έχω ρίξει μακριά τα σχόλια μόνο για να επικεντρωθεί η προσοχή στα 218 00:14:07,470 --> 00:14:08,970 ο κώδικας που μας ενδιαφέρουν εδώ. 219 00:14:08,970 --> 00:14:10,660 Και είναι στο κόκκινο, γιατί είναι λάθη. 220 00:14:10,660 --> 00:14:11,670 Για ποιο λόγο; 221 00:14:11,670 --> 00:14:15,890 >> Λοιπόν, στην κορυφή εκεί όταν δήλωσα ένα string, τι πραγματικά συμβαίνει 222 00:14:15,890 --> 00:14:17,260 κάτω από την κουκούλα; 223 00:14:17,260 --> 00:14:19,530 Λοιπόν, επιτρέψτε μου να πάω στο οθόνη εδώ και σχεδιάστε αυτό. 224 00:14:19,530 --> 00:14:23,230 Γι 'αυτό και δήλωσε, και πάλι, GetString συμβολοσειράς s. 225 00:14:23,230 --> 00:14:26,640 >> Έτσι, Πάω να προχωρήσει τώρα και επιστήσει s για το τι είναι πραγματικά. 226 00:14:26,640 --> 00:14:28,590 Είναι πρόκειται να είναι ένα τετράγωνο εδώ. 227 00:14:28,590 --> 00:14:30,490 Και Πάω να διεκδικήσει ότι είναι 32 bits. 228 00:14:30,490 --> 00:14:32,890 Τουλάχιστον είναι συνήθως, τουλάχιστον για το CS50 229 00:14:32,890 --> 00:14:34,520 συσκευή σε πολλούς υπολογιστές. 230 00:14:34,520 --> 00:14:35,980 Πάω να το ονομάσουμε s. 231 00:14:35,980 --> 00:14:39,070 >> Τώρα, όμως, υπενθυμίζουν ότι ονομάζεται GetString. 232 00:14:39,070 --> 00:14:41,430 Έτσι GetString αποδόσεις, φυσικά, μια συμβολοσειρά. 233 00:14:41,430 --> 00:14:45,790 Εάν ο χρήστης πληκτρολογήσει στο h-e-l-l-o εισάγετε η σειρά Hello παίρνει επέστρεψε. 234 00:14:45,790 --> 00:14:51,010 Και αυτή η σειρά, όπως μόλις είπε, τελειώνει κάπου στη μνήμη του υπολογιστή σας 235 00:14:51,010 --> 00:14:53,240 με 0 κάθετος στο τέλος. 236 00:14:53,240 --> 00:14:56,650 Θα τραβήξω αυτό, όπως του πίνακα - ή συνεχόμενο μπλοκ των χαρακτήρων - 237 00:14:56,650 --> 00:14:58,330 ότι είναι στην πραγματικότητα. 238 00:14:58,330 --> 00:15:01,790 >> Και τώρα, τι GetString η ίδια η επιστροφή; 239 00:15:01,790 --> 00:15:04,340 Τι έχει GetString έχει επιστροφή όλο αυτό το διάστημα; 240 00:15:04,340 --> 00:15:07,520 Λοιπόν, ας πούμε, σε εβδομάδες πριν, επιστρέφει ένα string. 241 00:15:07,520 --> 00:15:10,250 Αλλά πιο τεχνικά, τι κάνει GetString επιστροφή προφανώς; 242 00:15:10,250 --> 00:15:11,610 >> ΚΟΙΝΟ: Μία διεύθυνση. 243 00:15:11,610 --> 00:15:12,600 >> ΟΜΙΛΗΤΗΣ 1: Μία διεύθυνση. 244 00:15:12,600 --> 00:15:16,630 Συγκεκριμένα επιστρέφει τη διεύθυνση της την πρώτη κιόλας μπουκιά, όποια και αν είναι. 245 00:15:16,630 --> 00:15:18,830 Απλά συνεχίζω να χρησιμοποιείτε ένα, δύο, τρία επειδή είναι βολικό. 246 00:15:18,830 --> 00:15:21,380 >> Επιστρέφει τη διεύθυνση του πρώτου χαρακτήρα της συμβολοσειράς. 247 00:15:21,380 --> 00:15:23,510 Και είπαμε την περασμένη εβδομάδα ότι ότι είναι επαρκής. 248 00:15:23,510 --> 00:15:26,710 Επειδή δεν μπορούμε πάντα να καταλάβω πού το τέλος του string μόνο από 249 00:15:26,710 --> 00:15:30,150 επανάληψη πάνω από αυτό, ίσως, με ένα για loop ή βρόχος while ή κάτι τέτοιο 250 00:15:30,150 --> 00:15:34,990 ότι, απλά ψάχνουν για "backslash 0", ο ειδικός χαρακτήρας δεικτών. 251 00:15:34,990 --> 00:15:37,220 >> Και τότε γνωρίζουμε ότι η σειρά συμβαίνει να είναι μήκους - 252 00:15:37,220 --> 00:15:37,980 σε αυτή την περίπτωση - 253 00:15:37,980 --> 00:15:38,670 πέντε. 254 00:15:38,670 --> 00:15:43,800 Έτσι, από τεχνική GetString τι κάνει είναι ότι επιστρέφει Ox123 σε αυτή την περίπτωση. 255 00:15:43,800 --> 00:15:53,670 Και τεχνικά τότε τι συμβαίνει είναι που αποθηκεύουμε, στο εσωτερικό του s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Στο τέλος της ημέρας, έστω και αν αυτό είναι νέα έννοια, δείκτες, είναι 257 00:15:56,460 --> 00:15:57,350 μόνο μεταβλητές. 258 00:15:57,350 --> 00:16:00,440 Αλλά τυχαίνει να αποθηκεύουν bits που συλλογικά αντιπροσωπεύουν μια διεύθυνση. 259 00:16:00,440 --> 00:16:03,700 Έτσι, τεχνικά όλα αυτά παίρνει αποθηκεύονται σε s είναι Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Αλλά εμείς ως άνθρωποι - 261 00:16:04,680 --> 00:16:06,020 συμπεριλαμβανομένης της περαιτέρω σήμερα - 262 00:16:06,020 --> 00:16:09,290 δεν είναι πραγματικά πρόκειται για τη φροντίδα, συνήθως, ποια είναι η πραγματική διεύθυνση είναι 263 00:16:09,290 --> 00:16:10,520 από κάποιο κομμάτι της μνήμης. 264 00:16:10,520 --> 00:16:14,040 Είναι απλά σε χαμηλό επίπεδο λεπτομέρειας που να είναι διανοητικά ενδιαφέρον. 265 00:16:14,040 --> 00:16:15,440 Έτσι, Πάω να αναιρέσετε αυτό. 266 00:16:15,440 --> 00:16:19,810 Και αντ 'αυτού, πιο υψηλό επίπεδο, απλά να πω ότι όταν μιλάμε για δείκτες 267 00:16:19,810 --> 00:16:22,170 Πάω να επιστήσω λίγο περισσότερο φιλικό προς το χρήστη βέλος που μεταφέρει το 268 00:16:22,170 --> 00:16:26,060 ίδια ιδέα και αποσπάσματα μακριά τα στοιχεία ποια είναι η πραγματική 269 00:16:26,060 --> 00:16:27,700 υποκείμενη διεύθυνση είναι. 270 00:16:27,700 --> 00:16:33,290 >> Τώρα αν πάμε πίσω στον κώδικα, ό, τι συνέβη την περασμένη εβδομάδα, αν έχουμε σειρά t 271 00:16:33,290 --> 00:16:34,510 ισούται με GetString; 272 00:16:34,510 --> 00:16:38,630 Λοιπόν, αν και πάλι, πληκτρολογήστε γεια αυτή τη φορά είμαι πρόκειται να πάρει 273 00:16:38,630 --> 00:16:40,460 ένα άλλο κομμάτι της μνήμης. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Αλλά επειδή κάλεσα GetString μια δεύτερη φορά - 276 00:16:48,320 --> 00:16:51,100 και το ξέρω από την εξέταση των πηγαίο κώδικα για GetString - ακόμη 277 00:16:51,100 --> 00:16:54,350 αν είναι τυχαίο ότι ήταν γεια πληκτρολογήσετε δύο φορές, GetString δεν είναι 278 00:16:54,350 --> 00:16:55,890 πρόκειται να προσπαθήσει να βελτιστοποιήσει και να είσαι έξυπνος. 279 00:16:55,890 --> 00:16:58,550 Είναι ακριβώς πρόκειται να πάρει ένα άλλο κομμάτι της μνήμης από τον υπολογιστή, το οποίο είναι 280 00:16:58,550 --> 00:16:59,640 πρόκειται να είναι σε άλλη διεύθυνση. 281 00:16:59,640 --> 00:17:02,330 Ας πούμε αυθαίρετα μόνο 456. 282 00:17:02,330 --> 00:17:04,079 >> Και τότε τι είναι αυτό πρόκειται να επιστρέψει; 283 00:17:04,079 --> 00:17:08,030 Είναι πρόκειται να επιστρέψει 456 και αποθηκεύστε το σε t. 284 00:17:08,030 --> 00:17:12,010 Έτσι, αυτό που πραγματικά συμβαίνει, σχετικά με την αριστερή πλευρά είναι ότι έχω ένα άλλο κομμάτι 285 00:17:12,010 --> 00:17:14,260 της μνήμης, τυπικά 32 bits. 286 00:17:14,260 --> 00:17:16,720 Και εκεί πρόκειται να πάει Ox456. 287 00:17:16,720 --> 00:17:20,140 Αλλά και πάλι, δεν είμαι ενδιαφέρονται για αυτά συγκεκριμένα νούμερα πια. 288 00:17:20,140 --> 00:17:23,069 Είμαι ακριβώς πρόκειται να αφηρημένα συντάξει ως ένα βέλος. 289 00:17:23,069 --> 00:17:25,202 >> Έτσι, αυτό είναι τώρα μια νέα εξήγηση. 290 00:17:25,202 --> 00:17:28,735 Αλλά είναι η ίδια ακριβώς ιδέα που είναι συμβαίνει όλο αυτό το διάστημα. 291 00:17:28,735 --> 00:17:33,150 Και έτσι το λόγο λοιπόν, ότι αυτή η πρώτη έκδοση της σύγκρισης ήταν buggy 292 00:17:33,150 --> 00:17:34,480 την περασμένη εβδομάδα είναι ο λόγος; 293 00:17:34,480 --> 00:17:38,000 Όταν το κάνετε, αν s ισούται ισούται t τι είσαι πραγματικά 294 00:17:38,000 --> 00:17:40,550 κάτω από την κουκούλα σύγκριση; 295 00:17:40,550 --> 00:17:41,910 >> Είσαι συγκρίνοντας τις διευθύνσεις. 296 00:17:41,910 --> 00:17:47,950 Και μόνο διαισθητικά, με σαφήνεια, Ox123 δεν πρόκειται να ισούται Ox456. 297 00:17:47,950 --> 00:17:49,380 Αυτοί οι αριθμοί, αυτά τα δυαδικά ψηφία είναι απλώς διαφορετικά. 298 00:17:49,380 --> 00:17:53,220 >> Και έτσι με συνέπεια, την περασμένη εβδομάδα, δήλωσε πληκτρολογήσετε διαφορετικά πράγματα, ακόμη και αν η 299 00:17:53,220 --> 00:17:55,360 λόγια ήταν αυτολεξεί η ίδια. 300 00:17:55,360 --> 00:17:58,770 Γι 'αυτό το διορθώσω αυτό. 301 00:17:58,770 --> 00:18:00,120 Με άλλα λόγια, ποια ήταν η λύση; 302 00:18:00,120 --> 00:18:02,110 >> ΚΟΙΝΟ: Χρησιμοποιήστε μια λειτουργία. 303 00:18:02,110 --> 00:18:02,870 >> ΟΜΙΛΗΤΗΣ 1: Χρησιμοποιήστε μια λειτουργία. 304 00:18:02,870 --> 00:18:05,190 Ή αστέρων είναι σίγουρα εμπλέκονται, αλλά χρησιμοποιούν μια λειτουργία για να κάνει τι; 305 00:18:05,190 --> 00:18:05,962 >> ΚΟΙΝΟ: Για να συγκρίνετε τις χορδές. 306 00:18:05,962 --> 00:18:07,390 >> ΟΜΙΛΗΤΗΣ 1: Για να συγκρίνετε τις χορδές. 307 00:18:07,390 --> 00:18:11,030 Έτσι, το βασικό πρόβλημα εδώ ήταν ότι θα εξέταζε μόνο το 308 00:18:11,030 --> 00:18:15,870 ποιότητα των strings που ορίζονται από σύγκριση διευθύνσεις τους. 309 00:18:15,870 --> 00:18:18,540 Και προφανώς αυτό είναι απλά ηλίθιος τώρα για άλλη μια μπορείτε να καταλάβετε τι συμβαίνει 310 00:18:18,540 --> 00:18:19,510 κάτω από το καπό. 311 00:18:19,510 --> 00:18:23,270 Για να συγκρίνετε πραγματικά χορδές για να δείτε αν ότι είναι ίση με τον τρόπο που ένας άνθρωπος 312 00:18:23,270 --> 00:18:26,680 θα εξετάσει δύο χορδές να είναι ίση θα πρέπει να συγκρίνουμε τους χαρακτήρα 313 00:18:26,680 --> 00:18:28,070 χαρακτήρα για τον χαρακτήρα. 314 00:18:28,070 --> 00:18:30,020 >> Τώρα θα μπορούσα να έχω κάνει αυτό το πολύ κουραστικά. 315 00:18:30,020 --> 00:18:32,240 Αλλά οικεία, είμαστε χρησιμοποιώντας ένα for loop. 316 00:18:32,240 --> 00:18:36,050 Και συγκρίνει μόνο s βραχίονα i εναντίον t βραχίονα i. 317 00:18:36,050 --> 00:18:39,590 s βραχίονα i συν 1 κατά τ βραχίονα Ι συν 1, και ούτω καθεξής, στο εσωτερικό 318 00:18:39,590 --> 00:18:40,580 κάποιο είδος βρόχου. 319 00:18:40,580 --> 00:18:44,950 Και αν εντοπίσετε οποιαδήποτε δύο χαρακτήρες που διαφέρουν, ή αν αντιλαμβάνομαι ότι ooh, s είναι 320 00:18:44,950 --> 00:18:48,410 μικρότερη από t ή περισσότερο από ό, τι t Μπορώ να πω αμέσως ψευδή, 321 00:18:48,410 --> 00:18:49,390 δεν είναι το ίδιο. 322 00:18:49,390 --> 00:18:55,370 >> Αλλά αν πάρω μέσω s και t και να πω ίδιο, το ίδιο, το ίδιο, το ίδιο, το ίδιο, τέλος 323 00:18:55,370 --> 00:18:58,520 δύο χορδές, μπορώ να πω αλήθεια, είναι ίσες. 324 00:18:58,520 --> 00:19:01,040 Λοιπόν, ευτυχώς, πριν από χρόνια κάποιος έγραψε τον κώδικα για εμάς. 325 00:19:01,040 --> 00:19:03,790 >> Και ονόμασαν StrComp για σύγκρισης συμβολοσειράς. 326 00:19:03,790 --> 00:19:11,900 Και ακόμα κι αν είναι ένα μικρό μετρητή διαισθητική, StrComp επιστρέφει 0 αν αυτά 327 00:19:11,900 --> 00:19:14,520 δύο χορδές, s και t είναι τα ίδια. 328 00:19:14,520 --> 00:19:18,090 Αλλά επιστρέφει αρνητική αξία, αν s θα πρέπει να έρθει πριν από t αλφαβητικά ή 329 00:19:18,090 --> 00:19:20,610 θετική τιμή, εάν θα πρέπει να έρχονται μετά από t αλφαβητικά. 330 00:19:20,610 --> 00:19:24,030 >> Έτσι, αν ποτέ θέλετε να ταξινομήσετε κάτι, αποδεικνύεται ότι StrComp είναι χρήσιμη. 331 00:19:24,030 --> 00:19:26,660 Επειδή δεν έχει μόνο να πω ναι ή όχι, ίσα ή όχι. 332 00:19:26,660 --> 00:19:30,440 Σας δίνει την αίσθηση της παραγγελίας σαν μια δύναμη λεξικό. 333 00:19:30,440 --> 00:19:33,770 Έτσι StrComp, s κόμμα t ισούται είναι ίσο με 0 σημαίνει ότι η 334 00:19:33,770 --> 00:19:35,200 χορδές είναι πραγματικά ίσες. 335 00:19:35,200 --> 00:19:38,680 Διότι όποιος έγραψε αυτή τη λειτουργία χρόνια χρησιμοποιούνται πιθανώς ένα for loop 336 00:19:38,680 --> 00:19:42,840 ή ένα βρόχο, ενώ ή κάτι τέτοιο να ενσωματώσει πάνω από τους χαρακτήρες και πάλι 337 00:19:42,840 --> 00:19:45,270 και ξανά και ξανά. 338 00:19:45,270 --> 00:19:47,300 >> Αλλά δύο πρόβλημα προέκυψε εδώ. 339 00:19:47,300 --> 00:19:48,750 Αυτό ήταν copy0.c. 340 00:19:48,750 --> 00:19:51,680 Και οι δύο είναι στο κόκκινο γιατί είναι εσφαλμένη. 341 00:19:51,680 --> 00:19:52,800 Και τι κάνουμε εδώ; 342 00:19:52,800 --> 00:19:54,310 Λοιπόν, πρώτα κάλεσα GetString. 343 00:19:54,310 --> 00:19:56,255 Και εγώ αποθηκευμένη την τιμή επιστροφής s. 344 00:19:56,255 --> 00:20:00,260 Έτσι, αυτό είναι λίγο πολύ η ίδια με Αυτό το άνω μέρος της εικόνας. 345 00:20:00,260 --> 00:20:01,490 >> Αλλά αυτό που έρχεται μετά από αυτό; 346 00:20:01,490 --> 00:20:04,980 Λοιπόν, επιτρέψτε μου να πάει μπροστά και να απαλλαγούμε σε ένα σωρό από αυτό. 347 00:20:04,980 --> 00:20:09,650 Θα τα πίσω στο χρόνο για να όπου απλά έχουν s, η οποία είναι συνεπής με τώρα 348 00:20:09,650 --> 00:20:10,940 μία γραμμή εκεί. 349 00:20:10,940 --> 00:20:11,400 >> Μπορώ να ελέγξω. 350 00:20:11,400 --> 00:20:13,450 Αν S είναι ίση με 0. 351 00:20:13,450 --> 00:20:18,670 Τώρα, μια γρήγορη σημείωση, όταν μπορεί να GetString επιστροφή 0? 352 00:20:18,670 --> 00:20:19,580 Δεν υπάρχει αρκετή μνήμη. 353 00:20:19,580 --> 00:20:19,880 Σωστά; 354 00:20:19,880 --> 00:20:22,310 >> Είναι σπάνιο ότι αυτή η μετάβαση είναι να συμβεί, σίγουρα σε έναν υπολογιστή που είναι 355 00:20:22,310 --> 00:20:24,740 πήρε εκατοντάδες megs ή ακόμα συναυλίες της μνήμης RAM. 356 00:20:24,740 --> 00:20:27,080 Αλλά θα μπορούσε, θεωρητικά, να επιστρέψει 0, ειδικά αν η 357 00:20:27,080 --> 00:20:28,080 χρήστης δεν συνεργάζεται. 358 00:20:28,080 --> 00:20:31,640 Υπάρχουν τρόποι για να προσποιούνται σαν να μην έχουν εισηγμένο τίποτα και τέχνασμα 359 00:20:31,640 --> 00:20:34,100 GetString στην επιστροφή 0 αποτελεσματικά. 360 00:20:34,100 --> 00:20:35,470 >> Έτσι, πρόκειται να ελέγξει για αυτό. 361 00:20:35,470 --> 00:20:39,430 Διότι, αν κάποιος από εσάς έχουν αρχίσει να πάρει, ήδη, σφάλματα κατάτμησης - 362 00:20:39,430 --> 00:20:42,280 το οποίο είναι πιθανώς μια πηγή από κάποια απογοήτευση - 363 00:20:42,280 --> 00:20:46,150 αυτά είναι σχεδόν πάντα το αποτέλεσμα της μνήμης σχετίζονται με το σφάλμα. 364 00:20:46,150 --> 00:20:50,440 Κάπως μπέρδεμα πάνω σε σχέση με ένα pointer, ακόμα κι αν δεν έχετε συνειδητοποιήσει 365 00:20:50,440 --> 00:20:51,530 υπήρχε ένα δείκτη. 366 00:20:51,530 --> 00:20:55,260 Έτσι, μπορεί να έχετε προκαλείται κατάτμηση βλάβες το ταχύτερο μία εβδομάδα χρησιμοποιώντας 367 00:20:55,260 --> 00:21:02,100 κάτι σαν ένα για βρόχο ή λίγο βρόχο και μια σειρά από υπερβολικό 368 00:21:02,100 --> 00:21:05,900 παρελθόν από τα όρια της συστοιχίας ότι κάποια δηλώσατε, την εβδομάδα σε δύο 369 00:21:05,900 --> 00:21:06,690 ειδικότερα. 370 00:21:06,690 --> 00:21:09,220 >> Μπορεί να έχετε κάνει ακόμα το πρόβλημα έθεσε τέσσερις με Breakout. 371 00:21:09,220 --> 00:21:12,910 Ακόμα κι αν ίσως δεν έχουν δει τυχόν αστέρια στον κώδικα διανομής για 372 00:21:12,910 --> 00:21:17,410 Breakout, αποδεικνύεται ότι οι GRect και Goval και άλλα τέτοια πράγματα, 373 00:21:17,410 --> 00:21:19,650 αυτά είναι στην πραγματικότητα δείκτες κάτω από το καπό. 374 00:21:19,650 --> 00:21:23,430 >> Αλλά Stanford, όπως και εμείς, το είδος των δερμάτων που λεπτομέρεια, τουλάχιστον για τις βιβλιοθήκες 375 00:21:23,430 --> 00:21:26,540 σκοπούς, όπως και εμείς για έγχορδα και char *. 376 00:21:26,540 --> 00:21:30,060 Αλλά GRect και Goval και όλους εκείνους τα πράγματα εσείς είναι ή θα πρέπει να χρησιμοποιούν 377 00:21:30,060 --> 00:21:32,630 αυτή την εβδομάδα είναι τελικά διευθύνσεις μνήμης. 378 00:21:32,630 --> 00:21:33,650 Απλά δεν το γνωρίζουν. 379 00:21:33,650 --> 00:21:37,240 >> Έτσι δεν είναι περίεργο λοιπόν, ίσως, που μπορεί να σκοντάψει κάποια 380 00:21:37,240 --> 00:21:38,580 σφάλματα κατάτμησης. 381 00:21:38,580 --> 00:21:41,290 Αλλά αυτό που είναι ενδιαφέρον εδώ και τώρα, Εάν μετά τον έλεγχο για 0 ​​κάνουμε 382 00:21:41,290 --> 00:21:43,460 εγχόρδων t παίρνει s. 383 00:21:43,460 --> 00:21:44,690 Λοιπόν, επιτρέψτε μου να δηλώσω t. 384 00:21:44,690 --> 00:21:47,730 Πάω να το συντάξει ως ένα τετράγωνο, 32 bits, αποκαλούν t. 385 00:21:47,730 --> 00:21:49,740 Και τότε Πάω να κάνω παίρνει s. 386 00:21:49,740 --> 00:21:51,130 >> Λοιπόν, τι σημαίνει αυτό; 387 00:21:51,130 --> 00:21:53,280 Λοιπόν, είναι λίγο δύσκολο να σκεφτεί γι 'αυτό εικόνα σοφός. 388 00:21:53,280 --> 00:21:55,025 Αλλά ας σκεφτούμε τι υπάρχει μέσα του x; 389 00:21:55,025 --> 00:21:59,430 Τι είναι κυριολεκτικά μέσα σε αυτή τη μεταβλητή; 390 00:21:59,430 --> 00:22:01,500 Η Ox123 αξία. 391 00:22:01,500 --> 00:22:05,815 >> Έτσι, όταν λέω σειρά t παίρνει s, που απλά κυριολεκτικά σημαίνει πάρε τον αριθμό 392 00:22:05,815 --> 00:22:10,070 το s, η οποία είναι Ox123 και το βάζουμε Ox123. 393 00:22:10,070 --> 00:22:13,740 Ή εικονογραφικά, αν το είδος της αφηρημένης μακριά από εκείνη την λεπτομέρεια που έχει η 394 00:22:13,740 --> 00:22:16,600 αποτέλεσμα κυριολεκτικά να κάνει Αυτό, καθώς και. 395 00:22:16,600 --> 00:22:22,110 >> Έτσι τώρα, σκεφτείτε την περασμένη εβδομάδα, όταν προχωρήσαμε στην καπιταλιστική T. I 396 00:22:22,110 --> 00:22:23,800 έκανε T βραχίονα 0. 397 00:22:23,800 --> 00:22:27,150 Λοιπόν, T βραχίονα 0, ακόμα κι αν είναι ένα δείκτη, μπορείτε να το αντιμετωπίσουμε σαν 398 00:22:27,150 --> 00:22:29,220 Είναι μια σειρά, με ένα τετράγωνο σημειογραφία βραχίονα. 399 00:22:29,220 --> 00:22:31,550 >> Λοιπόν, πού είναι T βραχίονα 0; 400 00:22:31,550 --> 00:22:32,990 Λοιπόν, είναι η ώρα. 401 00:22:32,990 --> 00:22:36,800 Και έτσι, όταν χρησιμοποιείτε τη γραμμή του κώδικα, δύο άνω, η οποία είναι σε αυτό το γ type.h 402 00:22:36,800 --> 00:22:38,460 αρχείο κεφαλίδας, αυτό είναι όπου που έχει δηλωθεί. 403 00:22:38,460 --> 00:22:44,410 Είσαι κεφαλαιοποίηση αυτή H. Αλλά Φυσικά, αυτό είναι η ίδια ακριβώς ώρα που είναι 404 00:22:44,410 --> 00:22:46,540 εσωτερικό του s, να το πω έτσι. 405 00:22:46,540 --> 00:22:51,930 Και έτσι τώρα έχετε αλλάξει ή κεφαλαιοποιούνται τόσο το πρωτότυπο και το 406 00:22:51,930 --> 00:22:53,120 λεγόμενη αντιγραφής. 407 00:22:53,120 --> 00:22:56,620 Επειδή δεν έχετε κάνει ένα αντίγραφο στην τρόπο που ένας άνθρωπος θα ήθελε να είναι. 408 00:22:56,620 --> 00:22:59,710 >> Λοιπόν, τι ήταν η αποτύπωση εδώ, σε copy1.c την περασμένη εβδομάδα; 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Λειτουργίες, γι 'αυτό θα μπορούσε πραγματικά να αντιγράψτε το string. 411 00:23:05,580 --> 00:23:08,700 Και, ουσιαστικά ό, τι χρειαζόμαστε για να κάνει για να αντιγράψετε το string; 412 00:23:08,700 --> 00:23:12,070 >> Λοιπόν, σε αυτό το πράσινο έκδοση εδώ είμαι πρόκειται να κάνουμε αρκετά χαμηλό επίπεδο. 413 00:23:12,070 --> 00:23:14,260 Υπάρχουν πραγματικά λειτουργίες θα μπορούσε να βοηθήσει με αυτό. 414 00:23:14,260 --> 00:23:17,710 Αλλά το πιο βασικό ένα, και η πιο εξοικειωμένος είναι κάποιος, τουλάχιστον, θα είναι σύντομα 415 00:23:17,710 --> 00:23:19,600 οικεία σε μας, είναι τα ακόλουθα: - 416 00:23:19,600 --> 00:23:21,910 Έτσι, ένα στην πρώτη γραμμή του κώδικα σε πράσινο χρώμα. 417 00:23:21,910 --> 00:23:23,970 >> Ξαναέγραψα ακριβώς s ως char *. 418 00:23:23,970 --> 00:23:25,250 Δεν υπάρχει καμία λειτουργική Υπάρχει διαφορά. 419 00:23:25,250 --> 00:23:28,790 Απλά πέταξε μακριά το CS50 βιβλιοθήκης και Είμαι αυτό που ζητά αυτό που είναι, μια χαρα *. 420 00:23:28,790 --> 00:23:31,640 >> Τώρα, τελεία, τελεία, τελεία, γιατί υπήρχαν κάποια έλεγχος σφαλμάτων που δεν είναι 421 00:23:31,640 --> 00:23:33,200 ενδιαφέρον να μιλήσουμε για και πάλι. 422 00:23:33,200 --> 00:23:34,710 Έτσι τώρα t δηλώνεται. 423 00:23:34,710 --> 00:23:35,780 Είναι πάρα πολύ ένα char *. 424 00:23:35,780 --> 00:23:38,280 Γι 'αυτό και έκανε μια μικρή πλατεία για η οθόνη όπως πριν. 425 00:23:38,280 --> 00:23:41,870 >> Αλλά από την δεξιά πλευρά, malloc, είπαμε είναι η μνήμη διαθέσει. 426 00:23:41,870 --> 00:23:44,130 Έτσι διαθέσει κάποιο κομμάτι της μνήμης. 427 00:23:44,130 --> 00:23:48,830 Και πόσα bytes κάνουμε πραγματικά θέλουν να διαθέσουν, δεν φαίνεται; 428 00:23:48,830 --> 00:23:50,340 >> Λοιπόν, το μήκος της συμβολοσειράς s. 429 00:23:50,340 --> 00:23:52,310 Έτσι, αν είναι γειά σου ότι είναι πρόκειται να είναι πέντε. 430 00:23:52,310 --> 00:23:53,950 Θα πούμε h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Έτσι, πέντε bytes. 432 00:23:55,090 --> 00:23:57,960 >> Στη συνέχεια, όμως συν 1, γιατί 1; 433 00:23:57,960 --> 00:23:58,830 Το 0 χαρακτήρα. 434 00:23:58,830 --> 00:24:03,640 Αν δεν αφήνουν περιθώρια για αυτόν τον τύπο που μπορεί να δημιουργήσει κατά λάθος μια κατάσταση 435 00:24:03,640 --> 00:24:05,600 όπου η χορδή είναι Η-Ε-Ε-Ε-Ο. 436 00:24:05,600 --> 00:24:08,470 Και τότε το επόμενο GetString ώρα είναι ονομάζονται και τύπου Ι, για παράδειγμα, 437 00:24:08,470 --> 00:24:14,020 David, ϋ-α-ν-Ι-ά, ο υπολογιστής πρόκειται να πιστεύουν ότι s είναι στην πραγματικότητα 438 00:24:14,020 --> 00:24:18,900 h-E-L-L-O-α-D-ν-Ι-ά επειδή υπάρχει Δεν διάλειμμα μεταξύ αυτών των λέξεων. 439 00:24:18,900 --> 00:24:19,810 >> Έτσι, χρειαζόμαστε αυτή τη διακοπή. 440 00:24:19,810 --> 00:24:20,720 Έτσι, δεν θέλουμε πέντε. 441 00:24:20,720 --> 00:24:22,100 Θέλουμε έξι bytes. 442 00:24:22,100 --> 00:24:23,110 >> Και bytes λέω. 443 00:24:23,110 --> 00:24:25,220 Αλλά είναι πραγματικά το χρόνο μέγεθος της Χαρ. 444 00:24:25,220 --> 00:24:28,040 Τεχνικά char είναι σχεδόν πάντα ένα μόνο byte. 445 00:24:28,040 --> 00:24:31,030 >> Αλλά ακριβώς για να μας κώδικα φορητό, να το πω έτσι, ώστε να λειτουργεί σε 446 00:24:31,030 --> 00:24:33,750 διαφορετικούς υπολογιστές, ακόμη και αν θα μπορούσαν να είναι κάπως διαφορετική κάτω από την 447 00:24:33,750 --> 00:24:36,590 κουκούλα, Πάω να γενικά πω το μέγεθος του char, έτσι ώστε 448 00:24:36,590 --> 00:24:37,660 κωδικό μου λειτουργεί πάντα. 449 00:24:37,660 --> 00:24:40,610 Και δεν πρέπει να το μεταγλωττίσετε μόνο γιατί αναβάθμιση του υπολογιστή μου ή να χρησιμοποιήσετε 450 00:24:40,610 --> 00:24:42,140 κάποια διαφορετική πλατφόρμα. 451 00:24:42,140 --> 00:24:45,300 >> Έτσι έχω 6 φορές το μέγεθος της μια χαρα, η οποία συμβαίνει να είναι 1. 452 00:24:45,300 --> 00:24:47,440 Έτσι ώστε malloc μέσα θα μπορούσαν να μου δώσει έξι bytes. 453 00:24:47,440 --> 00:24:49,140 Τι είναι αυτό πραγματικά κάνει; 454 00:24:49,140 --> 00:24:52,810 Λοιπόν, επιτρέψτε μου να κυλήσει πίσω στο χρόνο εδώ στο σημείο που βρισκόμαστε σε αυτή την ιστορία. 455 00:24:52,810 --> 00:24:57,620 >> Έτσι, αν πάω πάλι εδώ, έχω δηλώσει μια χαρα * ονομάζεται t. 456 00:24:57,620 --> 00:25:00,280 Έχω τώρα ονομάζεται malloc για έξι bytes. 457 00:25:00,280 --> 00:25:06,400 Και τώρα είμαι πρόκειται να καταλήξουμε σε αυτά τα έξι bytes ακριβώς όπως η σειρά νωρίτερα. 458 00:25:06,400 --> 00:25:10,570 Αλλά εγώ πραγματικά δεν ξέρω τι είναι μέσα σε αυτό το φάσμα. 459 00:25:10,570 --> 00:25:14,640 >> Αν διαθέτετε μνήμη αποδεικνύεται ότι δεν μπορείτε να εμπιστευθείτε ότι υπάρχει κάποια 460 00:25:14,640 --> 00:25:15,810 γνωστή τιμή εκεί. 461 00:25:15,810 --> 00:25:18,400 Θα μπορούσαν να έχουν χρησιμοποιηθεί από κάτι άλλο, κάποια άλλη λειτουργία, κάποια άλλη 462 00:25:18,400 --> 00:25:19,630 γραμμή του κώδικα που έγραψες. 463 00:25:19,630 --> 00:25:22,870 Έτσι, θα καλέσουμε γενικά αυτά τα σκουπίδια αξίες και να τους, ίσως, όπως 464 00:25:22,870 --> 00:25:26,170 ερωτηματικά, απλά δείχνει ότι έχουμε Δεν ξέρω τι είναι πραγματικά εκεί. 465 00:25:26,170 --> 00:25:30,390 Και αυτό δεν είναι μεγάλη υπόθεση, εφ 'όσον εμείς είναι αρκετά έξυπνος για να αντικαταστήσετε τα 466 00:25:30,390 --> 00:25:34,550 τιμές σκουπίδια με αριθμούς ή χαρακτήρες που νοιαζόμαστε για. 467 00:25:34,550 --> 00:25:36,340 >> Έτσι, σε αυτή την περίπτωση, τι θα πάω να κάνω; 468 00:25:36,340 --> 00:25:38,670 Λοιπόν, μου γραμμή κώδικα Στη συνέχεια, έχω τέσσερα. 469 00:25:38,670 --> 00:25:41,350 int παίρνω 0, n παίρνει το μήκος του νήματος του s. 470 00:25:41,350 --> 00:25:42,750 Έτσι, μια γνώριμη για το βρόχο. 471 00:25:42,750 --> 00:25:45,875 Ι είναι μικρότερο ή ίσο με η, η οποία είναι συνήθως παραπάνω. 472 00:25:45,875 --> 00:25:47,500 >> Αλλά αυτή τη φορά είναι σκόπιμη. 473 00:25:47,500 --> 00:25:51,890 I + +, και στη συνέχεια απλά να κάνουμε t βραχίονα i παίρνει s. 474 00:25:51,890 --> 00:25:56,320 Επειδή η εικόνα μου μοιάζει με αυτό στο Αυτή τη στιγμή, αποθηκεύονται στο t είναι η 475 00:25:56,320 --> 00:25:59,530 διεύθυνση του εν λόγω τυχαίας κομμάτι της μνήμης οι τιμές των οποίων είναι άγνωστα. 476 00:25:59,530 --> 00:26:03,030 Αλλά μόλις κάνω t βραχίονα 0 που με βάζει εδώ. 477 00:26:03,030 --> 00:26:07,430 >> Και τι καταλήγει να συρθούν εκεί; 478 00:26:07,430 --> 00:26:08,740 Έχουμε καταλήξει βάζοντας h. 479 00:26:08,740 --> 00:26:11,170 Διότι αυτό είναι ό, τι είναι στο s βραχίονα 0. 480 00:26:11,170 --> 00:26:14,300 Και στη συνέχεια το ίδιο πράγμα για e, και το L και το L, και o. 481 00:26:14,300 --> 00:26:17,930 >> n, γιατί πάω μέσα από ίση με n; 482 00:26:17,930 --> 00:26:19,200 Λόγω του χαρακτήρα 0. 483 00:26:19,200 --> 00:26:23,580 Έτσι, ακριβώς για να είναι σαφές, λοιπόν, αν πραγματικά διαγράψει όποια και αν είναι αυτά τα σκουπίδια 484 00:26:23,580 --> 00:26:28,870 οι τιμές είναι στην πραγματικότητα και στη συνέχεια κλήρωση αυτό που περιμένω, αυτό είναι s βραχίονα 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, καθώς και ότι είναι πίσω νέο χαρακτήρα. 486 00:26:32,440 --> 00:26:36,080 >> Και έτσι τώρα αν συνεχίζαμε παρελθόν την τελεία, τελεία, τελεία σε αυτή την σωστή έκδοση 487 00:26:36,080 --> 00:26:41,930 και περιελήφθησαν στο ενεργητικό βραχίονα t 0 Θα ήθελα, Φυσικά, πρέπει να κεφαλαιοποίηση μόνο αυτό 488 00:26:41,930 --> 00:26:47,050 τύπος εδώ, η οποία εννοιολογικά, ήταν τελικά ο στόχος. 489 00:26:47,050 --> 00:26:48,040 Έτσι, αυτό είναι όλο το δείκτη. 490 00:26:48,040 --> 00:26:51,430 >> Και έχετε τη χρήση τους για εβδομάδες τώρα στο πλαίσιο των χορδών. 491 00:26:51,430 --> 00:26:53,530 Αλλά κάτω από το καπό που είναι λίγο πιο περίπλοκη. 492 00:26:53,530 --> 00:26:57,520 Αλλά αν νομίζετε ότι γι 'αυτούς στην παρούσα εικονογραφική μορφή προτείνω ότι είναι 493 00:26:57,520 --> 00:27:01,720 πιθανόν να μην είναι όλα αυτά τρομακτικό, δεδομένου ότι μπορεί αρχικά να φαίνεται με την πρώτη ματιά, 494 00:27:01,720 --> 00:27:04,730 ιδιαίτερα με τέτοια νέα σύνταξη. 495 00:27:04,730 --> 00:27:07,290 Οποιεσδήποτε ερωτήσεις σχετικά με δείκτες, χορδές, ή χαρακτήρες; 496 00:27:07,290 --> 00:27:07,580 Ναι; 497 00:27:07,580 --> 00:27:09,252 >> ΚΟΙΝΟ: Μπορείτε να πάτε πίσω στο [δεν ακούγεται]; 498 00:27:09,252 --> 00:27:10,502 >> ΟΜΙΛΗΤΗΣ 1: Σίγουρα. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> ΚΟΙΝΟ: Λοιπόν, πώς έρχονται σε πολύ τελευταία σας γραμμή, δεν έχετε ένα t * line 501 00:27:19,525 --> 00:27:21,513 και A * S στη γραμμή; 502 00:27:21,513 --> 00:27:23,004 Δεν έχετε την αναφορά στο - 503 00:27:23,004 --> 00:27:24,640 >> ΟΜΙΛΗΤΗΣ 1: Αχ, μια πραγματικά καλή ερώτηση. 504 00:27:24,640 --> 00:27:26,800 Γιατί δεν έχω ένα t * και * s; 505 00:27:26,800 --> 00:27:30,340 Επειδή εν συντομία, την περασμένη εβδομάδα, όπως και σε μας ανταλλάξουν λειτουργία, είχα πει ότι όταν 506 00:27:30,340 --> 00:27:33,350 έχετε ένα δείκτη ο τρόπος με τον που θα πάτε εκεί, όπως κάναμε 507 00:27:33,350 --> 00:27:36,590 σωματικά στη σκηνή, ήταν πραγματικά χρησιμοποιήσετε τον τελεστή αστέρων. 508 00:27:36,590 --> 00:27:40,570 >> Αποδεικνύεται ότι αυτό το τετράγωνο-βραχίονα συμβολισμός είναι αυτό που θα καλέσουμε συντακτική 509 00:27:40,570 --> 00:27:44,190 ζάχαρη, η οποία είναι απλά μια σέξι τρόπο της λέγοντας στενογραφημένη είναι για 510 00:27:44,190 --> 00:27:45,950 ακριβώς αυτό που περιγράφετε. 511 00:27:45,950 --> 00:27:49,385 Αλλά είναι λίγο πιο διαισθητικό. 512 00:27:49,385 --> 00:27:53,510 Και με κίνδυνο να καταστεί αυτό φαίνεται περισσότερο περίπλοκη από ό, τι πρέπει να είναι, 513 00:27:53,510 --> 00:27:56,990 τι πραγματικά συμβαίνει εδώ είναι τα ακόλουθα: - 514 00:27:56,990 --> 00:28:01,450 Αν πω t * αυτό σημαίνει ότι πηγαίνετε στο η διεύθυνση αποθηκεύεται σε t. 515 00:28:01,450 --> 00:28:04,350 >> Έτσι, στην κυριολεξία, αν t αποθηκεύει η διεύθυνση του εν λόγω h 516 00:28:04,350 --> 00:28:07,300 Αρχικά, μέσα * t πηγαίνετε εδώ. 517 00:28:07,300 --> 00:28:10,730 Τώρα, τι t βραχίονα 0 σημαίνει; 518 00:28:10,730 --> 00:28:11,560 Το ίδιο ακριβώς πράγμα. 519 00:28:11,560 --> 00:28:13,510 Είναι λίγο πιο χρήστη να γράφει. 520 00:28:13,510 --> 00:28:14,430 >> Είμαι, όμως, δεν έχει γίνει ακόμα. 521 00:28:14,430 --> 00:28:17,800 Δεν μπορώ να πω * t παίρνει * s. 522 00:28:17,800 --> 00:28:19,440 Γιατί αυτό που θα έκανα τότε; 523 00:28:19,440 --> 00:28:22,950 Θα πρέπει να θέτει h, h, h, h, h σε όλο το όλο θέμα. 524 00:28:22,950 --> 00:28:22,995 Σωστά; 525 00:28:22,995 --> 00:28:26,020 >> Επειδή * t είναι να πάει στη διεύθυνση του t. 526 00:28:26,020 --> 00:28:27,580 Αλλά είμαστε στο εσωτερικό του βρόχου. 527 00:28:27,580 --> 00:28:32,150 Και τι αξία είμαι προσαύξηση, Φυσικά, σε κάθε επανάληψη; 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Αλλά υπάρχει μια ευκαιρία εδώ, έτσι δεν είναι; 530 00:28:34,590 --> 00:28:37,870 Ακόμα κι αν αυτό μοιάζει να παίρνει λίγο πιο εξελιγμένα 531 00:28:37,870 --> 00:28:40,730 από την πλατεία-βραχίονα σημειογραφία έχουμε χρησιμοποιήσει για κάποιο χρονικό διάστημα - 532 00:28:40,730 --> 00:28:43,840 επιτρέψτε μου να αναιρέσετε την αλλαγή ώρα μου εκεί - 533 00:28:43,840 --> 00:28:48,870 Ακόμα κι αν αυτό είναι να πάρει τώρα μια μικρή φανταχτερό, η βασική ιδέα, αν * t 534 00:28:48,870 --> 00:28:53,630 σημαίνει εδώ και t * είναι μόνο μεταβείτε στη διεύθυνση της t. 535 00:28:53,630 --> 00:28:54,990 >> Αλλά ποια ήταν η διεύθυνση t; 536 00:28:54,990 --> 00:28:56,850 Ο αριθμός που συνεχίζουν να χρησιμοποιούν; 537 00:28:56,850 --> 00:29:00,540 Όπως Ox456, ας φέρει ότι πίσω μόνο για χάρη της συζήτησης. 538 00:29:00,540 --> 00:29:05,380 Λοιπόν, αν θέλετε να πάρετε στο e στο t string, θέλω απλώς να πάει, 539 00:29:05,380 --> 00:29:06,460 κατ 'ουσίαν, 456. 540 00:29:06,460 --> 00:29:09,230 >> Ή μάλλον, 457. 541 00:29:09,230 --> 00:29:10,590 Απλά πρέπει να προσθέσετε μία. 542 00:29:10,590 --> 00:29:11,790 Αλλά μπορώ να το κάνουμε αυτό, έτσι δεν είναι; 543 00:29:11,790 --> 00:29:14,680 Επειδή t, ακόμα κι αν έχω κρατήσει σχέδιο τώρα ως ένα βέλος, είναι απλά μια 544 00:29:14,680 --> 00:29:16,570 αριθμό, Ox456. 545 00:29:16,570 --> 00:29:21,400 Και αν μπορώ να προσθέσω ένα με αυτό, ή περισσότερα Γενικότερα, αν μπορώ να προσθέσω σε ότι μπορώ να 546 00:29:21,400 --> 00:29:24,350 πραγματικά να πάρει ακριβώς εκεί που θέλω. 547 00:29:24,350 --> 00:29:26,260 Έτσι, αν το κάνω πραγματικά αυτό - 548 00:29:26,260 --> 00:29:28,970 και αυτό είναι ό, τι είναι σήμερα ονομάζεται αριθμητικής δεικτών - 549 00:29:28,970 --> 00:29:30,375 Μπορώ να αφαιρέσετε αυτή τη γραμμή. 550 00:29:30,375 --> 00:29:33,550 Ποια είναι, ειλικρινά, πιστεύω σαφέστερη και λίγο πιο φιλικό προς το χρήστη να διαβάσει. 551 00:29:33,550 --> 00:29:35,970 Αλλά αυτό δεν είναι λιγότερο σωστή. 552 00:29:35,970 --> 00:29:38,570 >> Αυτή η γραμμή κώδικα χρησιμοποιεί τώρα αριθμητικής δεικτών. 553 00:29:38,570 --> 00:29:40,920 Είναι λέει να πάει στο ακόλουθη διεύθυνση - 554 00:29:40,920 --> 00:29:44,670 ό, τι η έναρξη του t είναι, το οποίο είναι τ συν Ι, το οποίο αρχικά 555 00:29:44,670 --> 00:29:45,730 είναι 0, η οποία είναι μεγάλη. 556 00:29:45,730 --> 00:29:49,280 Διότι αυτό σημαίνει την αρχή του t συν 1, συν 2, συν 3, και ούτω καθεξής. 557 00:29:49,280 --> 00:29:51,030 Και η ίδια συμφωνία με την s. 558 00:29:51,030 --> 00:29:52,750 >> Έτσι συντακτική ζάχαρη γι 'αυτό. 559 00:29:52,750 --> 00:29:55,900 Ωστόσο, η κατανόηση τι πραγματικά συμβαίνει κάτω από την κουκούλα, θα έλεγα, 560 00:29:55,900 --> 00:29:57,410 είναι πραγματικά χρήσιμη και αυτή η ίδια. 561 00:29:57,410 --> 00:30:00,620 Διότι αυτό σημαίνει ότι πλέον δεν υπάρχει πολύ περισσότερη μαγεία συνεχίζεται 562 00:30:00,620 --> 00:30:01,620 κάτω από το καπό. 563 00:30:01,620 --> 00:30:03,920 Δεν πρόκειται να είναι πολλά περισσότερα στρώματα που μπορούμε να φλούδα πίσω για σας. 564 00:30:03,920 --> 00:30:04,810 Αυτό είναι c. 565 00:30:04,810 --> 00:30:06,410 Και αυτό είναι προγραμματισμός. 566 00:30:06,410 --> 00:30:08,002 Πολύ καλή ερώτηση. 567 00:30:08,002 --> 00:30:11,570 >> Εντάξει, έτσι αυτό ήταν ότι buggy πρόγραμμα που αναφερόταν στην προηγούμενη. 568 00:30:11,570 --> 00:30:12,650 swap ήταν εσφαλμένη. 569 00:30:12,650 --> 00:30:14,070 Εάν δεν φαίνεται να λειτουργεί. 570 00:30:14,070 --> 00:30:17,390 Υπενθυμίζεται ότι ακριβώς όπως με το γάλα και ο χυμός πορτοκαλιού - που άρχισα 571 00:30:17,390 --> 00:30:18,660 πόσιμο σημερινή διαδήλωση. 572 00:30:18,660 --> 00:30:22,220 Έτσι ακριβώς όπως και με το χυμό πορτοκαλιού και το γάλα, εμείς πρέπει να χρησιμοποιήσετε ένα 573 00:30:22,220 --> 00:30:26,200 προσωρινή μεταβλητή, TMP, να κατέχει ένα προσωρινά, έτσι ώστε να μπορεί στη συνέχεια 574 00:30:26,200 --> 00:30:28,820 αλλάξτε την τιμή του και στη συνέχεια να ενημερώσετε b. 575 00:30:28,820 --> 00:30:32,870 >> Αλλά αυτή η λειτουργία, είπαμε, ή αυτό το πρόγραμμα στο οποίο αυτή η λειτουργία ήταν 576 00:30:32,870 --> 00:30:35,670 γραμμένο ήταν λάθος και λανθασμένη, γιατί; 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ναι; 579 00:30:39,090 --> 00:30:42,471 >> ΚΟΙΝΟ: [δεν ακούγεται]. 580 00:30:42,471 --> 00:30:44,940 >> ΟΜΙΛΗΤΗΣ 1: Ακριβώς, όταν σας καλούν ανταλλαγής - 581 00:30:44,940 --> 00:30:47,820 ή, γενικότερα, όταν αποκαλούν οι περισσότεροι οποιαδήποτε λειτουργία - 582 00:30:47,820 --> 00:30:51,210 αν είναι τα επιχειρήματα σε αυτή τη λειτουργία πρωτόγονη, να το πω έτσι, ints και χαρακτήρες 583 00:30:51,210 --> 00:30:56,740 και δίκλινα και πλωτήρες, τα πράγματα χωρίς αστέρια, περνάτε σε ένα αντίγραφο της 584 00:30:56,740 --> 00:30:57,540 το επιχείρημα. 585 00:30:57,540 --> 00:31:01,580 Έτσι, αν ήταν 1 χ και y ήταν 2, ένα πρόκειται να είναι 1 και Β πρόκειται να είναι 2. 586 00:31:01,580 --> 00:31:05,250 Αλλά πρόκειται να είναι διαφορετικά κομμάτια της, διαφορετικά κομμάτια κομμάτια της 587 00:31:05,250 --> 00:31:07,540 μνήμη που τυχαίνει να αποθηκεύει ίδιες τιμές. 588 00:31:07,540 --> 00:31:12,160 >> Έτσι, ο κωδικός αυτός είναι σούπερ τέλεια σε εναλλαγή a και b. 589 00:31:12,160 --> 00:31:13,850 Δεν είναι καλή στο swapping - 590 00:31:13,850 --> 00:31:15,290 στο παράδειγμα της προηγούμενης εβδομάδας - 591 00:31:15,290 --> 00:31:16,390 x και y. 592 00:31:16,390 --> 00:31:18,780 Επειδή και πάλι, είναι σε λάθος πεδίο. 593 00:31:18,780 --> 00:31:21,310 >> Τώρα, πώς θα πάει για τον καθορισμό αυτό; 594 00:31:21,310 --> 00:31:23,140 Έπρεπε να καταστήσουν τη λειτουργία του κοιτάξουμε λίγο πιο άσχημο. 595 00:31:23,140 --> 00:31:25,250 Αλλά και πάλι, σκεφτείτε τι αυτό σημαίνει απλά. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Και στην πραγματικότητα, επιτρέψτε μου, για λόγους συνέπειας, αλλάξετε ένα πράγμα γι 'αυτό είναι πανομοιότυπο με 598 00:31:31,500 --> 00:31:33,200 τι ακριβώς έκανε. 599 00:31:33,200 --> 00:31:35,690 Όπως ανέφερα και την προηγούμενη εβδομάδα, δεν ανεξάρτητα από το πού πηγαίνει. 600 00:31:35,690 --> 00:31:38,120 Στην πραγματικότητα, συνήθως θα βάλει το αστέρι δίπλα από το όνομα της μεταβλητής. 601 00:31:38,120 --> 00:31:40,750 Αλλά νομίζω ότι θα είναι λίγο πιο εύκολο να εξετάσει το * δίπλα στο 602 00:31:40,750 --> 00:31:44,910 τύπο δεδομένων υπό την έννοια ότι είναι ένας δείκτης σε int σε αυτή την περίπτωση. 603 00:31:44,910 --> 00:31:46,270 >> Λοιπόν, τι κάνω εδώ; 604 00:31:46,270 --> 00:31:49,590 Λέω να μην μου δώσει μια int ακολουθούμενο από ένα άλλο int, 605 00:31:49,590 --> 00:31:50,810 καλώντας τους a και b. 606 00:31:50,810 --> 00:31:52,460 Δώσε μου τη διεύθυνση ενός int. 607 00:31:52,460 --> 00:31:53,960 Δώσε μου τη διεύθυνση του άλλου int. 608 00:31:53,960 --> 00:31:56,330 Καλέστε αυτές τις διευθύνσεις a και b. 609 00:31:56,330 --> 00:32:00,860 >> Και στη συνέχεια, χρησιμοποιώντας το συμβολισμό * κάτω στη συνέχεια, πηγαίνετε στο καθένα από αυτά διευθύνσεων 610 00:32:00,860 --> 00:32:05,290 όπως απαιτείται για να πάρει είτε ή να ορίσετε την αξία του. 611 00:32:05,290 --> 00:32:07,400 Αλλά υπάρχει μια εξαίρεση εδώ. 612 00:32:07,400 --> 00:32:11,130 Γιατί δεν έχω μια * δίπλα στο tmp; 613 00:32:11,130 --> 00:32:15,070 Γιατί δεν το κάνετε αυτό, για παράδειγμα; 614 00:32:15,070 --> 00:32:19,370 Νιώθω σαν να πρέπει να πάει ακριβώς όλα έξω και να διορθώσει το όλο θέμα. 615 00:32:19,370 --> 00:32:19,752 Ναι; 616 00:32:19,752 --> 00:32:21,002 >> ΚΟΙΝΟ: [δεν ακούγεται]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> ΟΜΙΛΗΤΗΣ 1: Δεν έχω δηλώσει tmp ως string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Έτσι, αυτό θα δηλώσει, στην περίπτωση αυτή, ένα tmp να είναι η διεύθυνση ενός int. 621 00:32:34,950 --> 00:32:37,380 Αλλά αυτό δεν είναι αρκετά αυτό που θέλω, για δυο λόγους. 622 00:32:37,380 --> 00:32:38,616 >> ΚΟΙΝΟ: Δεν θέλετε να τα ανταλλάξουν. 623 00:32:38,616 --> 00:32:41,800 >> ΟΜΙΛΗΤΗΣ 1: Ακριβώς, δεν θέλω να ανταλλάξουν τίποτα με tmp. tmp είναι απλά 624 00:32:41,800 --> 00:32:42,790 εβδομάδα-ένα τα πράγματα. 625 00:32:42,790 --> 00:32:45,150 Το μόνο που θέλω είναι μια μεταβλητή να αποθηκεύσετε κάποιον αριθμό. 626 00:32:45,150 --> 00:32:47,330 Δεν νοιάζονται καν για τις διευθύνσεις αυτή τη στιγμή. 627 00:32:47,330 --> 00:32:50,530 >> Χρειάζομαι μόνο 32 bits ή έτσι ώστε να αποθηκεύσει έναν int. 628 00:32:50,530 --> 00:32:56,690 Και θέλω να βάλω σε αυτά τα 32 bits Ό, τι δεν είναι ένα, να το πω έτσι, αλλά 629 00:32:56,690 --> 00:33:01,260 Τι είναι σε ένα, μόνο και μόνο για να είμαι πιο ακριβής. 630 00:33:01,260 --> 00:33:06,420 Διότι εάν το α είναι μια διεύθυνση, * ένα μέσο πάμε εκεί και να πάρει την τιμή 1. 631 00:33:06,420 --> 00:33:10,560 Για παράδειγμα, στο παράδειγμα της προηγούμενης εβδομάδας ή στην περίπτωση β της, να πάρει την τιμή 2. 632 00:33:10,560 --> 00:33:11,750 >> Έτσι, αυτό που πραγματικά συμβαίνει; 633 00:33:11,750 --> 00:33:15,070 Επιτρέψτε μου να επιστήσω την εικόνα εδώ που θα μόνο πειράζω χώρια μέρος του σήμερα. 634 00:33:15,070 --> 00:33:18,580 Αλλά αυτό θα συνεχίσουν να εμφανίζονται για αρκετό καιρό. 635 00:33:18,580 --> 00:33:22,430 >> Αυτό, ισχυρίζονται, είναι αυτό του υπολογιστή σας μνήμη μοιάζει όταν εκτελείτε μια εφαρμογή 636 00:33:22,430 --> 00:33:24,060 προγράμματος, κάθε πρόγραμμα. 637 00:33:24,060 --> 00:33:28,340 Όταν εκτελείτε ένα πρόγραμμα στην κορυφή της μνήμης RAM του υπολογιστή σας - οπότε σκεφτείτε 638 00:33:28,340 --> 00:33:33,530 Αυτό το ορθογώνιο, πραγματικά, όπως σας RAM ή μνήμη του υπολογιστή, όλα 101 639 00:33:33,530 --> 00:33:36,920 δισεκατομμύριο bytes του, όλα τα δύο δισεκατομμύρια bytes, όλα τα δύο gigabytes του, 640 00:33:36,920 --> 00:33:39,910 ανεξάρτητα από την ποσότητα που έχετε είναι, ας τραβήξουμε ως ένα ορθογώνιο. 641 00:33:39,910 --> 00:33:43,260 Και εγώ ισχυρίζομαι ότι όταν εκτελείτε ένα πρόγραμμα όπως το Microsoft Word ή Chrome 642 00:33:43,260 --> 00:33:49,220 ή κάτι τέτοιο, τα bits που Microsoft ή η Google έγραψε - 643 00:33:49,220 --> 00:33:50,910 στις περιπτώσεις των προγραμμάτων αυτών - 644 00:33:50,910 --> 00:33:54,490 φορτώνονται στη μνήμη του υπολογιστή σας όπου μπορούν να εκτελεστούν περισσότερες 645 00:33:54,490 --> 00:33:57,520 γρήγορα και τροφοδοτείται στο CPU, η οποία είναι οι εγκέφαλοι του υπολογιστή. 646 00:33:57,520 --> 00:34:00,940 >> Και σε TAM είναι αποθηκευμένα στην ίδια κορυφή του προγράμματός σας, να το πω έτσι. 647 00:34:00,940 --> 00:34:03,300 Με άλλα λόγια, αν αυτό είναι ένα μεγάλο κομμάτι του μνήμη, όταν κάνετε διπλό κλικ στο 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, έρχονται τα bits από το σκληρό δίσκο. 649 00:34:05,740 --> 00:34:06,680 Παίρνουν φορτωμένο στη μνήμη RAM. 650 00:34:06,680 --> 00:34:10,330 Και εμείς θα τους χώσουν επάνω στην κορυφή αυτού του ορθογωνίου εννοιολογικά. 651 00:34:10,330 --> 00:34:13,010 >> Λοιπόν, το υπόλοιπο της μνήμης σας είναι χρησιμοποιούνται για διαφορετικά πράγματα. 652 00:34:13,010 --> 00:34:16,460 Στην κορυφή θα δείτε προετοιμαστεί δεδομένα και κατάργηση της προετοιμασίας των δεδομένων. 653 00:34:16,460 --> 00:34:20,500 Αυτό έχει να κάνει, κατά το μεγαλύτερο μέρος, με σταθερές ή καθολικές μεταβλητές 654 00:34:20,500 --> 00:34:21,340 που έχουν τιμές. 655 00:34:21,340 --> 00:34:22,980 Αλλά περισσότερα για αυτά άλλη φορά. 656 00:34:22,980 --> 00:34:25,150 >> Στη συνέχεια, έχετε το σωρό, το οποίο θα επανέλθω. 657 00:34:25,150 --> 00:34:28,420 Αλλά στο κάτω μέρος είναι το μέρος που είναι ιδιαίτερα συναφές τώρα. 658 00:34:28,420 --> 00:34:30,210 Είναι η λεγόμενη στοίβα. 659 00:34:30,210 --> 00:34:33,850 Έτσι ακριβώς όπως και στα περισσότερα οποιοδήποτε D αίθουσα εδώ πανεπιστημιούπολη, έχετε αυτές δίσκους που 660 00:34:33,850 --> 00:34:37,210 απλά στοιβάζονται το ένα πάνω από το άλλο επί του οποίου μπορείτε να βάλετε τα τρόφιμα και εταζέρα. 661 00:34:37,210 --> 00:34:40,139 Η στοίβα σε ένα σύστημα υπολογιστή είναι πολύ παρόμοια. 662 00:34:40,139 --> 00:34:42,679 Εκτός ενώ στο δίσκο, όπως χρησιμοποιούμε στην η τραπεζαρία, φυσικά, εννοείται 663 00:34:42,679 --> 00:34:45,710 να φέρει τα πράγματα τους δίσκους ή τα πλαίσια - 664 00:34:45,710 --> 00:34:49,469 όπως θα τους αποκαλούν - σε έναν υπολογιστή μνήμη χρησιμοποιείται για να κρατήσει 665 00:34:49,469 --> 00:34:51,610 μεταβλητές και τις τιμές. 666 00:34:51,610 --> 00:34:53,929 >> Έτσι, αυτό που πραγματικά πηγαίνει για κάτω από την κουκούλα; 667 00:34:53,929 --> 00:34:55,820 Λοιπόν, επιτρέψτε μου να βλέπω τον στην οθόνη εδώ. 668 00:34:55,820 --> 00:34:58,370 Και ας επικεντρωθεί μόνο για τις κάτω μέρος για μια στιγμή. 669 00:34:58,370 --> 00:35:02,770 Αν αυτό είναι το κάτω τμήμα του μου μνήμη του υπολογιστή αποδεικνύεται όταν 670 00:35:02,770 --> 00:35:05,350 καλέστε την κύρια λειτουργία - η οποία συμβαίνει, ειλικρινά, 671 00:35:05,350 --> 00:35:06,950 αυτόματα για μένα - 672 00:35:06,950 --> 00:35:10,510 Παίρνω ένα κομμάτι της μνήμης με την κάτω μέρος της RAM μου να το πω έτσι. 673 00:35:10,510 --> 00:35:13,390 Και αυτό είναι όπου το κύριο είναι τοπικές μεταβλητές πάει. 674 00:35:13,390 --> 00:35:16,770 Είναι το μέρος όπου argc και argv ίσως πάει, και τυχόν μεταβλητές I 675 00:35:16,770 --> 00:35:18,170 δηλώνουν στο εσωτερικό της κύριας. 676 00:35:18,170 --> 00:35:20,260 Καταλήγουν στο κάτω μέρος της μνήμης RAM του υπολογιστή μου. 677 00:35:20,260 --> 00:35:25,040 >> Τώρα, ας υποθέσουμε ότι οι κύριες κλήσεις μια λειτουργία όπως swap, όπως έκανε την περασμένη εβδομάδα; 678 00:35:25,040 --> 00:35:30,620 Λοιπόν, έχουμε θέσει ουσιαστικά ένα νέο δίσκο, ένα νέο πλαίσιο, πάνω στο κομμάτι της μνήμης μου. 679 00:35:30,620 --> 00:35:34,160 Και Πάω να περιγράψει αυτό ως που ανήκουν στη συνάρτηση swap. 680 00:35:34,160 --> 00:35:35,770 >> Τώρα αυτό που είναι μέσα της ανταλλαγής; 681 00:35:35,770 --> 00:35:39,240 Λοιπόν, με βάση το πρόγραμμα της περασμένης εβδομάδας και που είδαμε μόλις ένα απόσπασμα από, 682 00:35:39,240 --> 00:35:46,590 εντός του πλαισίου ανταλλαγής του, ή της ανταλλαγής δίσκο, είναι ό, τι οι μεταβλητές; 683 00:35:46,590 --> 00:35:47,970 Λοιπόν, a και b. 684 00:35:47,970 --> 00:35:51,850 Επειδή αυτές ήταν τοπικές επιχειρήματά της, συν ένα τρίτο, tmp. 685 00:35:51,850 --> 00:35:54,470 Έτσι, πραγματικά, θα μπορούσα να επιστήσει λίγο πιο καθαρά. 686 00:35:54,470 --> 00:35:56,680 Επιτρέψτε μου να πάω μπροστά και να αναιρέσετε την ετικέτα. 687 00:35:56,680 --> 00:35:58,520 Και επιτρέψτε μου να ισχυρίζονται ότι ξέρετε τι; 688 00:35:58,520 --> 00:36:00,560 >> ένα είναι κατά πάσα πιθανότητα πρόκειται να καταλήγουν εδώ. 689 00:36:00,560 --> 00:36:02,160 B πρόκειται να τελειώσει εδώ. 690 00:36:02,160 --> 00:36:03,810 Και tmp πρόκειται να τελειώσει εδώ. 691 00:36:03,810 --> 00:36:05,160 Τώρα, η παραγγελία θα μπορούσε είναι λίγο διαφορετική. 692 00:36:05,160 --> 00:36:06,840 Αλλά εννοιολογικά αυτή είναι η ιδέα. 693 00:36:06,840 --> 00:36:11,490 >> Και μόνο συλλογικά, αυτό είναι ό, τι θα καλέσουμε το πλαίσιο ανταλλαγής, ή να 694 00:36:11,490 --> 00:36:12,136 τραπεζαρία-αίθουσα δίσκο. 695 00:36:12,136 --> 00:36:13,150 Και η ίδια συμφωνία με το κύριο. 696 00:36:13,150 --> 00:36:14,040 Αλλά εγώ δεν θα αναδιατυπώσει αυτό. 697 00:36:14,040 --> 00:36:17,810 Αλλά αυτό είναι όπου argc και argv και κάθε τις τοπικές μεταβλητές, όπως x και y 698 00:36:17,810 --> 00:36:18,940 θα μπορούσε να είναι επίσης. 699 00:36:18,940 --> 00:36:22,170 >> Έτσι τώρα σκεφτείτε τι πραγματικά συμβαίνει όταν καλείτε swap. 700 00:36:22,170 --> 00:36:26,370 Όταν καλείτε το swap, την εκτέλεση κώδικα, όπως αυτό, είστε περνώντας, στην 701 00:36:26,370 --> 00:36:30,670 έκδοση λάθη, α και β και αντίγραφα των x και y. 702 00:36:30,670 --> 00:36:34,300 Έτσι, αν κάνω επιστήσω τώρα αυτό στην οθόνη - 703 00:36:34,300 --> 00:36:36,700 πήρε για να πάρει καλύτερα σε αυτό - 704 00:36:36,700 --> 00:36:40,850 έτσι η ιστορία έλεγα στον εαυτό μου Ήταν σε αυτό το buggy έκδοση, όταν 705 00:36:40,850 --> 00:36:46,130 Εναλλαγή ανάμεσα σε κυριολεκτικά α και β όπως ακέραιοι, τι πραγματικά συμβαίνει; 706 00:36:46,130 --> 00:36:48,250 >> Λοιπόν, αυτό που πραγματικά συμβαίνει είναι το εξής. 707 00:36:48,250 --> 00:36:52,850 Επιτρέψτε μου να πάω μπροστά και να αναιρέσετε μόνο να ξεκαθαρίσω λίγο χώρο εδώ. 708 00:36:52,850 --> 00:36:54,720 Έτσι, αυτό είναι η μνήμη του υπολογιστή μου. 709 00:36:54,720 --> 00:36:57,510 >> Έτσι, αν έχω, για παράδειγμα - 710 00:36:57,510 --> 00:36:58,910 πραγματικά ας το κάνουμε με αυτόν τον τρόπο - 711 00:36:58,910 --> 00:37:02,690 αν ισχυρίζονται ότι αυτό είναι x, την αποθήκευση η τιμή 1 όπως ακριβώς και την προηγούμενη εβδομάδα. 712 00:37:02,690 --> 00:37:05,930 Και αυτό είναι y, αποθήκευση της τιμής 2 ακριβώς όπως την περασμένη εβδομάδα. 713 00:37:05,930 --> 00:37:11,370 Και αυτό είναι το κύριο, όταν καλώ swap, δίνοντας έτσι τον εαυτό μου πρόσβαση σε ένα και 714 00:37:11,370 --> 00:37:15,150 β και TMP, Πάω να ισχυρίζονται ότι αυτό είναι ένα και αυτό είναι 1. 715 00:37:15,150 --> 00:37:16,080 >> Αυτό είναι β. 716 00:37:16,080 --> 00:37:17,010 Αυτό είναι 2. 717 00:37:17,010 --> 00:37:18,370 Αυτό ονομάζεται tmp. 718 00:37:18,370 --> 00:37:23,360 >> Και αρχικά, έχει κάποια αξία σκουπίδια μέχρι που πραγματικά να αποθηκεύουν σε ένα, 719 00:37:23,360 --> 00:37:24,450 η οποία είναι 1. 720 00:37:24,450 --> 00:37:28,320 Στη συνέχεια, να προχωρήσει και να αλλάξει ένας να είναι αυτό; 721 00:37:28,320 --> 00:37:29,720 Αξία Β. 722 00:37:29,720 --> 00:37:31,980 >> Και έτσι τώρα έχω δύο εδώ. 723 00:37:31,980 --> 00:37:34,050 Και τότε είπαμε b παίρνει tmp. 724 00:37:34,050 --> 00:37:37,670 Και πάλι, ακριβώς όπως μια λογική έλεγχο, η τρίτη γραμμή κώδικα εδώ είναι απλά αυτό 725 00:37:37,670 --> 00:37:39,440 ένα, b παίρνει tmp. 726 00:37:39,440 --> 00:37:41,730 >> Και έτσι, τέλος, τι να κάνω; 727 00:37:41,730 --> 00:37:46,800 Θα προχωρήσει και να αλλάξει το b να είναι ανεξάρτητα η αξία των ΠΔΤ, η οποία είναι 1. 728 00:37:46,800 --> 00:37:48,390 Δεν αγγίζω tmp και πάλι. 729 00:37:48,390 --> 00:37:54,100 >> Αλλά τώρα, το πρόβλημα είναι το συντομότερο ανταλλαγής επιστρέφει, επειδή δεν είναι παράδοση 730 00:37:54,100 --> 00:37:57,540 πίσω κάποια αξία, δεν υπάρχει επιστροφή Δήλωση ρητά σε αυτό. 731 00:37:57,540 --> 00:37:59,080 Τι πραγματικά συμβαίνει; 732 00:37:59,080 --> 00:38:03,480 Λοιπόν, κατ 'ουσίαν, όλη αυτή η μνήμη - 733 00:38:03,480 --> 00:38:07,410 Εντάξει, προφανώς η γόμα αρέσει μόνο ένα δάχτυλο τη φορά - 734 00:38:07,410 --> 00:38:08,180 απλά εξαφανίζεται. 735 00:38:08,180 --> 00:38:10,070 >> Τώρα, στην πραγματικότητα δεν είναι πάει πουθενά. 736 00:38:10,070 --> 00:38:11,810 Αλλά μπορείτε να σκεφτείτε από το τώρα ως ερωτηματικά. 737 00:38:11,810 --> 00:38:14,040 Επειδή δεν είναι πλέον στην πραγματικότητα σε χρήση. 738 00:38:14,040 --> 00:38:17,470 Και τίποτα δεν γίνεται με αυτές τις αξίες. 739 00:38:17,470 --> 00:38:21,920 >> Έτσι, στην περίπτωση του πράσινου εκδοχή Αυτός ο κωδικός, τι αντ 'αυτού να 740 00:38:21,920 --> 00:38:24,640 πέρασε στην ανταλλαγή; 741 00:38:24,640 --> 00:38:25,770 Έτσι αντιμετωπίζει. 742 00:38:25,770 --> 00:38:28,520 Έτσι, η διεύθυνση των χ και η διεύθυνση του y. 743 00:38:28,520 --> 00:38:35,790 Έτσι, αν έχουμε ξανά πει αυτή την ιστορία μια τελευταία χρόνο, και εφιστώ την πραγματικότητα ανταλλαγής και πάλι, 744 00:38:35,790 --> 00:38:44,620 αλλά με δείκτες, η οποία αποτελεί, αυτό είναι b, και αυτό είναι tmp, τι είναι 745 00:38:44,620 --> 00:38:49,080 στην πραγματικότητα είναι αποθηκευμένα σε ένα σε αυτό το πράσινο έκδοση του κώδικα μου, όπου είμαι διέρχεται 746 00:38:49,080 --> 00:38:52,110 στις διευθύνσεις; 747 00:38:52,110 --> 00:38:53,780 >> Είναι πρόκειται να είναι ένας δείκτης για x. 748 00:38:53,780 --> 00:38:54,890 Γι 'αυτό και θα μπορούσε να αντλήσει ένα βέλος. 749 00:38:54,890 --> 00:38:57,310 Αλλά ας χρησιμοποιήσουμε την ίδια αυθαίρετη παράδειγμα όπως πριν. 750 00:38:57,310 --> 00:39:01,220 Ας πούμε ότι αυτό είναι κάτι σαν Ox123. 751 00:39:01,220 --> 00:39:04,970 Και αυτό πρόκειται να είναι Ox127 γιατί Είναι τέσσερις bytes μακριά γιατί είναι ένα 752 00:39:04,970 --> 00:39:07,370 int, έτσι Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Και πάλι, παίρνω κάποιες ελευθερίες με τους αριθμούς. 754 00:39:09,080 --> 00:39:11,430 Είναι πολύ μικρότερο από ό, τι θα στην πραγματικότητα να είναι και με διαφορετική σειρά. 755 00:39:11,430 --> 00:39:14,350 Αλλά αυτό είναι το πώς η εικόνα τώρα είναι διαφορετική. 756 00:39:14,350 --> 00:39:19,060 >> Αλλά όταν μπορώ να χρησιμοποιήσω αυτό το πράσινο κώδικα και δεν έχω πάρει int tmp * a. 757 00:39:19,060 --> 00:39:25,010 * Ένα μέσο για να κάνετε τα εξής, να λάβει τα αντιμετώπιση που είναι σε μια και να πάει σε αυτό, 758 00:39:25,010 --> 00:39:26,190 η οποία είναι 1. 759 00:39:26,190 --> 00:39:28,480 Και αυτό είναι που στη συνέχεια θα τοποθετούνται στο tmp. 760 00:39:28,480 --> 00:39:32,480 Εν τω μεταξύ, στην επόμενη γραμμή κώδικα εδώ, * a παίρνει b, τι σημαίνει αυτό; 761 00:39:32,480 --> 00:39:36,910 >> Λοιπόν, * a, οπότε πάμε εδώ παίρνει * b, το οποίο σημαίνει ότι πάμε εκεί. 762 00:39:36,910 --> 00:39:39,310 Και αυτό σημαίνει να θέσει την τιμή εκεί. 763 00:39:39,310 --> 00:39:43,670 Τέλος, η τελευταία γραμμή του κώδικα απλά είπε * b παίρνει tmp. 764 00:39:43,670 --> 00:39:48,900 >> Έτσι, β λέει να πάει εκεί και να το αντικαταστήσετε με tmp το οποίο, στην περίπτωση αυτή, πρόκειται 765 00:39:48,900 --> 00:39:51,520 να είναι, και πάλι, 1. 766 00:39:51,520 --> 00:39:54,920 Και γι 'αυτό η πράσινη εκδοχή του έργα μας κώδικα, ενώ το κόκκινο 767 00:39:54,920 --> 00:39:56,010 έκδοση ποτέ δεν το έκανε. 768 00:39:56,010 --> 00:39:59,020 Είναι όλα απλά βράζει κάτω στο πώς το μνήμη, η διοίκηση και, όπου αυτό είναι 769 00:39:59,020 --> 00:40:02,580 που πράγματι τίθεται σε σας RAM του υπολογιστή. 770 00:40:02,580 --> 00:40:07,270 Και για τώρα, αυτό είναι ένα από τα πράγματα ότι η στοίβα χρησιμοποιείται για. 771 00:40:07,270 --> 00:40:09,225 >> Ερωτήματα σχετικά με την διάταξη; 772 00:40:09,225 --> 00:40:10,380 Στις δείκτες; 773 00:40:10,380 --> 00:40:11,630 Ή με swap; 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Εντάξει, έτσι malloc, ανάκληση, έκανε κάτι τέτοιο. 776 00:40:17,043 --> 00:40:18,260 Αυτό ήταν ένα σούπερ απλό παράδειγμα. 777 00:40:18,260 --> 00:40:20,550 Και αυτός ήταν ο μοναδικός που Binky μας σύστησε, αν και αρκετά 778 00:40:20,550 --> 00:40:21,870 γρήγορα, κατά το τέλος της κατηγορίας. 779 00:40:21,870 --> 00:40:24,480 Γαμώτο, εκεί πάμε πάλι. 780 00:40:24,480 --> 00:40:28,780 >> Έτσι, υπενθυμίζουν ότι αυτό ήταν το παράδειγμα που Binky μας εισήγαγε, αν και 781 00:40:28,780 --> 00:40:30,360 κάπως γρήγορα στο τέλος της κατηγορίας. 782 00:40:30,360 --> 00:40:33,640 Και εδώ χρησιμοποιούνται malloc πραγματικά για δεύτερη φορά. 783 00:40:33,640 --> 00:40:37,330 Επειδή την πρώτη φορά που θα χρησιμοποιηθεί για να δημιουργήσει αρκετή μνήμη RAM, διαθέτουν αρκετή μνήμη RAM 784 00:40:37,330 --> 00:40:38,340 να αποθηκεύσει ένα string. 785 00:40:38,340 --> 00:40:40,250 >> Αυτή τη φορά Binky κράτησε απλά. 786 00:40:40,250 --> 00:40:42,465 Έτσι είναι για να αποθηκεύσετε μόνο ένα int, προφανώς. 787 00:40:42,465 --> 00:40:43,510 Και αυτό είναι εντελώς καλά. 788 00:40:43,510 --> 00:40:46,560 Είναι λίγο περίεργο, ειλικρινά, να χρησιμοποιείτε malloc να διαθέσει ένα int. 789 00:40:46,560 --> 00:40:50,650 Αλλά το θέμα της πλαστελίνης Nick ήταν πραγματικά να πει μόνο την ιστορία του τι 790 00:40:50,650 --> 00:40:53,830 θα συμβεί ή δεν συμβεί όταν σας κακομεταχειρίζονται τη μνήμη. 791 00:40:53,830 --> 00:40:56,520 >> Έτσι, στην περίπτωση αυτή, το εν λόγω πρόγραμμα έκανε μερικά πράγματα. 792 00:40:56,520 --> 00:41:01,580 Στην πρώτη περίπτωση εδώ, δηλώνει ένα δείκτη που ονομάζεται x σε int. 793 00:41:01,580 --> 00:41:04,480 Δηλώνει τότε ένα δείκτη ονομάζεται y σε int. 794 00:41:04,480 --> 00:41:06,150 Αποθηκεύει στη συνέχεια, x, τι; 795 00:41:06,150 --> 00:41:07,110 Κάποιος άλλος τώρα. 796 00:41:07,110 --> 00:41:09,685 Τι παίρνει αποθηκεύονται στο x σύμφωνα με το Η τρίτη γραμμή αυτού του προγράμματος; 797 00:41:09,685 --> 00:41:12,380 >> ΚΟΙΝΟ: [δεν ακούγεται]. 798 00:41:12,380 --> 00:41:14,130 >> ΟΜΙΛΗΤΗΣ 1: Λοιπόν, δεν είναι αρκετά bytes, ανά πω. 799 00:41:14,130 --> 00:41:16,760 Να είστε πιο ακριβείς τώρα. 800 00:41:16,760 --> 00:41:18,325 Τι παίρνει αποθηκεύονται στο x; 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Μια διεύθυνση, νομίζω ότι το άκουσα. 803 00:41:22,060 --> 00:41:23,570 >> Έτσι τι malloc επιστρέφει; 804 00:41:23,570 --> 00:41:26,030 malloc συμπεριφορικά διαθέτει ένα μεγάλο κομμάτι της μνήμης. 805 00:41:26,030 --> 00:41:27,850 Αλλά πώς να σας δώσει πρόσβαση σε αυτό; 806 00:41:27,850 --> 00:41:29,460 Επιστρέφει τι; 807 00:41:29,460 --> 00:41:32,000 Η διεύθυνση του πρώτου byte στο κομμάτι της μνήμης. 808 00:41:32,000 --> 00:41:33,020 >> Τώρα, αυτό είναι εξαιρετικά απλή. 809 00:41:33,020 --> 00:41:35,380 Είναι απλά ένα byte, που σημαίνει ότι το αντιμετώπιση είμαστε πάρει πίσω είναι η 810 00:41:35,380 --> 00:41:37,300 Διεύθυνση του όλου πράγματος. 811 00:41:37,300 --> 00:41:42,070 Έτσι αποθηκεύονται σε x, στη συνέχεια, είναι η διεύθυνση του εν λόγω κομμάτι της μνήμης. 812 00:41:42,070 --> 00:41:43,400 Εν τω μεταξύ, τι θα συμβεί στη συνέχεια; 813 00:41:43,400 --> 00:41:45,890 Έτσι, στην πραγματικότητα, ας πάμε μπροστά και συντάξει αυτό το πραγματικά γρήγορα. 814 00:41:45,890 --> 00:41:52,490 >> Έτσι, αν πάμε πάνω στην οθόνη εδώ και παίζουμε αυτό έξω int * x και int * y 815 00:41:52,490 --> 00:41:53,740 πρόκειται να κάνει ό, τι για μένα; 816 00:41:53,740 --> 00:41:58,280 Ισχυρίζομαι ότι είναι ακριβώς πρόκειται να κάνουν κάτι σαν αυτό και να το ονομάσουμε x, και 817 00:41:58,280 --> 00:42:00,010 αυτό και να το ονομάσουμε y. 818 00:42:00,010 --> 00:42:03,110 Εν τω μεταξύ, η τρίτη γραμμή του κώδικα είναι πρόκειται να διαθέσει το μέγεθος ενός int, 819 00:42:03,110 --> 00:42:06,160 η οποία συμβαίνει να είναι - συγνώμη αν είπα μία πριν εννοούσα ένα int - 820 00:42:06,160 --> 00:42:08,280 τέσσερα bytes σε ένα τυπικό υπολογιστή. 821 00:42:08,280 --> 00:42:09,720 Τουλάχιστον με τη συσκευή CS50. 822 00:42:09,720 --> 00:42:11,490 >> Έτσι, αυτό πρόκειται να διαθέσει αυτό, ποιος ξέρει; 823 00:42:11,490 --> 00:42:12,800 Κάπου εδώ. 824 00:42:12,800 --> 00:42:15,780 Και αυτό είναι αποθηκευμένο σε μερικά Ox διεύθυνση, ποιος ξέρει; 825 00:42:15,780 --> 00:42:18,330 Αλλά τι πρόκειται να πάρει επιστροφή είναι η διεύθυνση. 826 00:42:18,330 --> 00:42:22,270 Αλλά θα επιστήσει εικονογραφικά όπως ακριβώς ένα βέλος όπως αυτό. 827 00:42:22,270 --> 00:42:25,430 >> Τώρα στην επόμενη γραμμή * x παίρνει 42. 828 00:42:25,430 --> 00:42:29,400 Τι σημαίνει * x σημαίνει σε απλή γλώσσα; 829 00:42:29,400 --> 00:42:30,040 Απλά πηγαίνετε εκεί. 830 00:42:30,040 --> 00:42:30,960 Πηγαίνετε σε αυτή τη διεύθυνση. 831 00:42:30,960 --> 00:42:35,900 Ή με άλλα λόγια, ακολουθήστε τις βέλους και βάλτε 42 εκεί. 832 00:42:35,900 --> 00:42:38,140 Στη συνέχεια, όμως κάτι κακό συνέβη να Binky, έτσι δεν είναι; 833 00:42:38,140 --> 00:42:43,950 >> Υπενθυμίζουμε ότι η γραμμή πέντε εδώ, * y παίρνει 13, πράγματι, ένας άτυχος αριθμός, 834 00:42:43,950 --> 00:42:44,760 έκανε ό, τι για μας; 835 00:42:44,760 --> 00:42:47,320 Λοιπόν, * μέσα και πάνε εκεί. 836 00:42:47,320 --> 00:42:50,460 Λοιπόν, αυτό δεν έχει δοθεί μια τιμή ακόμα, έτσι δεν είναι; 837 00:42:50,460 --> 00:42:54,090 Ο κώδικας δεν έχει y είναι αρχικοποιείται σε τίποτα. 838 00:42:54,090 --> 00:42:56,120 Είχαμε x αρχικοποιείται σε μια διεύθυνση. 839 00:42:56,120 --> 00:42:57,640 Αλλά y κηρύχθηκε επάνω στην κορυφή. 840 00:42:57,640 --> 00:43:00,250 Στη συνέχεια, όμως ένα ερωτηματικό, δεν έχει αξία τέθηκε όντως σε αυτό. 841 00:43:00,250 --> 00:43:02,330 Έτσι είναι δίκαιο να καλέσετε αυτό μια τιμή σκουπιδιών. 842 00:43:02,330 --> 00:43:03,430 Ποιος ξέρει τι υπάρχει εκεί; 843 00:43:03,430 --> 00:43:07,160 Είναι τα απομεινάρια των bits που χρησιμοποιήθηκαν από κάποια προηγούμενη γραμμή κώδικα στο 844 00:43:07,160 --> 00:43:08,300 το πρόγραμμά μου. 845 00:43:08,300 --> 00:43:13,250 >> Έτσι, αν λέω πάμε εκεί, αυτό είναι σαν, Δεν έχω καμία ιδέα για το πού αυτό το βέλος 846 00:43:13,250 --> 00:43:14,490 πρόκειται να καταλήξουν. 847 00:43:14,490 --> 00:43:17,720 Και τότε είναι που συνήθως να πάρει ένα σφάλμα κατάτμησης. 848 00:43:17,720 --> 00:43:22,430 Εάν κατά λάθος dereference, έτσι ώστε να να μιλήσει, ή να πάτε σε μια διεύθυνση που δεν είναι 849 00:43:22,430 --> 00:43:25,400 πραγματικά μια νόμιμη διεύθυνση, κακά πράγματα να συμβούν. 850 00:43:25,400 --> 00:43:27,550 >> Και αυτό είναι ακριβώς αυτό που συνέβη να σκέφτονται Binky. 851 00:43:27,550 --> 00:43:31,060 Έτσι, υπενθυμίζουν ότι η ιστορία ότι ο Νικ ήταν λέει εδώ ήταν η ίδια ιδέα με το τι 852 00:43:31,060 --> 00:43:34,050 Έχω συντάσσεται με την ψευδαίσθηση της κιμωλία στον πίνακα εκεί. 853 00:43:34,050 --> 00:43:35,960 Χ και Υ έχουν δηλωθεί. 854 00:43:35,960 --> 00:43:39,690 >> Τότε θα διατεθεί το μέγεθος της μια int και τα αποθήκευε στο x. 855 00:43:39,690 --> 00:43:42,130 Στη συνέχεια, η επόμενη γραμμή που κάναμε * x. 856 00:43:42,130 --> 00:43:46,070 Αυτό ήταν το μαγικό ραβδί του Νικ της dereferencing. 857 00:43:46,070 --> 00:43:49,780 Αυτό κάνει 42 στη μνήμη επισημάνθηκε από x. 858 00:43:49,780 --> 00:43:51,600 >> Αλλά αυτό είναι όπου τα πράγματα εξελίχθηκαν φριχτά. 859 00:43:51,600 --> 00:43:51,820 Σωστά; 860 00:43:51,820 --> 00:43:53,550 Προσπαθήσαμε να y dereference. 861 00:43:53,550 --> 00:43:55,620 Αλλά y είχε κάποια ψευδή αξία, έτσι δεν είναι; 862 00:43:55,620 --> 00:43:57,720 >> Αυτό βέλος στην κάτω αριστερή γωνία, δεν είναι 863 00:43:57,720 --> 00:43:58,950 πραγματικότητα δείχνει σε τίποτα. 864 00:43:58,950 --> 00:44:01,520 Είναι το είδος του κάνει ό, τι έκανε εδώ στο διοικητικό συμβούλιο. 865 00:44:01,520 --> 00:44:05,900 Έτσι, συμβαίνουν άσχημα πράγματα, ο κατακερματισμός βλάβης, ή Binky βλάβης, σε αυτή την περίπτωση. 866 00:44:05,900 --> 00:44:10,800 >> Αλλά αν στη συνέχεια να καθορίσει ότι με αυτόν x παίρνει y πώς αλλάζει η ιστορία; 867 00:44:10,800 --> 00:44:15,760 Λοιπόν, αν το κάνω x παίρνει y, που είναι ουσιαστικά το ίδιο με το να λέμε 868 00:44:15,760 --> 00:44:19,235 ό, τι είναι αυτό, Ox-κάτι πρόκειται να είναι το ίδιο εδώ, 869 00:44:19,235 --> 00:44:20,080 Ox-κάτι. 870 00:44:20,080 --> 00:44:22,970 Ή εικονογραφικά θα συντάξει ένα βέλος. 871 00:44:22,970 --> 00:44:25,530 >> Έτσι, εδώ στο διοικητικό συμβούλιο με Binky, με την επόμενη γραμμή 872 00:44:25,530 --> 00:44:28,350 κώδικα, * y σημαίνει να πάει εκεί. 873 00:44:28,350 --> 00:44:29,400 Πού υπάρχει; 874 00:44:29,400 --> 00:44:30,820 Αυτό σημαίνει ότι πάνω από εδώ. 875 00:44:30,820 --> 00:44:36,050 >> Και όταν ενημερώσουμε ότι για να είναι 13 περιλαμβάνει ακριβώς πρόκειται και 876 00:44:36,050 --> 00:44:39,470 γραφής 13 εδώ τώρα. 877 00:44:39,470 --> 00:44:44,130 Έτσι, ίσως δεν είναι απόλυτα απλή με την πρώτη ματιά. 878 00:44:44,130 --> 00:44:47,740 Αλλά για να ανακεφαλαιώσουμε και να χρησιμοποιούν την ίδια ορολογία ότι Binky χρησιμοποιούσε εδώ, έτσι 879 00:44:47,740 --> 00:44:50,485 τα δύο πρώτα διαθέσει τους δείκτες, Χ και Υ, αλλά όχι τα pointees. 880 00:44:50,485 --> 00:44:54,750 Και pointees δεν αποτελεί γενικά χρησιμοποιείται ο όρος. 881 00:44:54,750 --> 00:44:56,120 Αλλά δείκτη είναι απολύτως. 882 00:44:56,120 --> 00:44:59,200 Αλλά τι να επισημανθεί σε στην ονοματολογία Binky του. 883 00:44:59,200 --> 00:45:01,660 >> Αυτή η επόμενη γραμμή, φυσικά, διαθέτει ένα int pointee. 884 00:45:01,660 --> 00:45:04,840 Έτσι, ένα μεγάλο κομμάτι της μνήμης - όπως μου επέστησε πάνω σε η δεξιά πλευρά εκεί - και σετ 885 00:45:04,840 --> 00:45:06,470 x ισούται με το σημείο σε αυτό. 886 00:45:06,470 --> 00:45:11,350 Αυτή x dereferences για την αποθήκευση 42 στην η μνήμη που να υποδεικνύουν. 887 00:45:11,350 --> 00:45:13,380 Και τότε αυτό, φυσικά, ήταν ένα κακό πράγμα. 888 00:45:13,380 --> 00:45:15,600 Επειδή η y δεν δείχνει σε τίποτα ακόμα. 889 00:45:15,600 --> 00:45:16,530 Αυτό που καθορίζει. 890 00:45:16,530 --> 00:45:18,240 Έτσι, αυτό εξακολουθεί να είναι προβληματικό πρόγραμμα. 891 00:45:18,240 --> 00:45:21,580 Ακριβώς επειδή είμαστε φυσάει μέσα από το γραμμή κώδικα από τη γραμμή και να λένε, OH καλά, 892 00:45:21,580 --> 00:45:22,690 ας συντριβή εκεί. 893 00:45:22,690 --> 00:45:23,420 Αυτό είναι ένα κακό πράγμα. 894 00:45:23,420 --> 00:45:26,790 Οι πιθανότητες είναι το πρόγραμμα είναι ακριβώς πρόκειται να ματαίωση συνολικά σε αυτή τη γραμμή. 895 00:45:26,790 --> 00:45:30,550 Αλλά αν ήταν να αφαιρέσετε την τράκαρε γραμμή και να την αντικαταστήσει με τα δύο τελευταία 896 00:45:30,550 --> 00:45:32,470 γραμμές εκεί εκχωρήσετε - 897 00:45:32,470 --> 00:45:35,310 με ανάθεση δείκτη - y να επισημάνει x ως t το σημείο. 898 00:45:35,310 --> 00:45:39,280 Και τότε θα dereference y σε ένα πολύ ασφαλή τρόπο. 899 00:45:39,280 --> 00:45:41,520 >> Έτσι, όταν το κάνει αυτό μας αφήνει; 900 00:45:41,520 --> 00:45:45,350 Λοιπόν, αποδεικνύεται ότι κάτω από το καπό στη βιβλιοθήκη CS50, δείκτες είναι 901 00:45:45,350 --> 00:45:46,320 χρησιμοποιούνται σε όλη. 902 00:45:46,320 --> 00:45:48,910 Και θα αρχίσει πραγματικά να φλοιό πίσω αυτό το στρώμα πριν από καιρό. 903 00:45:48,910 --> 00:45:51,740 Αλλά αποδεικνύεται, επίσης, μια έκφραση που κάποιοι από εσάς μπορεί να είναι εξοικειωμένοι με, 904 00:45:51,740 --> 00:45:54,580 ιδίως εκείνων πιο άνετη, είναι στην πραγματικότητα εκείνη ενός πολύ δημοφιλής 905 00:45:54,580 --> 00:45:56,390 ιστοσελίδα, ή από την υπερχείλιση στοίβας, αυτές τις μέρες. 906 00:45:56,390 --> 00:45:58,720 >> Αλλά αυτό έχει πραγματικά πολύ τεχνική έννοια. 907 00:45:58,720 --> 00:46:00,160 Γνωρίζουμε πλέον τι μια στοίβα είναι. 908 00:46:00,160 --> 00:46:02,550 Είναι σαν μια στοίβα των δίσκων μέσα σε μια τραπεζαρία. 909 00:46:02,550 --> 00:46:05,140 >> Ή στο εσωτερικό του υπολογιστή σας μνήμη του εκείνα τα πλαίσια 910 00:46:05,140 --> 00:46:06,900 που χρησιμοποιούνται από τις λειτουργίες. 911 00:46:06,900 --> 00:46:10,760 Λοιπόν, αποδεικνύεται ότι λόγω του ότι πολύ απλή εφαρμογή των 912 00:46:10,760 --> 00:46:14,970 μνήμη και τα πλαίσια για τη λεγόμενη στοίβα, μπορείτε να πάρετε πραγματικά τον έλεγχο 913 00:46:14,970 --> 00:46:17,050 ενός συστήματος ηλεκτρονικού υπολογιστή αρκετά εύκολα. 914 00:46:17,050 --> 00:46:22,180 Μπορείτε να χαράξει σε ένα σύστημα αν οι άνθρωποι σαν εμάς δεν έχουν γραπτό κώδικα μας 915 00:46:22,180 --> 00:46:23,300 ιδιαίτερα καλά. 916 00:46:23,300 --> 00:46:26,670 >> Αν άνθρωποι σαν εμάς χρησιμοποιούν κομμάτια της μνήμης ή τη χρήση συστοιχίες - 917 00:46:26,670 --> 00:46:27,810 ακόμη πιο συχνά - 918 00:46:27,810 --> 00:46:31,800 αλλά μερικές φορές ξεχνάτε να ελέγχετε το τα όρια του πίνακα μας όπως μπορείτε να 919 00:46:31,800 --> 00:46:38,470 έχετε τον εαυτό σας μερικές φορές, και επαναλαμβάνεται πάρα πολύ μακριά πέρα ​​από το τέλος μια σειρά. 920 00:46:38,470 --> 00:46:40,520 Στην καλύτερη περίπτωση, το πρόγραμμα σας θα μπορούσε απλώς συντριβή. 921 00:46:40,520 --> 00:46:42,280 Σφάλμα κατάτμησης, το είδος της ενοχλητικό. 922 00:46:42,280 --> 00:46:45,480 Δεν είναι μεγάλη, αλλά δεν είναι κατ 'ανάγκην ένα εξαιρετικά κακό πράγμα. 923 00:46:45,480 --> 00:46:49,480 >> Αλλά αν το πρόγραμμά σας είναι πραγματικά σε πραγματικές υπολογιστές των χρηστών, αν εκτελείται 924 00:46:49,480 --> 00:46:53,070 σε ένα δικτυακό τόπο που πραγματικά τυχαία άτομα στο διαδίκτυο είναι το χτύπημα, αφήνοντας 925 00:46:53,070 --> 00:46:56,690 οι άνθρωποι προκαλούν άσχημα πράγματα για τον κωδικό σας γενικά δεν είναι καλό πράγμα, επειδή 926 00:46:56,690 --> 00:46:59,930 αυτό σημαίνει ότι η δυνατότητα να λάβει τον έλεγχο του υπολογιστή. 927 00:46:59,930 --> 00:47:01,350 Και αυτό πρόκειται να δούμε λίγο αινιγματικό. 928 00:47:01,350 --> 00:47:04,570 Αλλά σκέφτηκα να σας τρομάξει με την Αυτό το τελευταίο παράδειγμα εδώ. 929 00:47:04,570 --> 00:47:05,650 >> Εδώ είναι ένα παράδειγμα του κώδικα. 930 00:47:05,650 --> 00:47:07,370 Και υπάρχει μια καλή Wikipedia άρθρο που καθοδηγεί 931 00:47:07,370 --> 00:47:08,530 αυτό με περισσότερες λεπτομέρειες. 932 00:47:08,530 --> 00:47:13,890 Έχω κυρίως στο κάλεσμα κάτω foo, περνώντας argv 1. 933 00:47:13,890 --> 00:47:15,750 Και αυτό είναι ακριβώς έτσι ώστε να μπορείτε να τρέξει το πρόγραμμα και να περάσει 934 00:47:15,750 --> 00:47:17,080 αυθαίρετη είσοδο. 935 00:47:17,080 --> 00:47:20,180 >> Και τότε foo δηλώνεται επάνω στην κορυφή ως αποδοχή μιας συμβολοσειράς, ή περισσότερα 936 00:47:20,180 --> 00:47:21,700 Συγκεκριμένα, μια χαρα *. 937 00:47:21,700 --> 00:47:23,860 Δηλώνει στη συνέχεια μια σειρά από χαρακτήρες. 938 00:47:23,860 --> 00:47:27,130 Καλέστε ένα buffer, γενικότερα, μεγέθους 12. 939 00:47:27,130 --> 00:47:30,900 Μέχρι 12 χαρακτήρες μπορούν να χωρέσουν μέσα του εν λόγω πίνακα που ονομάζεται c. 940 00:47:30,900 --> 00:47:33,510 >> Και τότε χρησιμοποιεί αυτή τη νέα λειτουργία, η οποία είναι νέα, αλλά δεν είναι δύσκολο να 941 00:47:33,510 --> 00:47:34,930 καταλαβαίνουν, αντίγραφο μνήμης. 942 00:47:34,930 --> 00:47:39,290 Αυτό αντιγράφει τη μνήμη από το μπαρ, το οποίο ήταν η μεταβλητή n παρελθόν, ανεξάρτητα από το 943 00:47:39,290 --> 00:47:42,080 χρήστης πληκτρολογήσει στο argv 1 σε c. 944 00:47:42,080 --> 00:47:43,090 Πόσα bytes; 945 00:47:43,090 --> 00:47:44,260 Το μήκος του νήματος του μπαρ. 946 00:47:44,260 --> 00:47:48,380 >> Έτσι, με άλλα λόγια, αν ο χρήστης πληκτρολογεί σε h-e-l-l-o Enter, το μήκος της συμβολοσειράς 947 00:47:48,380 --> 00:47:49,260 του Hello είναι πέντε. 948 00:47:49,260 --> 00:47:52,790 Έτσι, πέντε από αυτά τα bytes πρόκειται να πάρει αντιγράφονται στο πίνακα που ονομάζεται C, η οποία 949 00:47:52,790 --> 00:47:54,110 έχει μέγεθος 12. 950 00:47:54,110 --> 00:47:58,710 Αλλά αυτό που ο χρήστης πληκτρολογεί σε ένα πολύ μεγαλύτερο λέξη που είναι 13 χαρακτήρες ή 14 951 00:47:58,710 --> 00:48:01,250 χαρακτήρες ή 100 χαρακτήρες ή περισσότερο; 952 00:48:01,250 --> 00:48:02,660 >> Πού θα πάμε; 953 00:48:02,660 --> 00:48:06,090 Λοιπόν, αυτό το πλαίσιο, ο δίσκος αυτός στην αίθουσα φαγητού στοίβα, 954 00:48:06,090 --> 00:48:06,930 θα πάμε για να πάει εκεί. 955 00:48:06,930 --> 00:48:10,080 Και είναι ακριβώς πρόκειται να ξεκινήσει την αντικατάσταση άλλα πράγματα που είναι ήδη 956 00:48:10,080 --> 00:48:12,880 στην εν λόγω στοίβα, ξεχειλίζει η στοίβα, να το πω έτσι. 957 00:48:12,880 --> 00:48:14,780 >> Έτσι, εικαστικά, σκεφτείτε το αυτό τον τρόπο. 958 00:48:14,780 --> 00:48:17,970 Αυτό είναι μόνο ένα πολύχρωμο έκδοση η εικόνα που έχουμε σχέδιο. 959 00:48:17,970 --> 00:48:20,060 Στο κάτω μέρος, ας πούμε, είναι το κύριο. 960 00:48:20,060 --> 00:48:24,690 Και στην κορυφή, αυτό που βλέπουμε τώρα είναι το πλαίσιο, χρώμα που κωδικοποιείται τώρα, για ένα 961 00:48:24,690 --> 00:48:26,090 λειτουργία που ονομάζεται foo. 962 00:48:26,090 --> 00:48:30,170 Αλλά αυτό που είναι ενδιαφέρον εδώ για foo είναι ότι εδώ είναι το πλαίσιό του. 963 00:48:30,170 --> 00:48:32,860 Έτσι είναι που ακριβώς όπως εγώ έκανε, αλλά το γαλάζιο. 964 00:48:32,860 --> 00:48:35,220 Και τώρα αυτό είναι όπου γ βραχίονα 0 πηγαίνει. 965 00:48:35,220 --> 00:48:37,410 Και αυτό είναι όπου c βραχίονα 11 πρόκειται να καταλήξει. 966 00:48:37,410 --> 00:48:39,670 >> Με άλλα λόγια, αυτό συμβαίνει σε να εκπροσωπούνται ως ένα τετράγωνο. 967 00:48:39,670 --> 00:48:42,320 Αλλά αν απλά κρατήσει plopping bytes κάτω - ή χαρακτήρες - από όπου και αν πρόκειται να τελειώσει 968 00:48:42,320 --> 00:48:46,070 up στη θέση 0 σε όλη τη διαδρομή μέχρι σε 11 επειδή είναι 0 ευρετήριο. 969 00:48:46,070 --> 00:48:49,170 >> Αλλά πού είναι ο 13ος χαρακτήρας πρόκειται να καταλήξει; 970 00:48:49,170 --> 00:48:50,310 Πού είναι η 14η; 971 00:48:50,310 --> 00:48:52,430 Πού είναι η 50η χαρακτήρα πρόκειται να καταλήξει; 972 00:48:52,430 --> 00:48:54,070 >> Δεν πρόκειται να συνεχίσω κάτω. 973 00:48:54,070 --> 00:48:57,350 Διότι ακόμα κι αν έχουμε κληρωθεί εικόνα με τη στοίβα μεγαλώνει, η 974 00:48:57,350 --> 00:48:59,920 διευθύνσεις, αποδεικνύεται, πάει από μικρές διευθύνσεις, μικρές 975 00:48:59,920 --> 00:49:01,830 δείκτες, σε μεγάλες διευθύνσεις. 976 00:49:01,830 --> 00:49:03,540 Γι 'αυτό συνεχίζει να ανεβαίνει και πάνω. 977 00:49:03,540 --> 00:49:05,660 >> Έτσι, αν ο χρήστης πληκτρολογεί σε Γεια σας, αυτό είναι υπέροχο. 978 00:49:05,660 --> 00:49:08,650 Δεν bug, δεν υπάρχει πρόβλημα, ασφαλή καθενός. 979 00:49:08,650 --> 00:49:11,940 Αλλά αν ο χρήστης πληκτρολογεί σε τι θα καλέστε εκατέρωθεν κώδικα, εκπροσωπούμενη 980 00:49:11,940 --> 00:49:16,040 γενικά ως, επίθεση, επίθεση, επίθεση, επίθεση, τι μπορεί να συμβεί; 981 00:49:16,040 --> 00:49:19,760 >> Λοιπόν, αν το σύνολο των εισροών που ο χρήστης πληκτρολογήσει δεν είναι μόνο μερικά φιλικά 982 00:49:19,760 --> 00:49:21,540 ή προσβλητικό σειρά χαρακτήρων. 983 00:49:21,540 --> 00:49:24,050 Είναι πραγματικά μια ακολουθία χαρακτήρων ότι αν το συνέταξε, 984 00:49:24,050 --> 00:49:26,050 στην πραγματικότητα είναι κώδικα. 985 00:49:26,050 --> 00:49:29,570 Ίσως πρόκειται για κώδικα που διαγράφει όλα τα αρχεία στο σκληρό σας δίσκο ή να στέλνει το spam 986 00:49:29,570 --> 00:49:30,810 ή κάτι τέτοιο. 987 00:49:30,810 --> 00:49:35,110 Σημειώστε ότι αυτό είναι το κλειδί εδώ είναι ότι αν ο κακός έχεις την τύχη να 988 00:49:35,110 --> 00:49:37,830 αντικαταστήσετε το κόκκινο κομμάτι της μνήμης - 989 00:49:37,830 --> 00:49:41,080 το οποίο δεν είχα επιστήσει στην εικόνα μου, αλλά αυτή η εικόνα Wikipedia έχει εδώ - 990 00:49:41,080 --> 00:49:42,890 λεγόμενη διεύθυνση της επιστροφής. 991 00:49:42,890 --> 00:49:47,470 >> Όταν οι αποδόσεις των τροφίμων, όταν επιστρέφει swap, πώς ο υπολογιστής ξέρει να πάει από 992 00:49:47,470 --> 00:49:49,790 εδώ πάνω προς τα κάτω εδώ; 993 00:49:49,790 --> 00:49:52,920 Ή στην τεχνολογία τμήμα από πάνω, πώς το ξέρει να πάει από τη συμφωνία ανταλλαγής 994 00:49:52,920 --> 00:49:54,870 - Ο κωδικός 0 και του 1 που συνθέτουν ανταλλαγής - 995 00:49:54,870 --> 00:49:56,020 επιστροφή στην κεντρική σελίδα; 996 00:49:56,020 --> 00:50:00,450 Υπάρχει η λεγόμενη διεύθυνση επιστροφής αποθηκεύονται στην ίδια στοίβα πλαίσιο, για 997 00:50:00,450 --> 00:50:02,140 το ίδιο δίσκο καφετέρια. 998 00:50:02,140 --> 00:50:06,080 >> Έτσι, αν ο κακός είναι αρκετά έξυπνος για να θέσει τον κωδικό επίθεση, κωδικό επίθεση, επίθεση 999 00:50:06,080 --> 00:50:07,960 κώδικα, και να πάρει την τύχη - 1000 00:50:07,960 --> 00:50:11,630 συχνά μέσω της δοκιμής και του λάθους - για να αντικαταστήσετε το κόκκινο διεύθυνση επιστροφής, 1001 00:50:11,630 --> 00:50:14,360 με τη διεύθυνση και ανακοίνωση την κορυφή. 1002 00:50:14,360 --> 00:50:16,830 Ανακοίνωση 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Είναι γραμμένο πίσω επάνω στην κορυφή για λόγους θα ίσως να επανεξετάσουμε. 1004 00:50:20,650 --> 00:50:22,050 Αυτός είναι ο αριθμός. 1005 00:50:22,050 --> 00:50:25,790 >> Έτσι, αν ο κακός τύπος παίρνει την τύχη ή Είναι αρκετά έξυπνος για να αντικαταστήσετε το κόκκινο 1006 00:50:25,790 --> 00:50:29,480 λωρίδα της μνήμης με τη διεύθυνση του κώδικα που αυτός ή αυτή έχει κατά κάποιο τρόπο 1007 00:50:29,480 --> 00:50:34,980 εγχέεται στον υπολογιστή σας, υποθέτω οποίων κώδικας πρόκειται να επιστραφεί 1008 00:50:34,980 --> 00:50:38,260 συντομότερο foo γίνεται εκτέλεσης; 1009 00:50:38,260 --> 00:50:39,440 >> Ο κώδικας του κακός. 1010 00:50:39,440 --> 00:50:43,610 Έτσι, αυτού του κώδικα επίθεσης, AAA, και πάλι, θα μπορούσε στέλνουν spam, να διαγράψετε όλα τα αρχεία 1011 00:50:43,610 --> 00:50:44,500 στο σκληρό σας δίσκο. 1012 00:50:44,500 --> 00:50:48,740 Αλλά αυτό είναι πραγματικά μια υπερχείλιση στοίβας είναι, ή υπέρβαση του buffer, ή 1013 00:50:48,740 --> 00:50:51,060 buffer επίθεση υπερχείλισης. 1014 00:50:51,060 --> 00:50:54,400 >> Και είναι απίστευτα, απίστευτα κοινό σε αυτήν την ημέρα με τα προγράμματα που είναι γραμμένα σε 1015 00:50:54,400 --> 00:50:58,220 C, C + +, και ακόμη και μερικές άλλες γλώσσες. 1016 00:50:58,220 --> 00:51:02,275 Σε αυτό το τρομακτικό σημείωμα, θα τελειώνει με ένα αστείο. 1017 00:51:02,275 --> 00:51:03,230 >> [Γέλια] 1018 00:51:03,230 --> 00:51:04,550 >> Τα λέμε την Τετάρτη. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Στο επόμενο CS50 - 1021 00:51:10,310 --> 00:51:15,920 Έτσι, είμαι όλοι έξω από λαμπτήρες δίσκο σήμερα, αλλά περιμένετε, χωρίς λιπαρά γάλα, μισό το τηλέφωνο 1022 00:51:15,920 --> 00:51:17,850 βιβλίο, ο χυμός πορτοκαλιού ότι έπινα σήμερα. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Καλώδιο USB, ένα γαλλικό κλειδί. 1025 00:51:22,780 --> 00:51:24,800 >> [Παίζει μουσική]