PDA

View Full Version : [C] Puntatori


-Ivan-
12-12-2005, 19:26
Mi potete dire se ci sono errori in questo codice:

funzione1(int *a, int *b, int *c);
funzione2(int *a,*b);
funzione3(int *c);

main()
{
int a,b,c;
funzione1(&a,&b,&c);
}

funzione1(int *a, int *b, int *c)
{
funzione2(&a, &b);
funzione3(&c);
if(*a>*b) *c=*b;
}

Ho dei problemi con i puntatori in un programma e non ne capisco il motivo.

pietro84
12-12-2005, 20:14
Mi potete dire se ci sono errori in questo codice:

funzione1(int *a, int *b, int *c);
funzione2(int *a,*b);
funzione3(int *c);

main()
{
int a,b,c;
funzione1(&a,&b,&c);
}

funzione1(int *a, int *b, int *c)
{
funzione2(&a, &b);
funzione3(&c);
if(*a>*b) *c=*b;
}

Ho dei problemi con i puntatori in un programma e non ne capisco il motivo.

il primo errore è che non hai inizializzato a,b,c nel programma principale.

-Ivan-
12-12-2005, 20:31
il primo errore è che non hai inizializzato a,b,c nel programma principale.

Ah già, non ha senso fare l'if in questo caso, però a livello di puntatori ha senso questo codice?
Perchè nel programma che sto facendo non capisco il motivo per cui a volte necessito di passare una variabile a una funzione con la & davanti e altre volte no.
Il codice sopra per quanto riguarda l'uso dei puntatori ha degli errori?

pietro84
12-12-2005, 20:34
Ah già, non ha senso fare l'if in questo caso, però a livello di puntatori ha senso questo codice?
Perchè nel programma che sto facendo non capisco il motivo per cui a volte necessito di passare una variabile a una funzione con la & davanti e altre volte no.
Il codice sopra per quanto riguarda l'uso dei puntatori ha degli errori?

mi sembra proprio di no. quando passi la variabile per valore non ci vuole l'operatore & . quando passi la variabile per indirizzo ci vuole l'operatore &,che restituisce appunto l'indirizzo della variabile a cui è applicato.

-Ivan-
12-12-2005, 20:44
mi sembra proprio di no. quando passi la variabile per valore non ci vuole l'operatore & . quando passi la variabile per indirizzo ci vuole l'operatore &,che restituisce appunto l'indirizzo della variabile a cui è applicato.

Ecco io dovrei passare tutte le variabili per indirizzo.

NA01
12-12-2005, 20:56
nel codice che hai dato
- due funzioni sono dichiarate ma non definite, quindi non si compila nulla
- i prototipi delle due funzioni che mancano non sono coerenti con il loro utilizzo

quando sei dentro a funzione1 a è di tipo int* (puntatore a intero), non è un intero.
quindi quando passi &a (l'indirizzo di a) non stai passando un puntatore a intero, bensì l'indirizzo della tua variabile a .
dato che a è già un puntatore passi un puntatore a puntatore, quindi il prototipo corretto è con i paramentri di tipo int** (puntatore a puntatore a intero).

per passare l'indirizzo della variabile intera che hai nel main dentro a funzione1 basta passare a che è già un indirizzo.
la deferenziazione sul maggiore e sull'uguale invece è corretta.

ciao

pietro84
12-12-2005, 20:56
Ecco io dovrei passare tutte le variabili per indirizzo.

e allora devi mettere l'operatore & per le variabili,per gli array naturalmente non ci vuole perchè quando passi l'array ti riferisci già all'indirizzo del primo elemento.

71104
12-12-2005, 21:03
Mi potete dire se ci sono errori in questo codice: ce ne sono un paio:

funzione1(int *a, int *b, int *c);
funzione2(int *a,*b); qui non hai scritto "int" davanti a "*b".

funzione3(int *c);

main()
{
int a,b,c; qui, come ti hanno detto, è meglio inizializzare. ;)

funzione1(&a,&b,&c);
}

funzione1(int *a, int *b, int *c)
{
funzione2(&a, &b); ennò!! qui stai passando due doppi puntatori a una funzione che vuole due puntatori singoli!!

funzione3(&c); e qui idem

inoltre presumo che prima di compilare tu abbia scritto anche l'implementazione di funzione2 e funzione3... ;)

pietro84
12-12-2005, 21:13
nel codice che hai dato

dato che a è già un puntatore passi un puntatore a puntatore, quindi il prototipo corretto è con i paramentri di tipo int** (puntatore a puntatore a intero).



:read: quoto, mi era sfuggito

-Ivan-
13-12-2005, 14:08
Ciao grazie a tutti delle risposte.
Questo codice non l'ho ovviamente compilato, ho buttato giù un paio di righe per esporre il concetto che non riuscivo a capire ma non sono riuscito a spiegarmi bene.
Il codice delle ultime funzioni non l'ho nemmeno scritto perchè non era una parte che mi interessava.
Il mio dubbio era questo:
se io passo una variabile per indirizzo a una funzione e questa funzione richiama un'altra funzione devo passare anche a quest'ultima quando la chiamo la variabile per indirizzo?
La risposta era no, questo era il dubbio cmq grazie a tutti.