>> [RIPRODUZIONE DI BRANI MUSICALI]
>> DOUG LLOYD: OK.
Abbiamo lavorato con gli interi, abbiamo lavorato con personaggi,
abbiamo lavorato galleggianti, doppie, stringhe e bool.
Abbiamo esaurito praticamente tutto dei [incomprensibile] tipi che
sono stati a disposizione di tutti noi lungo.
Ma ora vogliamo fare qualcosa di più.
Come lo facciamo?
Come si fa a creare diversi tipi di dati?
Possiamo farlo utilizzando strutture.
Così strutture permettono di unificare variabili di tipi diversi
in un unico, nuovo tipo di variabile, che possiamo assegnare un proprio nome tipo.
Questo è un molto forte cosa da essere in grado di fare,
perché possiamo ora gruppo elementi di diversi tipi di dati
insieme che hanno un collegamento logico.
Siamo stati in grado di fare questo con array di tipo, giusto?
Siamo in grado di variabili di gruppo dello stesso tipo di dati
insieme in una grande unità della memoria, un array.
>> Ma non siamo stati in grado di mescolare up diversi tipi di dati insieme.
Non possiamo, dire, abbinare un numero intero, e un carattere, e un doppio tutto
nella stessa cosa e chiamare che una singola unità.
Ma con le strutture, o spesso indicato come le strutture,
abbiamo effettivamente possibile.
Quindi una struttura è sorta di come una variabile eccellente.
E 'una variabile che contiene altre variabili all'interno di esso.
Quindi, ecco un esempio di una struttura molto semplice.
Questo è ciò che la sintassi sarà vuole creare una struttura di una macchina.
Ora, andiamo attraverso la sintassi qui.
Struct, che è il parola chiave che indica
che sto creando un nuovo tipo di dati qui.
In particolare, il nome del tipo di dati è sta per essere auto struct, come vedremo.
Ma questo è il tipo di punta off al compilatore che questo
come un gruppo di variabili che sta da considerarsi parte dello stesso tipo
in un minuto.
>> Automobili, solo il nome della struttura.
Anche in questo caso, il tipo di dati qui sta di essere auto struct, non solo auto.
Ma se avete different-- se si creano più le strutture
nello stesso programma, è necessario distinguere tra struct e struct.
Macchina così struct, potrei anche avere studente struct, per esempio,
nello stesso programma.
All'interno delle parentesi graffe sono tutti i cosiddetti campi,
o membri della struttura.
Ma quali sono alcune delle cose che sono inerenti in una macchina?
Ebbene, ha solitamente un anno, ha un nome del modello, e una targa,
un contachilometri che di solito ha un determinato numero di miglia su di esso,
e forse una dimensione del motore.
E come potete vedere, sto mescolando interi e caratteri e doppie.
Sono tutti andando essere parte di questo nuovo tipo di dati.
>> Infine, l'ultima cosa ho bisogno di fare, non dimenticare questo piccolo punto e virgola
alla fine.
Dopo avremo finito di definire la struttura, abbiamo bisogno di mettere un punto e virgola alla fine.
Si tratta di una sintattica molto comune errore, perché con una funzione,
per esempio, si sarebbe semplicemente parentesi graffa aprire, chiudere parentesi graffa.
Non mettere un punto e virgola Dopo una definizione di funzione.
Questo appare come una funzione definizione, ma non è,
e così il punto e virgola là è solo un ricordo che si
bisogno di mettere lì, perché altrimenti il ​​compilatore non
sapere cosa fare con esso.
E 'un errore molto comune per fare accidentalmente
quando sei prima definizione delle strutture.
>> OK.
Così siamo soliti definire le nostre strutture al vertice dei nostri programmi
perché sono probabilmente andando per essere utilizzati da molteplici funzioni.
Non vogliamo definire un struct all'interno di una funzione,
perché allora possiamo only-- il perimetro della struttura veramente
esiste solo all'interno di tale funzione.
Probabilmente ci piacerebbe definire una struttura in modo che possiamo utilizzare in molteplici funzioni,
o forse in più i file che sono legate insieme
per creare il nostro programma unico.
A volte anche invece della definizione della struttura
in cima dove si mette il libbra include e la vostra libbra definisce,
per esempio, si potrebbe metterli in separati i file dot h, che poi
libbra includere se stessi.
>> Così abbiamo strutture, ma ora abbiamo bisogno di ottenere dentro di loro.
Come si arriva all'interno di una struttura di accesso
i sub-variabili, tali variabili che esistono all'interno della struttura?
Bene, abbiamo qualcosa che si chiama l'operatore punto, che ci permette
per accedere ai campi della struttura.
Così, per esempio, diciamo che ho dichiarato tipo da qualche parte i miei dati della struttura
nella parte superiore del mio programma, o forse in un file puntino h che ho libbra inclusa.
Se poi voglio creare un nuovo variabili di quel tipo di dati, posso dire,
auto struct, la mia macchina, punto e virgola.
Proprio come potrei dire int x, o il nome della stringa e virgola.
>> Il tipo di dati: ecco auto struct, il nome della variabile è la mia macchina,
e poi posso usare l'operatore punto per accedere ai vari campi della mia macchina.
Quindi posso dire la mia auto dot anno è uguale a 2011.
Questo è perfettamente bene.
Anno, se vi ricordate, è stata definita come un campo intero all'interno di questa vettura struct
tipo di dati.
Quindi, qualsiasi variabile dei dati macchina struct tipo, come la mia macchina, posso dire la mia auto
anno dot uguale e quindi assegnare ancora un po valore intero 2011.
Il mio piatto auto puntino uguale CS50.
La mia carta dot contachilometri è uguale a 50505 e virgola.
Tutti questi sono perfettamente bene e che è
come si accede alla campi della struttura.
Strutture, però, non hanno bisogno di da creare in pila.
Proprio come qualsiasi altra variabile, abbiamo li può allocare dinamicamente.
Se abbiamo un programma che potrebbe essere generando molte strutture,
non sappiamo quanti stiamo andando ad avere bisogno,
allora dobbiamo dinamicamente destinare quelle strutture
come il nostro programma è in esecuzione.
E così, se abbiamo intenzione di accedere al campi di una struttura in tale contesto,
richiamo che abbiamo prima bisogno di dereference il puntatore alla struttura,
e poi una volta che il dereference puntatore, allora si può accedere ai campi.
Se abbiamo solo un puntatore alla struttura,
non possiamo dire campo puntatore puntino NOME e ottenere ciò che stiamo cercando.
C'è il passaggio aggiuntivo di dereferencing.
Quindi diciamo che invece del previous--
Come nell'esempio precedente, invece di dichiararlo
sullo stack, auto struct, il mio auto, punto e virgola, dico auto struct,
stella, un puntatore a una auto struct chiamato la mia macchina,
uguale formato malloc di auto struct.
Dimensioni della faremo capire quanti byte il nuovo tipo di dati occupa.
Non è necessariamente sufficiente utilizzare dimensioni, larghezza, int o char, o qualsiasi
dei tipi di dati incorporati.
Il compilatore è abbastanza intelligente per capire quanti byte
sono richieste, la vostra nuova struttura.
Così ho malloc me una unità della memoria abbastanza grande da contenere una macchina struct,
e ottengo un puntatore indietro a tale blocco di memoria,
e tale puntatore viene assegnato alla mia macchina.
>> Ora, se voglio accedere i campi della mia macchina,
Io prima dereference mia automobile utilizzando l'operatore dereference, stella
che abbiamo visto dai puntatori video, e poi dopo aver dereference,
quindi posso usare l'operatore punto per accedere ai vari campi della mia macchina.
Stella mia macchina puntino anno è pari a 2.011.
Ciò avrebbe l'effetto vogliamo in questo caso,
perché abbiamo dinamicamente assegnata la mia macchina.
>> Questo è il genere di fastidioso, però, giusto?
C'è un processo in 2 fasi ora.
Ora dobbiamo dereference-- abbiamo un operatore di stella,
e abbiamo un operatore punto.
E come ci si potrebbe aspettare, perché I programmatori C amano modi più brevi
fare cose, vi è un via più breve per fare questo.
C'è un altro operatore chiamato freccia, che rende questo processo molto più facile.
Il modo in cui funziona è la freccia è arrivato prima dereferenziazioni
il puntatore a sinistra lato dell'operatore,
e poi, dopo aver dereferenziato il puntatore sulla sinistra,
accede al campo a destra.
E così in precedenza abbiamo avuto questo tipo di Star mia macchina dot tutta questa roba,
come se ci fosse un sacco di cose lì.
Ma quello che possiamo invece fare è questo-- la mia macchina freccia anno è pari a 2.011.
>> Anche in questo caso, quello che sta succedendo qui?
In primo luogo, sto dereference la mia macchina.
Che ancora una volta, è un puntatore qui.
Poi, dopo aver dereferenziato la mia macchina, io
possono poi accedere ai campi anno, targa, e contachilometri
proprio come ho potuto prima di avere prima stella utilizzato per dereferenziare la mia auto,
e dot per accedere al campo.
Così si può avere strutture, è può avere puntatori a strutture,
e si ha modi per accedere i campi di queste strutture,
se si dispone di puntatori a loro o variabili stesse.
Dot o una freccia, a seconda della come è stato dichiarato la variabile.
Sono Doug Lloyd, questo è CS50.