[Powered by Google Translate] Parliamo di array.
Quindi, perché si vuole usare gli array?
Beh diciamo che hai un programma che ha bisogno di memorizzare 5 ID studenti.
Potrebbe sembrare ragionevole avere 5 variabili separate.
Per motivi che vedremo tra un po ', iniziamo a contare da 0.
Le variabili che dovrete sarà id0 int, int id1, e così via.
La logica che vogliamo eseguire su un ID studente dovrà essere copiato e incollato
per ciascuno di questi ID studenti.
Se vogliamo verificare quali studenti capita di essere in CS50,
avremo prima bisogno di verificare se id0 rappresenta lo studente al corso.
Poi, per fare la stessa cosa per lo studente successivo, avremo bisogno di copiare e incollare il codice per ID0
e sostituire tutte le occorrenze di id0 con id1 e così via per id2, 3, e 4.
>> Non appena si sente che abbiamo bisogno di copiare e incollare,
si dovrebbe cominciare a pensare che ci sia una soluzione migliore.
Ora, cosa succede se ti rendi conto che non è bisogno di 5 ID studente, ma piuttosto 7?
Hai bisogno di andare indietro nel codice sorgente e aggiungere in un ID5, un id6,
e copiare e incollare la logica per verificare se gli ID appartengono alla classe di questi 2 nuovi ID.
Non vi è nulla che collega tutti questi ID insieme, e quindi non c'è modo di chiedere
il programma di fare questo per gli ID da 0 a 6.
Bene, ora ci si rende conto di avere 100 studenti ID.
Sta cominciando a sembrare meno ideale per necessità di dichiarare separatamente ciascuno di questi ID,
e copiare e incollare qualsiasi logica per i nuovi ID.
Ma forse siamo determinati, e lo facciamo per tutti i 100 studenti.
Ma cosa succede se non si sa quanti studenti ci sono in realtà?
Ci sono solo alcuni studenti n e il programma deve chiedere all'utente cosa che n è.
Uh oh. Questo non è di andare a lavorare molto bene.
Il programma funziona solo per qualche numero costante di studenti.
>> Risolvere tutti questi problemi è la bellezza di array.
Così che cosa è un array?
In alcuni linguaggi di programmazione di un tipo di matrice potrebbe essere in grado di fare un po 'di più,
ma qui ci concentreremo sulla struttura di base di dati di matrice così come lo vedrai in C.
Un array è solo un grande blocco di memoria. Tutto qui.
Quando diciamo che abbiamo un array di 10 interi, che significa semplicemente che abbiamo un po 'di blocco
di memoria che è abbastanza grande da contenere 10 interi separati.
Supponendo che un numero intero di 4 byte, questo significa che un array di 10 interi
è un blocco continuo di 40 byte in memoria.
Anche quando si utilizzano array multidimensionali, che non andranno in a qui,
è ancora solo un grosso blocco di memoria.
La notazione multidimensionale è solo una comodità.
Se avete un 3 a 3 matrice multidimensionale di interi,
allora il vostro programma in realtà solo considerare questo come un grosso blocco di 36 byte.
Il numero totale di interi è 3 volte 3, e ciascun intero occupa 4 byte.
>> Diamo un'occhiata a un esempio di base.
Possiamo vedere qui 2 modi diversi di matrici che dichiarano.
Dovremo commentare uno di loro fuori per il programma per la compilazione
poiché noi dichiariamo x due volte.
Daremo uno sguardo ad alcune delle differenze tra questi 2 tipi di dichiarazioni in un po '.
Entrambe queste linee di dichiarare un array di dimensione n,
dove abbiamo # define N, 10.
Si potrebbe facilmente hanno chiesto all'utente di specificare un numero intero positivo
e utilizzato come numero intero che un certo numero di elementi nella nostra matrice.
Come il nostro esempio ID studente prima, questo è un po 'come dichiarare completamente separati 10
variabili immaginario; x0, x1, x2, e così via fino a xN-1.
Ignorando le linee in cui si dichiara l'array, notare le parentesi quadre intatte
all'interno di cicli.
Quando si scrive qualcosa di simile x [3], che mi limiterò a leggere come x staffa 3,
si può pensare a come chiedere l'immaginario x3.
Notare che con un array di dimensione N, questo significa che il numero all'interno delle parentesi,
che chiameremo l'indice, può essere qualsiasi cosa, da 0 a N-1,
che è un totale di indici n.
>> Per riflettere su come questo funziona davvero
ricordare che la matrice è un grosso blocco di memoria.
Supponendo che un numero intero è di 4 byte, l'x intero array è un blocco 40 byte di memoria.
Quindi x0 si riferisce ai primi 4 byte del blocco.
X [1] si riferisce ai successivi 4 byte e così via.
Ciò significa che l'inizio di x è mai tutto il programma deve tenere traccia di.
Se si desidera utilizzare x [400], il programma sa che questo è equivalente
a soli 1600 byte dopo l'inizio della x.
Dove si ottiene 1.600 byte da? E 'a soli 400 volte 4 byte per intero.
>> Prima di procedere, è molto importante rendersi conto che in C
non vi è alcuna applicazione dell'indice che usiamo nella matrice.
Il nostro grande blocco è a soli 10 numeri interi a lungo, ma non griderà contro di noi se scriviamo x [20]
o anche x [-5].
L'indice non ha nemmeno bisogno di essere un numero.
Può essere qualsiasi espressione arbitraria.
Nel programma si usa la variabile i del ciclo for per indice nella matrice.
Questo è un modello molto comune, loop da i = 0 alla lunghezza della matrice,
e poi ho utilizzando come indice per l'array.
In questo modo in modo efficace ciclo sull'intera matrice,
ed è possibile assegnare ad ogni punto della matrice o utilizzarlo per un po 'di calcolo.
>> Nel primo ciclo for, i inizia a 0,
e così sarà assegnare al punto 0 nella matrice, il valore 0 volte 2.
Poi i passi, e si assegna il primo posto nella matrice il valore 1 volte 2.
Poi i passi di nuovo e così via fino a quando si assegna alla posizione N-1 nella matrice
il valore di N-1 2 volte.
Per questo abbiamo creato un array con i primi 10 numeri pari.
Evens Forse sarebbe stato un po 'meglio il nome della variabile di x,
ma che avrebbe dato via le cose.
Il secondo ciclo for poi a stampare i valori che abbiamo già memorizzati all'interno della matrice.
>> Proviamo eseguire il programma con entrambi i tipi di dichiarazioni di matrice
e dare un'occhiata all'uscita del programma.
Per quanto si può vedere, il programma si comporta allo stesso modo per entrambi i tipi di dichiarazioni.
Diamo anche un'occhiata a cosa succede se cambiamo il primo ciclo di non fermare a N
ma piuttosto dire 10.000.
Ben oltre la fine della matrice.
Oops. Forse avete visto questo prima.
Un errore di segmentazione significa che il programma è andato in crash.
Si inizia a vedere questi quando si tocca le aree di memoria non si deve toccare.
Qui stiamo toccando 10.000 posti oltre l'inizio di x,
che è evidentemente un posto nella memoria non si deve toccare.
Così la maggior parte di noi probabilmente non sarebbe accidentalmente messo 10000 al posto di N,
ma cosa succede se facciamo qualcosa di più sottile, come dire di scrittura inferiore o uguale a N
nella condizione di ciclo rispetto a meno di N.
Ricordate che un array ha solo indici da 0 a N-1,
il che significa che è indice N oltre la fine della matrice.
Il programma non può andare in crash in questo caso, ma è ancora un errore.
In realtà, questo errore è così comune che ha il suo nome,
un off da 1 errore.
>> Questo è tutto per le basi.
Quindi quali sono le principali differenze tra i 2 tipi di dichiarazioni di matrice?
Una differenza è dove il grande blocco di memoria va.
Nella prima dichiarazione, che chiamerò la staffa-array di tipo,
anche se questo non è affatto un nome convenzionale,
andrà in pila.
Considerando che, nella seconda, che chiamerò il puntatore-array di tipo, andrà sul mucchio.
Ciò significa che quando la funzione ritorna, la matrice staffa verrà automaticamente deallocato,
che, come si deve chiamare explicitily libero sull'array puntatore
oppure si ha una perdita di memoria.
Inoltre, la matrice di supporto non è in realtà una variabile.
Questo è importante. E 'solo un simbolo.
Si può pensare ad esso come una costante che il compilatore sceglie per voi.
Ciò significa che non si può fare qualcosa di simile x + + con il tipo di supporto,
anche se questo è perfettamente valido con il tipo di puntatore.
>> Il tipo di puntatore è una variabile.
Per il tipo di puntatore, abbiamo due blocchi distinti di memoria.
La variabile x stesso viene memorizzato nella pila ed è solo un singolo puntatore,
ma il grande blocco di memoria è memorizzato sul mucchio.
La variabile x nello stack memorizza solo l'indirizzo
del grande blocco di memoria sul mucchio.
Una conseguenza di ciò è la dimensione dell'operatore.
Se chiedete la dimensione della matrice supporto, vi darà la dimensione del grande blocco di memoria,
qualcosa come 40 byte,
ma se chiedete per la dimensione del tipo di puntatore di array,
vi darà la dimensione della variabile x stesso, che l'apparecchio è probabile soli 4 byte.
Usando il puntatore-array di tipo, non è possibile chiedere direttamente
la dimensione del grande blocco di memoria.
Questo di solito non è molto più di una restrizione dato che molto raramente desidera che la dimensione
del grande blocco di memoria, e siamo in grado di calcolare se di solito ne abbiamo bisogno.
>> Infine, la matrice staffa succede a fornirci una scorciatoia per l'inizializzazione di un array.
Vediamo come possiamo scrivere i primi 10 numeri interi, anche utilizzando il initilization di scelta rapida.
Con l'array puntatore, non c'è un modo per fare un collegamento come questo.
Questa è solo un'introduzione a ciò che si può fare con gli array.
La loro presenza in quasi tutti i programmi che scrivi.
Speriamo che ora è possibile vedere un modo migliore di fare l'esempio degli studenti ID
dall'inizio del video.
>> Il mio nome è Rob Bowden, e questo è CS50.