PDA

Visualizza la versione completa : [C++] Aiuto puntatore (dubbi concettuali)


FinalFantasy
08-10-2005, 00:00
Il concetto dei puntatori ancora nn mi è kiaro:

*variabile = &intero;
*variabile = intero;

cosa succede in entrambi i casi?

void nome_funz (int &ciao);
void nome_funz (int *ciao);

che cosa cambia in entrabi i casi?

oregon
08-10-2005, 01:50
Per quanto riguarda le funzioni, passi il valore sempre per indirizzo, ma nel secondo caso devi usare il parametro come puntatore al dato; nel primo, puoi usare il parametro direttamente.



void nome_funz1(int &ciao)
{
ciao = 5;
}

void nome_funz2(int *ciao)
{
*ciao = 4;
}

int main()
{
int a=8;

nome_funz1(a);
printf("%d\n", a);

nome_funz2(&a);
printf("%d\n", a);

return 0;
}


Se il parametro viene passato per valore, lavori come nel primo caso ma le modifiche non influenzeranno il dato passato ma solamente una sua copia temporanea.

Per i puntatori, devi precisare meglio come hai dichiarato ed inizializzato le due variabili ...

infinitejustice
08-10-2005, 02:13
Una variabile è un'area di memoria cui puo essere associato un nome ed un valore. Cio che la rende unica è l'indirizzo di memoria, non il nome.

Questo significa che tu puoi avere piu variabili con lo stesso nome cosi come piu variabili senza nome. Ognuna di esse, in ogni caso, è resa unica dal proprio indirizzo.

esempio del primo caso

{
int x;
{
int x;
}
}


esempio del secondo, una qualunque variabile allocata dinamicamente tramite puntatore.


Il tipo di valore che la variabile puo contenere, dipende appunto dal tipo di variabile dichiarato.

Un puntatore è una variabile (e quindi ha un indirizzo di memoria proprio ed unico) con una particolarità: come valore ha l'indirizzo di un'altra variabile (quindi hanno tutti dimensione 2 bytes, perche sono quelli necessari per contenere un indirizzo).



Il concetto dei puntatori ancora nn mi è kiaro:

*variabile = &intero;
*variabile = intero;

cosa succede in entrambi i casi?

se hai queste definizioni:
typename intero;
typename *variabile;

Nel primo caso con variabile punti all'area di memoria di intero e quindi puoi manipolare intero attraverso variabile.

Nel secondo hai un errore di compilazione (devi passare un indirizzo)



Se invece intero è definito come
typename *intero;

Cioè anche intero è un puntatore allo stesso tipo di dato di variabile, allora il primo caso ti da errore perche variabile è un puntatore a typename e non un puntatore a puntatore a typename (doveva essere un doppio puntatore per essere corretto).

Mentre al contrario adesso la seconda istruzione ha senso: entrambe puntano all'oggetto cui intero punta gia (se punta a qualcosa).


void nome_funz(int &ciao);
void nome_funz(int *ciao);

che cosa cambia in entrabi i casi?

Nel primo caso, nella funzione nome_funz, lavori direttamente sull'oggetto originale.

Nel secondo, in teoria lavori per valore (perche tu passi il valore del suo indirizzo di memoria). In pratica poi puoi lavorare indirettamente su ciao attraverso il puntatore.

Se nn sei abituato alla sintassi dei puntatori la reference ti è piu comoda perche la sintassi è la stessa di una normale variabile.

Se poi in realtà vuoi passare l'oggetto per reference ma nn vuoi che sia modificato nella funzione, metti const e sei a posto.

:ciauz:

Loading