|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 1999
Città: Messina
Messaggi: 4358
|
[HELP] Strutture in C per un esame...
Salve,
SONO DISPERATO! Bel modo per iniziare ma ho un grosso problema Sto studiando C per dare un esame. Adesso sono arrivato alle pile e alle code e si introduce il concetto di struttura e di puntatore -> Purtroppo non sono riuscito a capirlo in nessuno modo. Ho provato a leggere sui libri ma sono molto criptici. Esiste qualche anima pia disposta a darmi qualche dritta o a linkarmi qualche tutorial che spiega passo passo a che servano e come si utilizzano??? Vi prego, sono DISPERATO! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
spiegati meglio ..............
__________________
Gnu/Linux User
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Una struttura è un inseme di variabili raggruppate e raggiungibili con un unico identificativo...
Ad esempio: Codice:
struct x {
int a;
char c;
};
/*Se dichiari*/
struct x variabile:
Devi mettere la parola struct ogni volta che chiami in causa il tipo x (ad esempio sizeof(struct x))... Se vuoi omettere la parola struct devi usare typedef... typedef struct x tipox; A questo punto puoi usare tipox come un qualsiasi tipo di variabile...omettendo struct... Oppure si può fare anche: Codice:
typedef struct x {
int a;
char c;
} tipox;
Un puntatore è un variabile atta a contenere un indirizzo di memoria che contiene una variabile di un determinato tipo... In questo caso entrano in gioco gli l'operatori & e *... & permette di ottenere l'indirizzo a cui è contenuta un carta variabile (ricordati che anche un puntatore è una variabile ed è memorizzato ad un certo indirizzo di memoria)... Ad esempio: tipox a; &a; /*ottiene l'indirizzo a partire da cui è memorizzata a*/ &a.c; /*ottiene l'indirizzo a partire da cui è memorizzata a.c*/ * ha due incarnazioni anche nettamente separate... La prima è quella che serve per dichiarare un puntatore: int * p; dichiara una variavbile p di tipo int *... Il tipo int * è un puntatore a una variabile di tipo int...o meglio p sarà atta a contenere indirizzi di memoria di variabili di tipo int... Codice:
int a, *p, b; /*dichiaro due interi a e b ed un puntatore a intero p*/ a = 5; p = &a; /*p uguale l'indirizzo di a - p punta ad a*/ Codice:
/*partendo dalla situazione predente*/ *p = 6; /*in pratica assegno alla cella di memoria il cui indirizzo è contenuto in p il valore 6*/ b = *p; /*assegno a b il contenuto dell'area di memoria puntata da p*/ Applicando i puntatori alel strutture possiamo parlare dell'operatore -> Codice:
tipox a, *p; *p = &a; /*stessa cosa, come prima, solo che qui a è una struttura*/ (*p).c = 'x'; /*raggiungo il contenuto dell'area di memoria puntata da p con *p...dato che una struct posso ottenere l'elemento c con l'aiuto dell'operatore . */ p->c = 'y'; /*è equivalente all'operazione sopra !!! -> permette di raggiungere direttamente (senza la notazione sopra) il membro della struttura puntata da p */ |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Mi sembra assurdo anche a me in effetti introdurre lo studio dei puntatori correlati alle strutture senza averli almeno già illustrati....
Cmq, per quanto riguarda l'utilizzo dei puntatori nelle strutture, devi pensare che: Codice:
struct nome_variabile {
int *x; /* puntatore al tipo int */
int *y; /* puntatore al tipo int */
} nome_istanza;
Per inizializzarli, si può assegnare loro l'indirizzo di una variabile. Nel caso sopra, la nostra variabile sarebbe l'istanza della struttura (nome_istanza) per cui, se dichiariamo due variabili di tipo int, ad esempio a, b, avremo che: Codice:
nome_istanza.x = &a nome_istanza.y = &b questo vuol dire che a *nome_istanza.x sarà assegnato il valore contenuto in a; analogamente, a *nome_istanza.y sarà invece assegnato il valore contenuto in b un altro semplice esempio lo trovi qui: http://alpha.science.unitn.it/~fiore...guidac030.html ovvio che se fai una ricerca con google su 'strutture e puntatori', trovi una mole enorme di link utilissimi.
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 1999
Città: Messina
Messaggi: 4358
|
Grazie mille per le rispostone!
Fatemi capire una cosa: int p - dichiaro un intero. int *p - è un puntatore, giusto? Punta l'indirizzo di memoria dove è contenuto p, giusto? Ma in pratica a che serve? perchè usare un puntatore quanto posso lavorare direttamente sulla variabile? Capisco per un array... Toglietemi un'altra curiosità, ma **p a che serve? Qualche volta il mio professore ha usato puntatore di puntatore. Perchè??? Scusate la mia ottusità! |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 1999
Città: Messina
Messaggi: 4358
|
Molto spesso negli alberi e nelle liste si usa ->
Example Parlo di code Codice:
struct nodo
{
int info;
struct nodo *next;
}
coda;
Codice:
int primo(coda *p)
{
return p-> info;
}
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
int **p è un puntatore ad un puntatore...in pratica p può puntare ad un variabile di tipo int *... Serve solitamente per modificare il contenuto (non quello a cui punta, ma la locazione a cui punta) di un puntatore all'interno di una funzione e per far quindi valere questa modifica anche nel flusso chiamante... |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
poi da una spiegazione di ricerca del primo elemento in coda
Cì un piccolo errore: Codice:
int primo(struct coda *p)
{
return p-> info;
}
p->info ritorna la variaibile info contenuta all'interno della struttura puntata da p (sopra te l'ho spiegato)... |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 1999
Città: Messina
Messaggi: 4358
|
Quindi dichiaro una variabile
int p ed un puntatore *p che ancora non punta a nulla... Per farlo puntare a p come devo fare? *p=p??? |
|
|
|
|
|
#10 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Codice:
int p; Codice:
int *p; Non puoi usarle contemporaneamente. Quote:
Codice:
*q=p; Per far puntare q alla zona in cui sta p, devi fare: Codice:
q=&p;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Darkman: te l'ho scritto sopra come fai ad inizializzare un puntatore !!! |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ah...ovviamente ad un puntatore puoi assegnare anche uno spazio di memoria allocato da malloc...
tipo * p; p = (tipo *) malloc(sizeof(tipo)); E dopo lo tratti come un qualsiasi puntatore... |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 1999
Città: Messina
Messaggi: 4358
|
GRAZIE MILLE A TUTTI!
Mi piacerebbe avervi a casa mia per spiagarmi gli altri punti oscuri di un anno di C non troppo chiaro... Provo a vedere cosa riesco a fare in questi giorni continuando a studia e a programmare qualcosina... Grazie a tutti ancora! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:09.



















