View Full Version : [HELP] Strutture in C per un esame...
Salve,
SONO DISPERATO!:cry:
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! :cry:
spiegati meglio ..............
Una struttura è un inseme di variabili raggruppate e raggiungibili con un unico identificativo...
Ad esempio:
struct x {
int a;
char c;
};
/*Se dichiari*/
struct x variabile:
variabile.a permette di lavorare su a, variabile.c permette di lavorare su c... E qui non ci dovrebbero essere difficoltà...
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:
typedef struct x {
int a;
char c;
} tipox;
Per i puntatori...fanno male ad introdurli con le strutture dati perchè in teoria sarebbe meglio parlarne prima...
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...
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*/
Ora entra in gioco l'altra funzionalità di *... * applicato ad un puntatore permette di raggiungere l'area di memoria puntata dal puntatore:
/*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*/
In pratica a questo punto a contiene 6 e b contiene il contenuto dell'intero puntato da p...cioè 6...
Applicando i puntatori alel strutture possiamo parlare dell'operatore ->
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 */
Fammi sapere se hai capito ;)
maxithron
13-06-2004, 15:55
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:
struct nome_variabile {
int *x; /* puntatore al tipo int */
int *y; /* puntatore al tipo int */
} nome_istanza;
In questo semplice caso, abbiamo solo dichiarato 2 puntatori al tipo int ma senza inizializzarli ancora, quindi, servono a poco.
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:
nome_istanza.x = &a
nome_istanza.y = &b
ora, i puntatori sono inizializzati.
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/~fiorella/guidac/guidac030.html
ovvio che se fai una ricerca con google su 'strutture e puntatori', trovi una mole enorme di link utilissimi.
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à!:(
Molto spesso negli alberi e nelle liste si usa ->
Example
Parlo di code
struct nodo
{
int info;
struct nodo *next;
}
coda;
poi da una spiegazione di ricerca del primo elemento in coda
int primo(coda *p)
{
return p-> info;
}
Che vuol dire quel return p-> info??
Originariamente inviato da Darkman
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à!:(
Noooo...int *p non punta a niente se non lo inzializzi... int *p dichiara un puntatore di nome p che può puntare ad un inter...
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...
poi da una spiegazione di ricerca del primo elemento in coda
Cì un piccolo errore:
int primo(struct coda *p)
{
return p-> info;
}
p punta ad un elemento di tipo coda...
p->info ritorna la variaibile info contenuta all'interno della struttura puntata da p (sopra te l'ho spiegato)...
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???
Ziosilvio
14-06-2004, 12:58
Originariamente inviato da Darkman
Quindi dichiaro una variabile
int p
ed un puntatore *p che ancora non punta a nulla...
La dichiarazione:
int p;
dichiara che p e' una variabile di tipo int; invece:
int *p;
dichiara che p e' variabile di tipo puntatore a int.
Non puoi usarle contemporaneamente.
Per farlo puntare a p come devo fare?
*p=p???
Supponendo che il puntatore a int si chiami q, se fai:
*q=p;
copi il valore di p nella zona puntata da q, pericoloso se p non e' stato inizializzato con malloc.
Per far puntare q alla zona in cui sta p, devi fare:
q=&p;
Originariamente inviato da Darkman
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???
Non puoi dare los tesso nome a variabili diverse ;)
Darkman: te l'ho scritto sopra come fai ad inizializzare un puntatore !!!
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...
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!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.