PDA

View Full Version : [C] Capire i puntatori


ubanton
30-09-2009, 10:29
Ragazzi, ho questo codice:

*Programma che scambia i valori di due parametri, versione fatta apposta per non funzionare*
#include <stdio.h>
#include <stdlib.h>

void scambia(int a, int b);
int main(int argc, char *argv[])
{
int x, y;

x=8;
y=16;
printf("Prima dello scambio\n");
printf("x=%d,y=%d\n", x, y);

scambia(x,y);

printf("Dopo lo scambio\n");
printf("x=%d,y=%d\n", x, y);

system("PAUSE");
return 0;
}

void scambia(int a, int b)
{
printf("a=%d,b=%d\n", a, b);
int temp;

temp=a;
printf("quanto vale a=%d\n",a);

a=b;
b=temp;
}

Ragà ho visto che alla fine i valori non vengono scambiati invece usando i puntatori il prog effettua lo scambio, allora vorrei capire perchè questa versione non funge, crco di spiegare i passaggi che fa una volta richiamata la funzione scambia:
-)prende i valori di x e y (parametri attuali) e li copia in a e b(par. formali) e fin qua ci siamo..
-)fa lo scambio con l'uso di una variabile di scambio temporanea a temp associa val di a poi ad a si da val di b e poi in b si prende il valore di temp(ovvero il val iniziale di a)
adesso mi spiegate cosa succede, cioè il codice non esce, non va nel main (perchè non escono i valori scambiati)?
Se mi aiutate su questo credo che riuscirò a capire gran parte del c++, visto che tutto l'esame di programmazione I si basa principalemte sul passaggio con i puntatori

tomminno
30-09-2009, 10:41
Non funziona per il semplice fatto che a e b di scambia sono solo copie di x e y presenti nel main. Quindi te modifichi a e b ma queste modifiche non si ripercuotono su x e y.
Se vuoi lavorare su x e y all'interno di scambia devi usare i puntatori.

Occhio a non confondere C e C++, sono "leggermente" diversi.

ubanton
30-09-2009, 10:45
cioè dopo che ha scambiato a e b dentro la void scambia, questi valori non ritornano nella chiamata nel main?(mi puoi spiegare proprio passo passo io voglio capire il perchè)
Grazie mille

tomminno
30-09-2009, 12:37
cioè dopo che ha scambiato a e b dentro la void scambia, questi valori non ritornano nella chiamata nel main?(mi puoi spiegare proprio passo passo io voglio capire il perchè)
Grazie mille

Qui bisogna partire proprio dalle basi:
I C il passaggio di parametri può avvenire solo tramite copia (anche i puntatori vengono passati per copia, tant'è che se si vuole modificare un puntatore bisogna usare l'indirezione multipla).
Quindi te dichiarando la firma del metodo così:

void scambia(int a, int b)

specifica che i valori che passi vengono copiati sulle variabili "a" e "b", quindi te all'interno della funzione lavori su queste che sono solo copie del valore degli originali "x" e "y".
Tanto per capirci è come se te prendi un documento in una cartella e lo copi da un'altra parte, se modifichi la copia, il documento originale non viene modificato.
Come puoi fare per modificare il documento originale? Crei un link al documento, per cui se ci clicchi sopra in realtà stai lavorando sul file posizionato da un'altra parte.
Ecco il puntatore funge da equivalente del link, tramite il puntatore puoi modificare la variabile che sta da un'altra parte.

banryu79
30-09-2009, 13:34
l'indirettezza multipla.

Indirezione.
La parola "indirettezza" non l'ho mai sentita e così ad orecchio credo neppure esista.

@ubanton:
se posso ti consiglio di reperire e studiare del materiale specifico sul linguaggio C. I tipi puntatore sono dei tipi primitivi di dato del linguaggio C e non sapere di preciso cosa sono (come non sapere di preciso come è strutturato il sistema dei tipi primitivi in C) ti renderà sempre arduo capire e scrivere del codice in C.
Si tratta proprio delle basi minime da sapere, percui se prevedi di usarlo ancora (il linguaggio C) ti consiglio vivamente di consultare un buon manuale per questo linguaggio.

tomminno
30-09-2009, 15:05
Indirezione.
La parola "indirettezza" non l'ho mai sentita e così ad orecchio credo neppure esista.


Ehm si hai ragione correggo!