>> [Παίζει μουσική]
>> DOUG LLOYD: OK.
Έχουμε συνεργαστεί με ακέραιους αριθμούς, έχουμε συνεργαστεί με τους χαρακτήρες,
έχουμε δουλέψει πλωτήρες, δίκλινα, χορδές, και bools.
Έχουμε εξαντλήσει όλα λίγο πολύ των [δεν ακούγεται] τύπων που
Έχουν στη διάθεσή μας όλο το μήκος.
Αλλά τώρα θέλουμε να κάνουμε κάτι περισσότερο.
Πώς θα το κάνουμε αυτό;
Πώς μπορούμε να δημιουργήσουμε διαφορετικούς τύπους δεδομένων;
Μπορούμε να το πράξουν με τη χρήση δομών.
Έτσι δομές μας επιτρέπουν να ενοποιήσει μεταβλητές διαφορετικών τύπων
σε ένα ενιαίο, νέο τύπο μεταβλητής, το οποίο μπορούμε να αναθέσουμε το δικό του όνομα τον τύπο του.
Αυτό είναι ένα πραγματικά ισχυρό πράγμα που πρέπει να είναι σε θέση να το κάνουμε,
επειδή μπορούμε τώρα ομίλου στοιχεία διαφορετικών τύπων δεδομένων
μαζί που έχουν μια λογική σύνδεση.
Έχουμε τη δυνατότητα να το κάνετε αυτό με συστοιχίες είδος του, έτσι δεν είναι;
Μπορούμε μεταβλητές ομάδα του ίδιου τύπου δεδομένων
μαζί σε μια μεγάλη μονάδα της μνήμης, μια συστοιχία.
>> Αλλά δεν ήταν σε θέση να αναμειγνύεται διαφορετικούς τύπους δεδομένων από κοινού.
Δεν μπορούμε, ας πούμε, το ζευγάρι έναν ακέραιο, και ένας χαρακτήρας, και μια διπλή όλα
στο ίδιο πράγμα και ονόμαζα μια ενιαία μονάδα.
Αλλά με τις δομές, ή αναφέρεται συχνά ως structs,
μπορούμε πραγματικά να.
Έτσι, μια δομή είναι είδος όπως ένα σούπερ μεταβλητή.
Είναι μια μεταβλητή που περιέχει άλλες μεταβλητές στο εσωτερικό του.
Έτσι, εδώ είναι ένα παράδειγμα της μια πολύ απλή δομή.
Αυτό είναι ό, τι η σύνταξη θα δούμε ήθελε να δημιουργήσει μια δομή για ένα αυτοκίνητο.
Τώρα, ας πάμε με τη σύνταξη εδώ.
Struct, αυτό είναι το λέξη-κλειδί που υποδεικνύει
ότι είμαι δημιουργώντας ένα νέο τύπο δεδομένων εδώ.
Ειδικότερα, το όνομα του τύπου δεδομένων είναι πρόκειται να είναι struct αυτοκίνητο, όπως θα δούμε.
Αλλά αυτό είναι το είδος του άκρου off για να τον compiler ότι αυτό
ως μια ομάδα των μεταβλητών που θα να θεωρηθεί μέρος του ίδιου τύπου
σε ένα λεπτό.
>> Αυτοκίνητα, μόνο το όνομα της δομής.
Και πάλι, ο τύπος δεδομένων εδώ θα να είναι struct αυτοκίνητο, όχι μόνο το αυτοκίνητο.
Αλλά αν έχετε different-- εάν δημιουργήσετε πολλαπλές structs
στο ίδιο πρόγραμμα, θα πρέπει να διάκριση μεταξύ struct και struct.
Έτσι struct αυτοκίνητο, μπορούν επίσης να έχουν φοιτητής struct, για παράδειγμα,
στο ίδιο πρόγραμμα.
Μέσα από τα άγκιστρα είναι όλα τα λεγόμενα πεδία,
ή τα μέλη της δομής.
Λοιπόν, τι είναι μερικά από τα πράγματα που είναι εγγενείς σε ένα αυτοκίνητο;
Λοιπόν, αυτό έχει συνήθως ένα έτος, έχει το όνομα του μοντέλου, και μια πινακίδα,
ένα οδόμετρο που συνήθως έχει κάποιος αριθμός μίλια σε αυτό,
και ίσως ένα μέγεθος κινητήρα.
Και όπως μπορείτε να δείτε, είμαι ανάμειξη ακέραιοι και χαρακτήρες και διπλασιάζεται.
Είναι όλοι πρόκειται να είναι μέρος αυτού του νέου τύπου δεδομένων.
>> Τέλος, το τελευταίο πράγμα που πρέπει να κάνω, μην ξεχάσετε αυτό το μικρό ερωτηματικό
στο τελος.
Αφού ολοκληρώσετε τον ορισμό της δομής, πρέπει να βάλουμε ένα ερωτηματικό στο τέλος.
Είναι μια πολύ κοινή συντακτική λάθος, γιατί με μια λειτουργία,
για παράδειγμα, θα έχετε μόνο ανοιχτή σγουρά τιράντες, κοντά σγουρά στήριγμα.
Δεν βάζετε ένα ερωτηματικό στην τέλος του ορισμού της συνάρτησης.
Αυτό μοιάζει με μια λειτουργία ορισμό, αλλά δεν είναι,
και έτσι το ερωτηματικό υπάρχει Είναι απλά μια υπενθύμιση ότι έχετε
πρέπει να το βάλετε εκεί, γιατί ο compiler Αλλιώς δεν θα
ξέρουν τι να κάνουν με αυτό.
Είναι ένα πολύ κοινό λάθος να κάνουν λάθος
όταν είστε πρώτα καθορισμό δομές.
>> ΕΝΤΆΞΕΙ.
Έτσι ορίζουμε συνήθως τις δομές μας στην κορυφή των προγραμμάτων μας
επειδή πρόκειται πιθανώς να χρησιμοποιηθεί από πολλαπλές λειτουργίες.
Δεν θέλουμε να ορίσετε ένα struct εσωτερικό μιας συνάρτησης,
γιατί τότε μπορούμε να το only-- έκταση της δομής πραγματικά
Υπάρχει μόνο εντός της εν λόγω λειτουργίας.
Θα ήθελα ίσως να θέλετε να ορίσετε μια δομή έτσι μπορούμε να το χρησιμοποιήσουμε σε πολλαπλές λειτουργίες,
ή ίσως σε πολλαπλές τα αρχεία που είναι δεμένα μαζί
να δημιουργήσει ενιαίο πρόγραμμα μας.
Μερικές φορές, επίσης, αντί του καθορισμού της δομής
στην κορυφή όπου βάζετε σας λίβρα περιλαμβάνει και λίβρα σας προσδιορίζει,
Για παράδειγμα, μπορείτε να τα βάλετε σε ξεχωριστά αρχεία dot h, το οποίο μπορείτε στη συνέχεια
λίρας περιλαμβάνουν τον εαυτό σας.
>> Έτσι έχουμε δομές, αλλά τώρα θα πρέπει να πάρει μέσα από αυτά.
Πώς θα φτάσουμε στο εσωτερικό του μια δομή για την πρόσβαση
Τα εν λόγω επιμέρους μεταβλητές, οι μεταβλητές αυτές που υπάρχουν στο εσωτερικό της δομής;
Λοιπόν, έχουμε κάτι που ονομάζεται ο χειριστής τελεία, η οποία μας επιτρέπει
να έχουν πρόσβαση στα πεδία της δομής.
Έτσι, για παράδειγμα, ας πούμε ότι έχω δηλώσει δομή δεδομένων μου πληκτρολογήστε κάπου
στην κορυφή του προγράμματος μου, ή ίσως σε ένα αρχείο dot ώρες που έχω λίβρα συμπεριλαμβάνεται.
Εάν λοιπόν εγώ θέλουμε να δημιουργήσουμε μια νέα μεταβλητή αυτού του τύπου δεδομένων, μπορώ να πω,
struct αυτοκίνητο, το αυτοκίνητό μου, τελεία.
Ακριβώς όπως θα μπορούσα να πω int Χ, ή το όνομα χορδών ερωτηματικό.
>> Ο τύπος δεδομένων είναι struct αυτοκίνητο, το όνομα της μεταβλητής είναι το αυτοκίνητό μου,
και, στη συνέχεια, μπορώ να χρησιμοποιήσω το χειριστή για να τελεία πρόσβαση στα διάφορα πεδία του αυτοκινήτου μου.
Έτσι μπορώ να πω το αυτοκίνητό μου dot έτος ισούται με 2011.
Αυτό είναι απολύτως εντάξει.
Έτος, αν θυμάστε, ορίστηκε ως ακέραιο πεδίο μέσα από αυτό το αυτοκίνητο struct
τύπο δεδομένων.
Έτσι, κάθε μεταβλητή των δεδομένων struct αυτοκίνητο τύπου, όπως το αυτοκίνητό μου, μπορώ να πω το αυτοκίνητό μου
dot έτος ισούται και στη συνέχεια να εκχωρήσετε είναι μερικά ακέραια τιμή, 2011.
Πλάκα μου dot αυτοκινήτων ισούται με CS50.
Μου dot κάρτα χιλιομετρητή ισούται με 50505 ερωτηματικό.
Όλα αυτά είναι απολύτως εντάξει και αυτό είναι
πώς θα αποκτήσετε πρόσβαση στο πεδία της δομής.
Δομές, όμως, δεν χρειάζεται να δημιουργηθεί στη στοίβα.
Ακριβώς όπως και κάθε άλλη μεταβλητή, μπορούμε μπορεί να διαθέσει τα δυναμικά.
Αν έχουμε ένα πρόγραμμα που θα μπορούσε να να παράγει πολλές δομές,
δεν ξέρουμε πόσοι θα πάμε να χρειάζονται,
τότε θα πρέπει να δυναμικά κατανέμει τις δομές
όπως το πρόγραμμα μας βρίσκεται σε λειτουργία.
Και έτσι, αν θα πάμε να έχουν πρόσβαση στο πεδία της δομής στο πλαίσιο αυτό,
Θυμηθείτε ότι θα πρέπει πρώτα να dereference ο δείκτης στη δομή,
και, στη συνέχεια, από τη στιγμή που η dereference δείκτη, τότε μπορούμε να έχουμε πρόσβαση τα πεδία.
Αν έχουμε μόνο δείκτη προς τη δομή,
δεν μπορούμε να πούμε το πεδίο δείκτη dot το όνομα και να πάρει αυτό που ψάχνετε.
Υπάρχει το επιπλέον βήμα εύρεση τιμών.
Ας πούμε ότι αντί της previous--
ακριβώς όπως στο προηγούμενο παράδειγμα, αντί να τις δηλώσουν
στη στοίβα, struct αυτοκίνητο, μου αυτοκίνητο, το ερωτηματικό, το λέω struct αυτοκίνητο,
αστέρι, ένας δείκτης σε μια struct αυτοκίνητο ονομάζεται το αυτοκίνητό μου,
ισούται με malloc μέγεθος του struct αυτοκινήτου.
Μέγεθος του θα καταλάβω πόσα bytes νέος τύπος δεδομένων σας καταλαμβάνει.
Δεν χρειάζεται απαραιτήτως μόνο που χρειάζεται είναι να χρησιμοποιήσετε μέγεθος, πλάτος, int ή char, ή οποιαδήποτε
των ενσωματωμένων τύπων δεδομένων.
Ο compiler είναι αρκετά έξυπνος να καταλάβω πόσα bytes
απαιτούνται από τη νέα δομή σας.
Γι 'αυτό και malloc τον εαυτό μου μια μονάδα μνήμης αρκετά μεγάλη για να κρατήσει ένα αυτοκίνητο struct,
και να πάρω ένα δείκτη πίσω σε συγκεκριμένο τμήμα της μνήμης,
και ότι ο δείκτης έχει εκχωρηθεί στο αυτοκίνητό μου.
>> Τώρα, αν θέλετε να αποκτήσετε πρόσβαση οι τομείς του αυτοκινήτου μου,
Θέλω πρώτα dereference το αυτοκίνητό μου με τη χρήση ο χειριστής dereference, αστέρι
ότι έχουμε δει από τους δείκτες βίντεο, και στη συνέχεια, αφού dereference,
τότε μπορώ να χρησιμοποιήσω το χειριστή για να τελεία πρόσβαση στα διάφορα πεδία του αυτοκινήτου μου.
Αστέρι αυτοκίνητό μου dot έτος ισούται με 2011.
Αυτό θα έχει ως αποτέλεσμα θέλουμε σε αυτή την περίπτωση,
γιατί έχουμε δυναμικά διατεθεί το αυτοκίνητό μου.
>> Αυτό είναι το είδος ενοχλητικό, όμως, σωστά;
Υπάρχει μια διαδικασία 2-βήμα τώρα.
Τώρα έχουμε να dereference-- έχουμε ένα φορέα αστέρι,
και έχουμε ένα φορέα τελεία.
Και όπως μπορείτε να φανταστείτε, επειδή Γ προγραμματιστές αγαπούν μικρότερη τρόπους
να κάνουμε τα πράγματα, υπάρχει μια πιο σύντομος τρόπος για να γίνει αυτό.
Υπάρχει και ένα άλλο φορέα που ονομάζεται βέλος, που κάνει τη διαδικασία πολύ πιο εύκολη.
Ο τρόπος που λειτουργεί είναι το βέλος το πρώτο dereferences
το δείκτη στα αριστερά πλευρά του χειριστή,
και στη συνέχεια, αφού αναχθούν το δείκτη στα αριστερά,
από την πρόσβαση στο πεδίο στα δεξιά.
Και έτσι στο παρελθόν είχαμε αυτό το είδος του Star αυτοκίνητό μου dot όλα αυτά τα πράγματα,
σα να υπήρχε μια παρτίδα σε εξέλιξη εκεί.
Αλλά τι μπορούμε να κάνουμε, αντίθετα, είναι this-- μου αυτοκίνητο βέλος έτος ισούται με 2011.
>> Και πάλι, τι συμβαίνει εδώ;
Πρώτον, είμαι εύρεση τιμών αυτοκίνητό μου.
Η οποία και πάλι, είναι ένας δείκτης εδώ.
Στη συνέχεια, αφού αναχθούν αυτοκίνητό μου,
μπορεί να έχει πρόσβαση τα πεδία έτος, πλάκα, και χιλιομετρικών αποστάσεων
ακριβώς όπως θα μπορούσα, προτού χρειαστεί πρώτα μεταχειρισμένα αστέρι για να dereference το αυτοκίνητό μου,
και dot πρόσβασης στο πεδίο.
Έτσι μπορείτε να έχετε δομές, που μπορεί να έχει δείκτες σε δομές,
και έχετε πρόσβαση σε τρόπους τα πεδία των δομών αυτών,
αν έχετε δείκτες σε τους ή οι ίδιοι οι μεταβλητές.
Dot ή βέλος, ανάλογα με την πώς κηρύχθηκε η μεταβλητή.
Είμαι ο Νταγκ Lloyd, αυτό είναι CS50.