>> [Παίζει μουσική]
>> DOUG LLOYD: Δείκτες, εδώ είμαστε.
Αυτό κατά πάσα πιθανότητα πρόκειται να είναι το πιο δύσκολο θέμα
ότι μιλάμε για σε CS50.
Και αν έχετε διαβάσει τίποτα για τους δείκτες
πριν ίσως να είναι λίγο εκφοβισμό υπεισέλθω σε αυτό το βίντεο.
Είναι αλήθεια ότι οι δείκτες σας επιτρέπουν την δυνατότητα
να ίσως βίδα μέχρι αρκετά άσχημα όταν είστε
σε συνεργασία με τις μεταβλητές, και τα δεδομένα, και προκαλώντας το πρόγραμμά σας για να συντρίψει.
Αλλά είναι πραγματικά πολύ χρήσιμο και μας ένα πραγματικά πολύ καλός τρόπος για να επιτρέψει
για να περάσει πίσω τα δεδομένα και πίσω μεταξύ των λειτουργιών,
ότι είμαστε διαφορετικά σε θέση να κάνει.
>> Και έτσι αυτό που πραγματικά θέλουμε να κάνουμε εδώ είναι το τρένο
να έχετε καλή δείκτη πειθαρχίας, έτσι που μπορείτε να χρησιμοποιήσετε δείκτες αποτελεσματικά
για να κάνουν τα προγράμματά σας που πολύ καλύτερα.
Όπως είπα δείκτες μας δίνουν μια διαφορετική τρόπος για να περάσει τα δεδομένα μεταξύ των λειτουργιών.
Τώρα, αν θυμάστε από ένα προηγούμενο βίντεο, όταν
μιλούσαμε για εμβέλεια των μεταβλητών, ανέφερα
ότι όλα τα δεδομένα που διέρχονται μεταξύ λειτουργίες σε C έχει περάσει από την αξία.
Και δεν μπορεί να χρησιμοποιηθεί η όρου, αυτό που εννοούσα εκεί
ήταν ότι περνάμε αντίγραφα των δεδομένων.
Όταν περνάμε μια μεταβλητή σε μια συνάρτηση, δεν είμαστε στην πραγματικότητα περνά η μεταβλητή
για τη λειτουργία, έτσι δεν είναι;
Είμαστε περνώντας ένα αντίγραφο της ότι τα δεδομένα με τη λειτουργία.
Η λειτουργία κάνει ό, τι θα και υπολογίζει κάποια αξία,
και ίσως θα χρησιμοποιήσει αυτή την τιμή όταν δίνει πίσω.
>> Υπήρχε μία εξαίρεση Αυτός ο κανόνας που περνούν από την αξία,
και θα επανέλθω σε αυτό που είναι λίγο αργότερα σε αυτό το βίντεο.
Αν χρησιμοποιούμε δείκτες, αντί της χρήσης μεταβλητών,
ή αντί του, χρησιμοποιώντας τις μεταβλητές οι ίδιοι ή αντίγραφα των μεταβλητών,
μπορούμε τώρα να περάσει γύρω από τις μεταβλητές μεταξύ των λειτουργιών με έναν διαφορετικό τρόπο.
Αυτό σημαίνει ότι αν κάνουμε μια αλλαγή σε μια λειτουργία,
ότι η αλλαγή θα λάβει πράγματι πραγματοποιηθεί σε μια διαφορετική λειτουργία.
Και πάλι, αυτό είναι κάτι που δεν θα μπορούσαμε να κάνουμε στο παρελθόν,
και αν έχετε δοκιμάσει ποτέ να ανταλλάξει το αξία των δύο μεταβλητών σε μια λειτουργία,
έχετε παρατηρήσει αυτό το πρόβλημα είδος ανοδική πορεία, έτσι δεν είναι;
>> Αν θέλουμε να ανταλλάξουν Χ και Υ, και εμείς τους περάσει σε μια λειτουργία που ονομάζεται swap,
στο εσωτερικό της συνάρτησης ανταλλάξουν το μεταβλητές κάνει ανταλλακτικές αξίες.
Ένα γίνεται δύο, γίνεται μία, αλλά δεν το κάνουμε πραγματικότητα
αλλάξει τίποτα στην αρχική τη λειτουργία, στο καλούντα.
Επειδή δεν μπορούμε, είμαστε μόνο σε συνεργασία με αντίγραφά τους.
Με δείκτες όμως, μπορούμε να στην πραγματικότητα περνούν Χ και Υ σε λειτουργία.
Αυτή η λειτουργία μπορεί να κάνει κάτι μαζί τους.
Και αυτές οι τιμές των μεταβλητών μπορεί πραγματικά να αλλάξει.
Έτσι, αυτό είναι μια αλλαγή στο ικανότητά μας να εργαστούμε με τα δεδομένα.
>> Πριν βουτήξει δείκτες, νομίζω ότι αξίζει τον κόπο
λαμβάνοντας λίγα λεπτά για να πάει πίσω στα βασικά εδώ.
Και κοιτάξτε πώς έργα μνήμη του υπολογιστή
επειδή αυτά τα δύο θέματα θα να είναι πραγματικά πολύ αλληλένδετα.
Όπως ίσως γνωρίζετε, στο σύστημα του υπολογιστή σας
έχετε ένα σκληρό δίσκο ή ίσως μια μονάδα SSD,
κάποιο είδος της τοποθεσίας αποθήκευσης του αρχείου.
Είναι συνήθως κάπου στο γειτονιά των 250 gigabytes
με ίσως ένα ζευγάρι των terabytes τώρα.
Και αυτό είναι όπου όλοι σας Αρχεία τελικά ζουν,
ακόμα και όταν ο υπολογιστής σας είναι κλειστός μακριά, μπορείτε να το ενεργοποιήσετε ξανά
και θα βρείτε τα αρχεία σας υπάρχουν ξανά όταν κάνετε επανεκκίνηση του συστήματός σας.
Αλλά δίσκους, όπως ένα σκληρό δίσκο, μονάδα σκληρού δίσκου ή μια μονάδα SSD, η μονάδα SSD,
είναι μόνο αποθηκευτικό χώρο.
>> Δεν μπορούμε να κάνουμε τίποτα στην πραγματικότητα με τα δεδομένα που είναι στο σκληρό δίσκο,
ή σε μια μονάδα SSD.
Για να αλλάξει πραγματικά δεδομένα ή να το μετακινήσετε γύρω,
θα πρέπει να το μετακινήσετε σε RAM, μνήμη τυχαίας προσπέλασης.
Τώρα RAM, έχετε πολλά λιγότερο του στον υπολογιστή σας.
Μπορεί να έχετε κάπου στο γειτονιά των 512 megabytes
αν έχετε ένα παλαιότερο υπολογιστή, με ίσως δύο, τέσσερις, οκτώ, 16,
ενδεχομένως ακόμη και ένα μικρό Επιπλέον, gigabytes μνήμης RAM.
Έτσι, αυτό είναι πολύ μικρότερο, αλλά αυτό είναι όπου όλα τα πτητικά στοιχεία υπάρχει.
Αυτός είναι όπου μπορούμε να αλλάξουμε τα πράγματα.
Αλλά όταν κλείνετε τον υπολογιστή μας μακριά, όλα τα δεδομένα στη μνήμη RAM καταστρέφεται.
>> Έτσι, γι 'αυτό πρέπει να έχουμε στο σκληρό δίσκο για τους πιο μόνιμη θέση του,
έτσι ώστε θα ήταν exists- είναι πραγματικά κακή, αν κάθε φορά που
γύρισε υπολογιστή μας μακριά, κάθε αρχείο στο σύστημά μας καταστράφηκε ολοσχερώς.
Γι 'αυτό και εργάζονται μέσα της μνήμης RAM.
Και κάθε φορά που μιλάμε για μνήμη, λίγο πολύ, σε CS50,
μιλάμε για μνήμη RAM, σκληρό δίσκο δεν είναι.
>> Έτσι, όταν θα κινηθούν τα πράγματα στη μνήμη, καταλαμβάνει ένα ορισμένο ποσό του χώρου.
Όλα τα τύπων δεδομένων που έχουμε εργαστεί με
λαμβάνουν διαφορετικές ποσά του χώρου στη μνήμη RAM.
Έτσι, κάθε φορά που δημιουργείτε έναν ακέραιο μεταβλητή, τέσσερα bytes της μνήμης
Οι αναιρέσει στη μνήμη RAM, έτσι ώστε να μπορεί να λειτουργήσει με αυτό το ακέραιο.
Μπορείτε να δηλώσετε το ακέραιο, αλλάξετε, να αναθέσει
σε μία τιμή 10 αυξάνεται από ένα, ούτω καθεξής και ούτω καθεξής.
Το μόνο που χρειάζεται να συμβεί σε RAM, και έχετε τέσσερα bytes
να συνεργαστεί με κάθε για ακέραιος που δημιουργείτε.
>> Κάθε χαρακτήρας σας δημιουργήσετε παίρνει ένα byte.
Αυτό είναι ακριβώς πόσος χώρος υπάρχει απαιτείται για την αποθήκευση ενός χαρακτήρα.
Κάθε float, ένα πραγματικό τον αριθμό, παίρνει τέσσερα bytes
εκτός αν είναι ένα διπλό ακρίβειας κινητής υποδιαστολής
αριθμός, το οποίο σας επιτρέπει να έχουμε πιο ακριβείς ή περισσότερα ψηφία
μετά την υποδιαστολή χωρίς απώλεια ακρίβειας,
που καταλαμβάνουν οκτώ bytes της μνήμης.
Μακριά λαχταρά, πραγματικά μεγάλο ακέραιοι, επίσης να λάβουν οκτώ bytes της μνήμης.
Πόσα bytes της μνήμης δεν χορδές καταλαμβάνουν;
Λοιπόν ας βάλουμε μια καρφίτσα στο ερώτημα αυτό για τώρα, αλλά θα επανέλθουμε σε αυτό.
>> Έτσι, πίσω σε αυτήν την ιδέα της μνήμης μια μεγάλη σειρά από byte μεγέθους κυττάρων.
Αυτό είναι πραγματικά όλα είναι, ότι είναι απλά μια τεράστια ποικιλία κυττάρων,
ακριβώς όπως και κάθε άλλο πίνακα που είστε εξοικειωμένοι με και δείτε,
με εξαίρεση κάθε στοιχείο είναι ένα byte ευρύ.
Και ακριβώς όπως έναν πίνακα, Κάθε στοιχείο έχει μια διεύθυνση.
Κάθε στοιχείο ενός πίνακα έχει δείκτη, και εμείς
μπορεί να χρησιμοποιήσει αυτό το ευρετήριο για να κάνει το λεγόμενο τυχαίας πρόσβασης στη συστοιχία.
Δεν έχουμε να ξεκινήσει στις η αρχή της συστοιχίας,
επαναλαμβάνεται σε κάθε μονό στοιχείο αυτής,
για να βρείτε αυτό που ψάχνετε.
Εμείς απλά να πούμε, θέλω να πάρω για να το 15ο στοιχείο ή η 100η στοιχείο.
Και μπορείτε να περάσετε μόνο σε αυτόν τον αριθμό και να πάρει την αξία που ψάχνετε.
>> Ομοίως, κάθε τοποθεσία στη μνήμη έχει μια διεύθυνση.
Έτσι, η μνήμη σας θα μπορούσε δείτε κάτι σαν αυτό.
Εδώ είναι ένα πολύ μικρό κομμάτι της μνήμη, αυτό είναι 20 bytes της μνήμης.
Τα πρώτα 20 bytes, διότι μου αντιμετωπίζει εκεί στο κάτω μέρος
είναι 0, 1, 2, 3, και έτσι για όλη τη διαδρομή μέχρι το 19.
Και όταν δηλώνω μεταβλητές και Όταν αρχίζω να συνεργαστούμε μαζί τους,
το σύστημα πρόκειται να οριστεί στην άκρη κάποιος χώρος για μένα
σε αυτή τη μνήμη για να εργαστούν με μεταβλητές μου.
Έτσι, θα έλεγα, char c ισούται κεφαλαίου Η Και τι πρόκειται να συμβεί;
Καλά το σύστημα πρόκειται να που προορίζεται για μένα ένα byte.
Στην περίπτωση αυτή, επέλεξε τον αριθμό byte τέσσερα, το byte στη διεύθυνση τέσσερις,
και πρόκειται να αποθηκεύσετε το κεφαλαίο γράμμα H εκεί για μένα.
Εάν λοιπόν εγώ να πω ταχύτητας int όριο ισοδυναμεί με το 65, είναι
πρόκειται να αναιρέσει τέσσερις bytes της μνήμης για μένα.
Και πρόκειται για τη θεραπεία εκείνων τέσσερις ψηφιολέξεις ως ενιαία μονάδα
γιατί ό, τι δουλεύουμε με είναι ένας ακέραιος εδώ.
Και πρόκειται για την αποθήκευση 65 εκεί.
>> Τώρα που δεν είμαι το είδος του λέγοντάς σας ένα κομμάτι από ένα ψέμα,
δεξιά, επειδή γνωρίζουμε ότι υπολογιστές λειτουργούν σε δυαδικό.
Δεν καταλαβαίνουν απαραίτητα ό, τι ένα κεφάλαιο H είναι
ή τι είναι το 65, που μόνο κατανοήσει δυαδικό, μηδενικά και μονάδες.
Και έτσι πραγματικά ό, τι είμαστε αποθήκευση εκεί
Δεν είναι το γράμμα Η και ο αριθμός 65, αλλά μάλλον οι δυαδικές αναπαραστάσεις
αυτών, τα οποία φαίνονται κάτι σαν αυτό.
Και ειδικότερα στην πλαίσιο της μεταβλητής ακέραιος,
δεν πρόκειται να το φτύσει ακριβώς σε, δεν πρόκειται να την αντιμετωπίσουμε ως μια τέσσερις
byte κομμάτι κατ 'ανάγκην, αυτό είναι πραγματικά συμβαίνει
να την αντιμετωπίσουμε ως ένα τέσσερα κομμάτια byte, η οποία μπορεί να μοιάζει κάπως έτσι.
Και ακόμη και αυτό δεν είναι είτε εντελώς αλήθεια,
γιατί για κάτι που ονομάζεται μια endianness, το οποίο δεν είμαστε
πρόκειται να μπει σε τώρα, αλλά αν είστε περίεργοι σχετικά,
μπορείτε να διαβάσετε για λίγο και μεγάλα endianness.
Αλλά για χάρη του επιχειρήματος αυτού, για χάρη αυτού του βίντεο,
ας υποθέσουμε ότι είναι, σε γεγονός, πως ο αριθμός 65 θα
να εκπροσωπούνται σε μνήμης σε κάθε σύστημα,
αν και δεν είναι απόλυτα αληθές.
>> Αλλά ας πραγματικά να πάρετε μόνο απαλλαγούμε από όλες τις δυαδικές εξ ολοκλήρου,
και απλά σκεφτείτε τα H και 65, είναι πολύ πιο εύκολο
να το σκεφτώ, όπως ότι ως ένα ανθρώπινο ον.
Εντάξει, έτσι φαίνεται, επίσης, ίσως λίγο τυχαίο ότι I've- σύστημα μου
δεν μου δώσει bytes 5, 6, 7, και 8 για να αποθηκεύσετε το ακέραιο.
Υπάρχει ένας λόγος γι 'αυτό, πάρα πολύ, η οποία δεν θα μπει σε αυτή τη στιγμή, αλλά αρκεί
να πω ότι αυτό το υπολογιστής κάνει εδώ
είναι πιθανώς μια καλή κίνηση από την πλευρά της.
Για να μην μου δώσει μνήμης που είναι αναγκαστικά πίσω στην πλάτη.
Παρά το γεγονός ότι πρόκειται να το κάνουμε τώρα αν θέλω να πάρω ένα άλλο string,
κάλεσε το επώνυμο, και θέλω να θέσει Lloyd εκεί.
Πάω να πρέπει να εντάσσονται σε μία χαρακτήρα, κάθε γράμμα που είναι
πρόκειται να απαιτήσει ένα χαρακτήρας, ένα byte της μνήμης.
Έτσι, αν θα μπορούσα να βάλω σε σειρά Lloyd μου όπως αυτό είμαι αρκετά καλός για να πάει, έτσι δεν είναι;
Τι λείπει;
>> Να θυμάστε ότι κάθε χορδή δουλεύουμε με σε C τελειώνει με ανάστροφη κάθετο μηδέν,
και δεν μπορούμε να παραλείψουμε ότι εδώ, είτε.
Θα πρέπει να αναιρέσει ένα byte της μνήμης για να κρατήσει ότι γι 'αυτό
ξέρεις πότε εγχόρδων μας έχει τελειώσει.
Έτσι και πάλι η ρύθμιση αυτή από τα πράγματα
εμφανίζονται στην δύναμη της μνήμης είναι λίγο τυχαίο,
αλλά στην πραγματικότητα είναι το πώς Τα περισσότερα συστήματα σχεδιασμένα.
Για να τους παρατάξει σε πολλαπλάσια των τεσσάρων, και πάλι για λόγους
ότι δεν χρειάζεται να μπει σε αυτή τη στιγμή.
Αλλά αυτό, γι 'αυτό αρκεί να πούμε ότι μετά από αυτές τις τρεις γραμμές κώδικα,
Αυτό είναι ό, τι μνήμη μπορεί να μοιάζει.
Αν χρειάζομαι θέσεις μνήμης 4, 8, 12 και να κρατήσει τα δεδομένα μου,
Αυτό είναι ό, τι η μνήμη μου να μοιάσει.
>> Και απλά να είναι ιδιαίτερα σχολαστικός εδώ, όταν
μιλάμε για τη μνήμη διευθύνσεις που συνήθως
πράξουν χρησιμοποιώντας δεκαεξαδικό συμβολισμοί.
Γιατί λοιπόν να μην έχουμε μετατρέψει όλα αυτά από δεκαδικό σε δεκαεξαδικό σύστημα
μόνο και μόνο επειδή αυτό είναι γενικά πώς αναφερόμαστε στη μνήμη.
Έτσι, αντί να είναι από 0 έως 19, αυτό που έχουμε είναι μηδενική
x μηδέν έως τρεις x1 μηδέν.
Αυτά είναι τα 20 bytes της μνήμης που θα έχουν ή κοιτάμε σε αυτή την εικόνα
ακριβώς εδώ.
>> Έτσι, όλα αυτά που είπε, ας βήμα μακριά από τη μνήμη για δεύτερη
και πίσω σε δείκτες.
Εδώ είναι το πιο σημαντικό πράγμα που πρέπει να θυμάστε
καθώς αρχίσουν να εργάζονται με δείκτες.
Ένας δείκτης είναι τίποτα περισσότερο από μια διεύθυνση.
Θα το πω και πάλι, επειδή Είναι σημαντικό ότι,
ένας δείκτης είναι τίποτα περισσότερο από μια διεύθυνση.
Οι pointers είναι διευθύνσεις σε θέσεις στη μνήμη όπου ζουν οι μεταβλητές.
Γνωρίζοντας ότι γίνεται ελπίζουμε λίγο πιο εύκολο να εργαστεί μαζί τους.
Ένα άλλο πράγμα που μου αρέσει να κάνουμε είναι να έχουμε το είδος
διαγραμμάτων που αντιπροσωπεύουν οπτικά τι είναι συμβαίνει με διάφορες γραμμές κώδικα.
Και θα το κάνουμε αυτό ένα ζευγάρι φορές σε δείκτες,
και όταν μιλάμε για δυναμική κατανομή της μνήμης, καθώς και.
Γιατί νομίζω ότι αυτά τα διαγράμματα μπορεί να είναι ιδιαίτερα χρήσιμη.
>> Έτσι, αν μπορώ να πω, για παράδειγμα, int k τον κωδικό μου, τι συμβαίνει;
Λοιπόν τι ουσιαστικά συμβαίνει είναι Παίρνω μνήμης που προορίζονται για μένα,
αλλά δεν μου αρέσει καν να σκέφτομαι έτσι, εγώ
ήθελα να το σκέφτομαι σαν ένα κουτί.
Έχω ένα κουτί και είναι χρώματος πράσινου γιατί
μπορεί να βάλει ακέραιοι σε πράσινα κουτιά.
Αν ήταν ένας χαρακτήρας μου θα μπορούσε να έχει ένα μπλε πλαίσιο.
Αλλά λέω πάντα, αν είμαι δημιουργώντας ένα κουτί που μπορεί να κρατήσει ακέραιους αριθμούς
ότι το πλαίσιο είναι πράσινου χρώματος.
Και παίρνω ένα ανεξίτηλο μαρκαδόρο και γράφω k από την πλευρά του.
Έτσι έχω ένα κουτί που ονομάζεται k, στο οποίο μπορώ να βάλω ακέραιοι.
Έτσι, όταν λέω int k, που είναι τι συμβαίνει στο κεφάλι μου.
Αν πω k ισούται με πέντε, τι κάνω;
Λοιπόν, βάζω πέντε στο πλαίσιο, δεξιά.
Αυτό είναι αρκετά απλή, αν Λέω int k, δημιουργούν ένα πλαίσιο που ονομάζεται k.
Αν πω k ισούται με 5, βάλει πέντε στο κουτί.
Ας ελπίσουμε ότι δεν είναι πάρα πολύ από ένα άλμα.
Εδώ είναι όπου τα πράγματα πάνε μια λίγο ενδιαφέρον όμως.
Αν πω int * pk, αλλά ακόμα κι αν δεν το κάνω ξέρετε τι αυτό σημαίνει κατ 'ανάγκη,
αυτό είναι σαφώς κάτι που έχεις να κάνει με ένα ακέραιο.
Έτσι, Πάω να χρωματίσει αυτό το πλαίσιο πράσινο-ish,
Ξέρω ότι έχεις κάτι να κάνει με ένα ακέραιο,
αλλά δεν είναι το ίδιο ο ακέραιος, επειδή είναι ένα αστέρι int.
Υπάρχει κάτι ελαφρώς διαφορετικό γι 'αυτό.
Έτσι συμμετέχει ένας ακέραιος, το αλλά κατά τα άλλα είναι
δεν είναι πολύ διαφορετικό από τι πράγμα μιλάμε.
Είναι ένα κουτί, πήρε τους μια ετικέτα, αυτό είναι φορώντας ένα pk ετικέτα,
και είναι σε θέση να διατηρεί int αστέρια, όποια και αν είναι αυτά.
Έχουν κάτι να κάνουμε με ακέραιους αριθμούς, σαφώς.
Εδώ είναι η τελευταία γραμμή όμως.
Αν πω PK = & K, whoa, τι ακριβώς συνέβη, έτσι δεν είναι;
Έτσι, αυτό το τυχαίο αριθμό, φαινομενικά τυχαία τον αριθμό, παίρνει ρίχνονται μέσα στο κουτί εκεί.
Το μόνο που είναι, είναι pk παίρνει τη διεύθυνση του κ.
Έτσι έχω κολλήσει όπου k ζει στη μνήμη, διεύθυνση, η διεύθυνση των bytes της.
Όλα τα κάνω είναι που λέω ότι η τιμή δεν είναι ό, τι Πάω
για να βάλουν μέσα το κουτί μου που ονομάζεται pk.
Και επειδή αυτά τα πράγματα είναι δείκτες, και επειδή αναζητούν
σε μια σειρά όπως το μηδέν x γ οκτώ μηδέν επτά τέσσερις οκτώ
δύο μηδέν είναι πιθανόν δεν είναι πολύ σημαντική.
Όταν γενικά απεικονίσει δείκτες, κάνουμε πραγματικότητα έτσι όπως δείκτες.
Pk μας δίνει την πληροφορία πρέπει να βρούμε k στη μνήμη.
Έτσι, βασικά pk έχει ένα βέλος σε αυτό.
Και αν περπατήσετε κατά μήκος του εν λόγω βέλους, φανταστείτε
αυτό είναι κάτι που μπορείτε να περπατήσετε, αν θέλουμε με τα πόδια κατά μήκος του βέλους,
στην ίδια την άκρη του εν λόγω βέλους, εμείς θα βρει τη θέση στη μνήμη
όπου k ζει.
Και αυτό είναι πολύ σημαντικό γιατί από τη στιγμή που γνωρίζουμε όπου k ζει,
μπορούμε να αρχίσουμε να εργαστούν με τα δεδομένα εντός της εν λόγω θέσης μνήμης.
Αν παίρνουμε μια teeny λίγο πριν από τους εαυτούς μας για τώρα.
>> Έτσι τι είναι ένας δείκτης;
Ένας δείκτης είναι ένα στοιχείο δεδομένων της οποίας τιμή είναι μια διεύθυνση μνήμης.
Αυτός ήταν ο μηδενικός χ οκτώ μηδέν πράγματα συμβαίνει, ότι ήταν μια διεύθυνση μνήμης.
Αυτό ήταν μια θέση στη μνήμη.
Και ο τύπος ενός δείκτη περιγράφει το είδος
των δεδομένων που θα βρείτε στο ότι η διεύθυνση της μνήμης.
Έτσι υπάρχει το σωστό μέρος int αστέρων.
Εάν ακολουθήσω αυτό το βέλος, είναι πρόκειται να με οδηγήσει σε μια θέση.
Και ότι η τοποθεσία, ό, τι Θα βρείτε εκεί στο παράδειγμά μου,
είναι ένα πράσινο έγχρωμο πλαίσιο.
Είναι ένας ακέραιος αριθμός, αυτό είναι ό, τι θα βρείτε αν πάω σε αυτή τη διεύθυνση.
Ο τύπος δεδομένων μιας δείκτης περιγράφει τι
θα βρείτε σε αυτή τη διεύθυνση μνήμης.
Έτσι, εδώ είναι το πραγματικά δροσερό πράγμα όμως.
Δείκτες μας επιτρέψει να περάσουν μεταβλητές μεταξύ των λειτουργιών.
Και πράγματι περάσει μεταβλητές και να μην περάσει αντίγραφά τους.
Γιατί αν ξέρουμε πού ακριβώς στη μνήμη για να βρει μια μεταβλητή,
δεν χρειάζεται να κάνετε ένα αντίγραφο του αυτό, μπορούμε απλά να πάτε σε εκείνη την θέση
και να συνεργαστεί με την εν λόγω μεταβλητή.
Έτσι, στην ουσία δείκτες ταξινόμησης του κάνει ένα περιβάλλον υπολογιστή
πολύ περισσότερο σαν τον πραγματικό κόσμο, σωστά.
>> Έτσι, εδώ είναι μια αναλογία.
Ας πούμε ότι έχω ένα σημειωματάριο, δεξιά, και είναι γεμάτο σημειώσεις.
Και θα ήθελα να το ενημερώσετε.
Είστε μια λειτουργία που ενημερώσεις σημειώσεις, σωστά.
Με τον τρόπο έχουμε ήδη εργάζονται μέχρι στιγμής, ό, τι
συμβεί αυτό, θα είναι θα λάβει το σημειωματάριό μου, θα πάτε στο κατάστημα αντίγραφο,
θα κάνετε ένα αντίγραφο της Xerox Κάθε σελίδα του φορητού υπολογιστή.
Θα φύγετε σημειωματάριο μου πίσω στο γραφείο μου όταν τελειώσετε,
θα πάτε και να διασχίζουν τα πράγματα στην μου σημειωματάριο που είναι ξεπερασμένες ή λάθος,
και, στη συνέχεια, θα περάσετε πίσω στο με τη στοίβα των σελίδων της Xerox
ότι είναι ένα αντίγραφο του φορητού υπολογιστή μου με οι αλλαγές που έχετε κάνει σε αυτό.
Και σε εκείνο το σημείο, είναι στο χέρι μου, όπως η λειτουργία κλήσης, όπως τον καλούντα,
να αποφασίσει να πάρει τις σημειώσεις σας και ένταξή τους πίσω στο σημειωματάριό μου.
Έτσι, υπάρχει μια πολλά βήματα που εμπλέκονται εδώ, σωστά.
Όπως δεν θα ήταν καλύτερο αν ήθελα απλώς να πω, hey, μπορεί να σας
ενημερώνει το σημειωματάριό μου για μένα, το χέρι σας το σημειωματάριό μου,
και παίρνετε τα πράγματα και τα διασχίζουν κυριολεκτικά έξω
και να ενημερώσετε τις σημειώσεις μου στο σημειωματάριο μου.
Και τότε να μου δώσει το σημειωματάριό μου πίσω.
Αυτό είναι το είδος αυτό δείκτες μας επιτρέπουν να το κάνουμε,
κάνουν αυτό το περιβάλλον πολύ μοιάζει περισσότερο με το πώς θα λειτουργήσει στην πραγματικότητα.
>> Εντάξει, έτσι ώστε ό, τι είναι ένας δείκτης, ας μιλήσουμε
για το πώς λειτουργούν οι δείκτες σε C, και πώς μπορούμε να αρχίσουμε να εργαστεί μαζί τους.
Έτσι, υπάρχει μια πολύ απλή δείκτη σε C ονομάζεται κενό δείκτη.
Η μηδενική δείκτης να δείχνει τίποτα.
Αυτό ίσως φαίνεται σαν να είναι στην πραγματικότητα δεν είναι ένα πολύ χρήσιμο πράγμα,
αλλά όπως θα δούμε ένα Λίγο αργότερα, το γεγονός
ότι υπάρχει αυτό το κενό δείκτη πραγματικά πραγματικά μπορεί να έρθει σε πρακτικό.
Και κάθε φορά που δημιουργείτε ένα δείκτη, και δεν ορίσετε immediately- αξία του
ένα παράδειγμα του καθορισμού την αξία του αμέσως
θα είναι ένα ζευγάρι διαφάνειες πίσω όπου είπα PK ισούται & K,
pk παίρνει διεύθυνση k, όπως θα δούμε τι σημαίνει αυτό,
θα δούμε πώς μπορείτε να κωδικό που shortly- αν δεν θέσετε την τιμή του σε κάτι
νόημα αμέσως, θα πρέπει πάντα να
που το δείκτη του ποντικιού στο σημείο να null.
Θα πρέπει να ορίσετε το σημείο σε τίποτα.
>> Αυτό είναι πολύ διαφορετικό από ό, τι αφήνοντας μόνο την αξία, όπως είναι
και στη συνέχεια το χαρακτηρισμό δείκτη και απλά υποθέτοντας
είναι άκυρη, διότι αυτή είναι σπάνια αλήθεια.
Έτσι, θα πρέπει πάντα να ορίσετε η αξία ενός δείκτη
να null αν δεν ορίσετε την αξία του σε κάτι ουσιαστικό αμέσως.
Μπορείτε να ελέγξετε αν η αξία ενός δείκτη της είναι μηδενική χρήση του τελεστή ισότητας
(==), Ακριβώς όπως θα συγκρίνετε οποιοσδήποτε ακέραιος τιμές ή τις τιμές χαρακτήρα με τη χρήση (==)
επισης.
Είναι ένα ιδιαίτερο είδος της σταθεράς τιμή που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε.
Έτσι, αυτό ήταν ένα πολύ απλό δείκτης, ο δείκτης null.
Ένας άλλος τρόπος για τη δημιουργία είναι ένας δείκτης για την εξαγωγή
η διεύθυνση μιας μεταβλητής έχετε ήδη δημιουργήσει,
και μπορείτε να το κάνετε αυτό χρησιμοποιώντας το & εκχύλιση διεύθυνση φορέα.
Το οποίο έχουμε ήδη δει στο παρελθόν στο πρώτο παράδειγμα διαγράμματος μου έδειξε.
Έτσι, αν το x είναι μια μεταβλητή που έχουμε ήδη δημιουργήσει τύπου ακέραιος,
τότε και το χ είναι ένας δείκτης σε ακέραιο.
& Χ είναι- να θυμάστε, και πρόκειται να εξαγάγει η διεύθυνση του πράγματος στα δεξιά.
Και δεδομένου ότι ένας δείκτης είναι απλώς μια διεύθυνση, ό, τι και το χ είναι ένας δείκτης σε ακέραιο
αξία των οποίων είναι στη μνήμη, όπου x ζωή.
Είναι η διεύθυνση του x.
Έτσι, και το Χ είναι η διεύθυνση του x.
Ας κάνουν ένα βήμα περαιτέρω και να συνδεθούν με κάτι
Αναφέρθηκα στο προηγούμενο βίντεο.
Αν ARR είναι μια σειρά από δίκλινα, στη συνέχεια, & ARR αγκύλη i είναι ένας δείκτης
σε ένα διπλό.
ΕΝΤΆΞΕΙ.
arr αγκύλη i, αν ARR είναι μια σειρά από δίκλινα,
Στη συνέχεια arr αγκύλη i είναι το i-th στοιχείο της συστοιχίας,
και & arr αγκύλη i είναι αυτή όπου σε μνήμη το i-οστό στοιχείο σύλλ υπάρχει.
>> Έτσι ποια είναι η επίπτωση εδώ;
Μια συστοιχίες όνομα, η επίπτωση του όλο αυτό το πράγμα,
είναι ότι το όνομα ενός πίνακα είναι στην πραγματικότητα η ίδια ένας δείκτης.
Έχετε εργαστεί με δείκτες σε όλο το μήκος
κάθε φορά που έχετε χρησιμοποιήσει έναν πίνακα.
Θυμηθείτε από το παράδειγμα σχετικά με την εμβέλεια των μεταβλητών,
κοντά στο τέλος του βίντεο που παρουσιάζουν ένα παράδειγμα όπου έχουμε μια συνάρτηση
που ονομάζεται σύνολο int και ένα λειτουργία που ονομάζεται σύνολο συστοιχία.
Και σας πρόκληση για τον προσδιορισμό έστω, ή ποια είναι η
αξίες που θα εκτυπωθεί το τέλος της λειτουργίας,
στο τέλος του κυρίως προγράμματος.
>> Αν θυμάστε από αυτό το παράδειγμα ή αν έχετε παρακολουθήσει το βίντεο,
ξέρετε ότι όταν σας-την κλήση σε ρυθμίστε το INT κάνει τίποτα αποτελεσματικά.
Αλλά η κλήση για να ορίσετε συστοιχία κάνει.
Και εγώ το είδος των παραλειφθεί από τους οποίους αυτή ήταν η περίπτωση κατά το χρόνο.
Μόλις είπα, καλά είναι ένας πίνακας, είναι ειδική, ξέρετε, υπάρχει ένας λόγος.
Ο λόγος είναι ότι ένα συστοιχίας όνομα είναι πραγματικά ακριβώς ένα δείκτη,
και υπάρχει αυτή την ειδική πλατεία σύνταξη βραχίονα ότι
κάνει τα πράγματα πολύ καλύτερο να εργαστεί με.
Και κάνουν την ιδέα μιας pointer πολύ λιγότερο εκφοβιστικό,
και γι 'αυτό είναι το είδος της παρουσιάζονται σε αυτόν τον τρόπο.
Αλλά πραγματικά συστοιχίες είναι μόνο δείκτες.
Και γι 'αυτό, όταν έκανε μια αλλαγή στη σειρά,
όταν περάσαμε μια σειρά ως παράμετρος σε μια λειτουργία ή ως επιχείρημα
σε μια λειτουργία, τα περιεχόμενα του πίνακα πράγματι άλλαξε τόσο στο καλούμενο
και στον καλούντα.
Η οποία για κάθε άλλο είδος μεταβλητή που είδαμε δεν ήταν η περίπτωση.
Έτσι, αυτό είναι απλά κάτι που πρέπει να νου όταν εργάζεστε με δείκτες,
είναι ότι το όνομα ενός συστοιχία πραγματικά ένα δείκτη
με το πρώτο στοιχείο του εν λόγω πίνακα.
>> Εντάξει έτσι τώρα έχουμε όλα αυτά γεγονότα, ας συνεχίσουμε, δεξιά.
Γιατί νοιαζόμαστε για όπου ζει κάτι.
Λοιπόν, όπως είπα, είναι αρκετά χρήσιμο να γνωρίζουν πού ζει κάτι
έτσι μπορείτε να πάτε εκεί και να το αλλάξετε.
Συνεργαστεί μαζί της και πράγματι έχει το πράγμα που
θέλουμε να κάνουμε σε αυτή τη μεταβλητή, τίθενται σε εφαρμογή, και να μην τεθεί σε ισχύ σε κάποιο αντίγραφό του.
Αυτό ονομάζεται εύρεση τιμών.
Εμείς πάμε με την αναφορά και αλλάζουμε την τιμή εκεί.
Έτσι, αν έχουμε ένα δείκτη και ονομάζεται PC, και δείχνει σε ένα χαρακτήρα,
τότε μπορούμε να πούμε * PC και PC * είναι η Το όνομά της το τι θα βρούμε αν πάμε
στο pc διεύθυνση.
Τι θα βρείτε εκεί είναι ένας χαρακτήρας και * PC είναι πώς αναφερόμαστε στα δεδομένα σε ότι
τοποθεσία.
Έτσι, θα μπορούσαμε να πούμε κάτι σαν * pc = D ή κάτι τέτοιο,
και αυτό σημαίνει ότι ανεξάρτητα από ήταν σε διεύθυνση μνήμης του υπολογιστή,
ανεξαρτήτως του χαρακτήρα ήταν προηγουμένως εκεί, είναι τώρα D, αν λέμε * pc = D.
>> Έτσι, εδώ είμαστε πάλι μαζί κάποια περίεργα πράγματα, C, δεξιά.
Έτσι έχουμε δει στο παρελθόν * ως κάπως μέρος του τύπου δεδομένων,
και τώρα χρησιμοποιείται σε ένα ελαφρώς διαφορετικό πλαίσιο
να έχουν πρόσβαση στα δεδομένα σε μια τοποθεσία.
Ξέρω ότι είναι μια μικρή σύγχυση και αυτό είναι πραγματικά μέρος αυτού του συνόλου
όπως, γιατί οι δείκτες έχουν αυτή τη μυθολογία γύρω τους σαν να ήταν περίπλοκη,
είναι το είδος του προβλήματος σύνταξη, ειλικρινά.
* Αλλά χρησιμοποιείται και στα δύο πλαίσια, τόσο ως μέρος της ονομασίας του τύπου,
και θα δείτε ένα μικρό αργότερα κάτι άλλο, πάρα πολύ.
Και τώρα είναι η χειριστή dereference.
Έτσι, πηγαίνει με την αναφορά, αποκτά πρόσβαση στα δεδομένα
στη θέση του δείκτη, και σας επιτρέπει να το χειριστείτε κατά βούληση.
>> Τώρα αυτό είναι πολύ παρόμοιο με που επισκέπτονται το γείτονά σου, σωστά.
Αν ξέρετε τι σας γείτονας ζει, είστε
δεν κρέμεται έξω με το γείτονά σας.
Ξέρετε ότι τυχαίνει να ξέρετε όπου ζουν,
αλλά αυτό δεν σημαίνει ότι η λόγω του ότι έχουν αυτή τη γνώση
που αλληλεπιδρούν μαζί τους.
Αν θέλετε να αλληλεπιδράσετε μαζί τους, θα πρέπει να πάτε στο σπίτι τους,
θα πρέπει να πάτε εκεί που ζουν.
Και όταν το κάνεις αυτό, τότε μπορείτε να αλληλεπιδράσετε
με τους ακριβώς όπως θα θέλατε να.
Και ομοίως με τις μεταβλητές, θα πρέπει να πάτε στη διεύθυνσή τους
αν θέλετε να τους αλληλεπιδρούν, μπορείτε όχι μόνο να γνωρίζετε τη διεύθυνση.
Και ο τρόπος που πάει προς την διεύθυνση είναι στη χρήση *, το χειριστή dereference.
Τι νομίζετε ότι θα συμβεί αν προσπαθήσουμε και dereference
ένας δείκτης του οποίου η αξία είναι μηδενική;
Υπενθυμίζεται ότι η μηδενική δείκτης δείχνει τίποτα.
Έτσι, αν προσπαθήσετε και dereference τίποτα ή να πάει σε τίποτα διεύθυνση,
τι νομίζετε ότι θα συμβεί;
Λοιπόν, αν έχετε μαντέψει τμηματοποίηση κατηγορήσω, θα ήθελα να είναι σωστή.
Αν προσπαθήσετε και dereference ένα κενό δείκτη,
πάσχετε κατακερματισμό κατηγορήσω. Αλλά περίμενε,
δεν μπορώ να σας πω, ότι εάν δεν πρόκειται
να ορίσετε την τιμή σας σας δείκτης σε κάτι σημαντικό,
θα πρέπει να οριστεί σε null;
Το έκανα και στην πραγματικότητα η τμηματοποίηση σφάλμα είναι το είδος της μια καλή συμπεριφορά.
>> Έχετε δηλώσει ποτέ μια μεταβλητή και δεν αποδίδεται αξία του αμέσως;
Έτσι, μπορείτε απλώς να πω int x? δεν το κάνετε πράγματι αναθέσει σε τίποτα
και, στη συνέχεια, αργότερα στον κώδικά σας, μπορείτε να εκτυπώσετε την τιμή του x,
εξακολουθεί να μην έχει έχουν ανατεθεί σε τίποτα.
Συχνά θα πάρετε το μηδέν, αλλά μερικές φορές σας
θα μπορούσε να πάρει κάποιο τυχαίο αριθμό, και δεν έχετε ιδέα από πού προήλθε.
Ομοίως, μπορεί τα πράγματα συμβεί με δείκτες.
Όταν δηλώνουμε έναν pointer int * pk για παράδειγμα,
και να μην αναθέσει σε μια τιμή, μπορείτε να πάρετε τέσσερα byte για τη μνήμη.
Όποια και αν είναι τέσσερα byte μνήμη του συστήματος μπορεί να
διαπιστώνουν ότι έχουν κάποια ουσιαστική αξία.
Και ίσως υπήρξαν κάτι που είναι ήδη εκεί που
δεν είναι πλέον απαραίτητη από ένα άλλο λειτουργία, έτσι απλά πρέπει
Ό, τι στοιχεία ήταν εκεί.
>> Τι θα συμβεί αν προσπαθήσατε να κάνετε dereference κάποια διεύθυνση που υπήρχαν don't-
ήδη bytes και πληροφορίες εκεί, που είναι τώρα στο δείκτη σας.
Αν προσπαθήσετε και dereference εν λόγω δείκτη, ίσως να μπέρδεμα με κάποια μνήμη
ότι δεν είχε την πρόθεση να το χάος με όλα.
Και στην πραγματικότητα, θα μπορούσατε να κάνετε κάτι πραγματικά καταστροφικές,
σαν να σπάσει ένα άλλο πρόγραμμα, ή να σπάσει μια άλλη λειτουργία,
ή να κάνει κάτι κακόβουλο ότι δεν είχε την πρόθεση να κάνει καθόλου.
Και έτσι γι 'αυτό είναι πραγματικά μια καλή ιδέα
για να ρυθμίσετε τους δείκτες σας για να null αν δεν τους οριστεί σε κάτι ουσιαστικό.
Είναι ίσως καλύτερα σε τέλος της ημέρας για το πρόγραμμά σας
να συντρίψει στη συνέχεια για να κάνουμε Κάτι που βίδες μέχρι
ένα άλλο πρόγραμμα ή άλλη λειτουργία.
Ότι η συμπεριφορά είναι πιθανώς ακόμη λιγότερο ιδανική όχι μόνο συντρίβεται.
Και έτσι γι 'αυτό είναι πραγματικά μια καλή συνήθεια
να μπει για να ορίσετε δείκτες σας σε null αν δεν τους που
σε μια ουσιαστική αξία αμέσως, μια τιμή που ξέρετε
και ότι μπορείτε με ασφάλεια να το dereference.
>> Ας επανέλθουμε τώρα και ρίξτε μια ματιά τη συνολική σύνταξη της κατάστασης.
Αν πω int * p ;, τι έχω κάνει ακριβώς;
Τι έχω κάνει είναι αυτό.
Γνωρίζω ότι η τιμή του p είναι μια διεύθυνση γιατί όλοι οι δείκτες είναι μόνο
διευθύνσεις.
Δεν μπορώ να dereference σ χρησιμοποιώντας τον τελεστή *.
Στο πλαίσιο αυτό εδώ, στην ίδια την κορυφή υπενθυμίζουν το * είναι μέρος του τύπου.
Int * είναι ο τύπος δεδομένων.
Αλλά μπορώ να dereference p χρήση του τελεστή *,
και αν το κάνω, αν πάω σε αυτή τη διεύθυνση, τι θα βρω σε αυτή τη διεύθυνση;
Θα βρείτε έναν ακέραιο.
Έτσι, int * p είναι βασικά λέγοντας, ρ είναι μια διεύθυνση.
Δεν μπορώ να dereference σ και αν Κάνω, θα βρείτε έναν ακέραιο
σε αυτή τη θέση μνήμης.
>> Εντάξει έτσι είπα υπήρχε άλλος ενοχλητικό πράγμα με αστέρια
και εδώ είναι όπου αυτό ενοχλητικό πράγμα με αστέρια είναι.
Έχετε δοκιμάσει ποτέ να κηρύξει πολλών μεταβλητών του ίδιου τύπου
στην ίδια γραμμή κώδικα;
Έτσι, για ένα δευτερόλεπτο, προσποιούνται ότι η γραμμή, ο κώδικας Έχω πραγματικά εκεί στο πράσινο
δεν υπάρχει και αυτό ακριβώς λέει int x, y, z ;.
Τι θα κάνουμε ότι είναι πραγματικά δημιουργούν τρεις ακέραιες μεταβλητές για σας,
μία που ονομάζεται x, μία που ονομάζεται y, και μία που ονομάζεται z.
Είναι ένας τρόπος για να το κάνουμε χωρίς χρειάζεται να χωριστεί σε τρεις γραμμές.
>> Εδώ είναι όπου τα αστέρια πάρει ενοχλητικό και πάλι όμως,
επειδή το * είναι στην πραγματικότητα μέρος τόσο το όνομα του τύπου και μέρος
της το όνομα της μεταβλητής.
Και έτσι αν πω int * px, py, PZ, τι πραγματικά να είναι ένας δείκτης σε ακέραιο
κάλεσε px και δύο ακέραιοι, py και pz.
Και αυτό δεν είναι αυτό που είναι πιθανώς θέλουμε, αυτό δεν είναι καλό.
>> Έτσι, αν θέλω να δημιουργήσω πολλαπλά δείκτες στην ίδια γραμμή, του ίδιου τύπου,
και τα αστέρια, αυτό που πραγματικά χρειάζεστε να κάνουμε είναι να πούμε int * ετησίως, * PB, PC *.
Τώρα έχοντας μόλις είπε ότι και τώρα σας λέει αυτό,
τότε μάλλον δεν θα κάνει ποτέ αυτό.
Και αυτό είναι πιθανώς ένα καλό πράγμα ειλικρινά, επειδή ίσως κατά λάθος
παραλείπουν ένα αστέρι, κάτι τέτοιο.
Είναι μάλλον καλύτερο να δηλώσουν ίσως δείκτες σε μεμονωμένες γραμμές,
αλλά είναι απλώς άλλο ένα από αυτές τις ενοχλητικές σύνταξη
τα πράγματα με αστέρια που κάνουν δείκτες τόσο δύσκολο να εργαστεί με.
Επειδή είναι ακριβώς αυτή η συντακτική χάος θα πρέπει να εργαστούν μέσω.
Με την πρακτική που κάνει πραγματικά να γίνει δεύτερη φύση.
Εξακολουθώ να κάνουν λάθη με ακόμα μετά τον προγραμματισμό για 10 χρόνια,
έτσι δεν είναι έκπληξη αν συμβεί κάτι για να σας, είναι αρκετά κοινό με ειλικρίνεια.
Είναι πραγματικά το είδος του ένα ελάττωμα της σύνταξης.
>> Εντάξει έτσι εγώ το είδος των υπεσχημένων ότι θα επανέλθουμε
η έννοια του πόσο μεγάλο είναι ένα string.
Λοιπόν, αν σας είπα ότι μια string, έχουμε πραγματικά το είδος του
ψέματα για να σας όλη την ώρα.
Δεν υπάρχει κανένας τύπος δεδομένων που ονομάζεται string, και στην πραγματικότητα,
ανέφερε αυτό σε ένα από τα πρώτα βίντεο σχετικά με τους τύπους δεδομένων,
ότι χορδών ήταν ένα τύπο δεδομένων που δημιουργήθηκε για εσάς στο CS50.h.
Θα πρέπει να #include CS50.h για να το χρησιμοποιήσετε.
>> Καλά string είναι πραγματικά μόνο ένα ψευδώνυμο για κάτι
ονομάζεται το char *, ένα pointer σε ένα χαρακτήρα.
Λοιπόν δείκτες, ανάκληση, Οι διευθύνσεις μόνο.
Έτσι, ποιο είναι το μέγεθος σε bytes μια σειρά;
Καλά είναι τέσσερις ή οκτώ.
Και ο λόγος που το λέω τέσσερις ή από οκτώ είναι επειδή στην πραγματικότητα
εξαρτάται από το σύστημα, Εάν χρησιμοποιείτε CS50 ide, char * είναι το μέγεθος ενός char
* Είναι οκτώ, είναι ένα σύστημα 64-bit.
Κάθε διεύθυνση στη μνήμη έχει μήκος 64 bits.
Εάν χρησιμοποιείτε συσκευή CS50 ή να χρησιμοποιήσετε οποιαδήποτε μηχανή 32-bit,
και έχετε ακούσει αυτόν τον όρο 32-bit μηχανή, ό, τι είναι μια μηχανή 32-bit;
Λοιπόν αυτό σημαίνει απλώς ότι κάθε διεύθυνσης στη μνήμη έχει μήκος 32 bits.
Και έτσι 32 bits είναι τέσσερα byte.
Έτσι, ένα char * είναι τέσσερις ή οκτώ bytes, ανάλογα με το σύστημά σας.
Και πράγματι οποιαδήποτε τύπους δεδομένων, και ένα δείκτη σε οποιαδήποτε δεδομένα
Τύπος, δεδομένου ότι όλοι οι δείκτες είναι μόνο διευθύνσεις, είναι τέσσερα ή οκτώ bytes.
Ας επανεξετάσουμε αυτό διάγραμμα και ας συνάψει
Αυτό το βίντεο με λίγη άσκηση εδώ.
Έτσι, εδώ είναι το διάγραμμα που είχαμε μείνει με στην αρχή του βίντεο.
Και τώρα τι γίνεται αν πω * PK = 35;
Λοιπόν, τι σημαίνει όταν λέω, * PK = 35;
Πάρτε ένα δευτερόλεπτο.
* pk.
Σε αυτό το πλαίσιο εδώ, είναι * χειριστή dereference.
Έτσι, όταν η dereference χειριστής χρησιμοποιείται,
πάμε για τη διεύθυνση επεσήμανε από pk, και να αλλάξουμε ό, τι θα βρούμε.
Έτσι * PK = 35 αποτελεσματικά το κάνει αυτό στην εικόνα.
Έτσι είναι βασικά συντακτικά ταυτόσημα με του αφού λόγω k = 35.
>> Ένα ακόμα.
Αν πω int m, δημιουργώ μια νέα μεταβλητή που ονομάζεται m.
Ένα νέο πλαίσιο, είναι ένα πράσινο κουτί, διότι πρόκειται να κρατήσει έναν ακέραιο,
και αυτό είναι που επισημαίνονται μ.
Αν πω m = 4, έβαλα ένα ακέραιος σε αυτό το κουτί.
Αν ας πούμε PK = & M, πώς αυτή η αλλαγή διάγραμμα;
PK = & M, Θυμάστε τι το & Χειριστής κάνει ή λέγεται;
Να θυμάστε ότι και κάποιο όνομα μεταβλητής είναι η διεύθυνση μιας μεταβλητής ονόματος.
Έτσι, αυτό που λέμε είναι pk παίρνει τη διεύθυνση του m.
Και έτσι αποτελεσματικά αυτό που συμβαίνει το διάγραμμα είναι ότι pk δεν είναι πλέον σημεία
k, αλλά τα σημεία σε m.
>> Πάλι δείκτες είναι πολύ δύσκολο να εργαστεί με
και παίρνουν πολλή πράξη, αλλά επειδή
της ικανότητάς τους για να σας επιτρέψει για τη μεταβίβαση δεδομένων μεταξύ των λειτουργιών
και μάλιστα εκείνων που έχουν αλλαγές τεθούν σε ισχύ,
να πάρει το κεφάλι σας γύρω από είναι πραγματικά σημαντικό.
Πιθανότατα είναι το πιο πολύπλοκο το θέμα που συζητάμε σε CS50,
αλλά η τιμή που πάρετε από τη χρήση δείκτες
ξεπερνά κατά πολύ τις επιπλοκές που προέρχονται από την εκμάθηση τους.
Γι 'αυτό σας εύχομαι το καλύτερο της μαθαίνουν για την τύχη τους δείκτες.
Είμαι ο Νταγκ Lloyd, αυτό είναι CS50.