Ciao Seven,premetto che non sono un esperto programmatore,però conosco qualcosina,e spero di esserti utile,e se vuoi puoi continuare a scrivere per chiarire dei dubbi,e se saprò risponderti,appena avrò tempo lo farò volentieri.
Adesso non ho materiale sotto gli occhi,e non sono sicuro di ricordare bene,e pertanto mi mantengo sul generico.
1)Il compilatore riserva dello spazio di memoria per allocare variabili,puntatori,vettori,...,che varia a seconda del tipo(int,float,...).
Non tutti gli elementi sono memorizzati in aree di memoria gestite con caratteristiche identiche,ad esempio vi sono dati che vengono memorizzati nello "heap",
ed altri che vengono memorizzati in altre aree della memoria.
2)Non tutti gli elementi hanno caratteristiche simili.
Ad esempio i vettori,le matrici(vettori multi dimensionali)i quali sono degli insiemi di elementi tutti dello stesso tipo,hanno una dimensione fisica(quella allocata dal compilatore al momento della loro dichiarazione)ed una dimensione logica,ossia il numero di celle che l'utente decide di utilizzare per risolvere il suo problema specifico.
Tuttavia,tali elementi non sono gestiti in modo dinamico dal compilatore,cioè,non è possibile modificare la loro dimensione fisica durante la fase di sviluppo del codice,e questo può presentare degli svantaggi notevoli.
Vi sono strutture dati(astratte) dinamiche,come liste(semplici,con priorità-ossia gestite tramite un ordinamento specifico-,con doppi puntatori...)code,code circolari,pile...(che sono anch'esse riconducibili al tipo di dato lista,ma che si differenziano tra loro perchè non sempre sono gestite allo stesso modo per quel che concerne le operazioni di base,quali inserimento o cancellazione di elementi,ad esempio in testa,in coda,...)alberi binari,...,le cui dimensioni le può modificare l'utente al momento del bisogno,a seconda delle necesità.
Per fare ciò,si può usare la funzione predefinita malloc() per allocare spazio,e la funzione predefinita free() per liberare la memoria,quando l'utente non ha
più bisogno di gestire determinati elementi correlati a tali strutture dati.
Tali strutture dati(liste,code,...)sono definite tramite il tipo di dato struttura,che si differisce dal tipo di dato array perchè contiene elementi che non sono tutti dello stesso tipo,quali ad esempio,int,flloat,...
Ciao ed in bocca al lupo seven,vedrai che andrà tutto benissimo...
- - - Updated - - -
Ciao Seven,premetto che non sono un esperto programmatore,però conosco qualcosina,e spero di esserti in qualche modo utile.
---------------
Certo seven,le strutture sono tipi di dato che possono essere inizializzate da riga di comando.
Comincio col dirti che la differenza sostanziale tra i tipi di dato struttura e gli array,è che gli array possono
contenere solamente elementi dello stesso tipo.
ALCUNI ESEMPI:
1)int vet[5]; è la dichiarazione di un array che può contenere al massimo 5 interi.
2)float vet[7]; è la dichiarazione di un array che può contenere al massimo 7 numeri decimali.
3)char str[10]; è la di chiarazione di un array di caratteri,detto comunemente "stringa",che può contenere al massimo 10
caratteri,incluso il carattere '\0' che è il carattere di fine stringa.
STRUTTURE:
Le strutture possono invece contenere anche elementi di tipi differenti.
DEFINIZIONE DI UNA STRUTTRA
struct dati
{
int valore;
char str[30];
};
Così facendo ho definito una struttura di nome dati che contiene due elementi al suo interno,ossia un dato intero di nome valore,
ed una stringa di caratteri di nome str.
Così facendo noi abbiamo solamente definito una struttura,ma il compilatore non riserverà ad essa alcuno spazio in memoria,in quanto non abbiamo dichiarato alcuna struttura.
DICHIARAZIONE DI UNA STRUTTURA
La dichiarazione di una struttura può avvenire in due modi:
1a)
struct dati
{
int valore;
char str[30];
}prima,seconda;
In tal modo abbiamo dichiarato due strutture di tipo dati,una di nome prima,e l'altra di nome seconda,ciascuna delle quali
contiene al suo interno due valori,ossia un intero di nome valore,ed una stringa di caratteri di nome str.
1b)
struct coord
{
int x;
int y;
}prima,seconda;
In tal modo abbiamo dichiarato due strutture di tipo coord,una di nome prima,e l'altra di nome seconda,ciascuna delle quali
contiene al suo interno due valori di tipo int,ossia x ed y.
2)
//Definizione della struttura coord
struct coord
{
int x;
int y;
};
//Dichiarazione delle strutture prima e seconda
struct coord prima;
struct coord seconda;
INIZIALIZZAZIONE DI UNA STRUTTURA
Supponiamo di avere:
struct coord
{
int x;
int y;
}prima,seconda;
Per accedere agli elementi x ed y delle strutture prima e seconda,si utilizza il punto . (operatore di elemento della struttura).
Pertanto,scrivendo:
prima.x accediamo all'elemento x della struttura prima,e scrivendo prima.y accediamo all'elemento y della medesima struttura(prima).
Stessa cosa dicasi per la struttura seconda.
Proviamo ora ad inizializzare i componenti delle strutture prima e seconda.
prima.x =15; //Abbiamo assegnato il valore 15 al componente x della struttura prima
prima.y=20;//Abbiamo assegnato il valore 20 al componente y della struttura prima
seconda.x=7;//Abbiamo assegnato il valore 7 al componente x della struttura seconda
seconda.y=12;//Abbiamo assegnato il valore 12 al componente y della struttura seconda
DA RIGA DI COMANDO
printf(" Inserire il valore di x della struttura prima: ");
scanf("%d",&prima.x);
printf(" Inserire il valore di y della struttura prima: ");
scanf("%d",&prima.y);
...
COI PUNTATORI
Supponiamo di avere:
struct coord
{
int x;
int y;
};
struct coord *p_int; //Dichiarazione del puntatore di tipo coord di nome p_int
Come tu sai seven,un puntatore necessita di un indirizzo di memoria a cui puntare,è pertanto dobbiamo necessariamente
dichiarare un'istanza di tipo coord alla quale il puntatore possa essere indirizzato:
struct coord prima; //Dichiarazione della struttura prima di tipo coord
p_int = &prima;//Inizializzazione del puntatore p_int
ACCESSO AI COMPONENTI DELLA STRUTTURA PRIMA
SENZA AVVALERSI DEL PUNTATORE(metodo visto precedentemente)
prima.x =10;
prima.y=9;
TRAMITE I PUNTATORI
primo modo:
(*p_int).x=10;
(*p_int).y=9;
Le parentesi sono necessarie in quanto l'operatore . ha la precedenza sull'opratore *.
secondo modo(tramite il puntatore di membro indiretto -> che si ottiene premendo il tasto meno seguito dal simbolo maffiore >):
p_int->x=10;
p_int->y=9;
Quelli che ti ho fatto io sono solamente dei semplicissimi esempi,ma le strutture possono contenere al loro interno qualsiasi tipo di dato,anche altre strutture.
ARRAY DI STRUTTURE
struct utente
{
int codice;
char nome[30];
char cogome[30];
}array[3];
Così facendo ho dichiarato tre strutture di tipo utente e di nome array,ognuna delle quali contiene al suo interno un intero di nome codice,e le stringhe nome e cognome,le quali ovviamente vanno inizializzate.
Tali strutture di nome array sono: array[0],array[1] ed array[2] in quanto come tu ben sai gli array sono indicizzati da 0 ad n-1.
Ora ti facco vedere un altro modo per inizializzare le strutture.
struct utente
{
int codice;
char nome[30];
char cogome[30];
}array[3]={{128,'Giada','Bianchi'},{002,'Clarissa','Rossi'},{13,'Serena','Venturi'}};
PERCHE' SI UTILIZZANO LE STRUTTRE?
Uno dei principali vantaggi delle strutture consiste nel fatto che si possono copiare le informazioni tra strutture dello stesso tipo,
tramite una semplice istruzione di eguaglianza.
ESEMPIO:
struct dati
{
int x;
int y;
int z;
}prima,seconda;
L'istruzione prima=seconda;
corrisponde alle tre istruzioni a seguire:
prima.x=seconda.x;
prima.y=seconda.y;
prima.z=seconda.z;
P.S.
Oggi ti ho risposto senza centrare la tua domanda,a causa del fatto che mi sono distratto.
Spero di esserti stato utile seven.
In bocca al lupo