• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Tornano i problemi coi maledetti puntatori...

gedamial

Utente Senior
Autore del topic
9 Giugno 2010
1.937
69
Miglior risposta
0
Salve.


Tornano inevitabilmente i problemi coi stramaledettissimi puntatori in C++

Ragazzi vi prego di prestare attenzione al problema che vi sto per esporre, altrimenti non capireste i miei ragionamenti e le mie lacune.
Può sembrare lungo, ma in realtà sono io ignorante che faccio casini.


PROBLEMA 1

Ho questo codice:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


La funzione func() richiede un int *p cioè il VALORE dell'oggetto al quale il puntatore sta puntando, ok?

Sotto, nel main, io faccio semplicemente func(pointer)

PERCHE'?

Se la funzione chiede il VALORE del puntatore (*p), allora PERCHE' gli mando l'indirizzo (pointer)?

Non dovrebbe essere func(*pointer)? La funzione chiede valore, gli mando il valore, no?


PROBLEMA 2

Ho questo codice

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

La funzione richiede un int &p cioè un VALORE. Solitamente, con le variabili NORMALI, il & indica che si vuole richiedere un indirizzo, ma siccome stiamo parlando di puntatori il simbolo & richiede il valore. Ok? Ci siamo.

NELLA FUNZIONE, io scrivo p = 100, mentre nel PROBLEMA 1 ho scritto *p = 100

Perchè nel PROBLEMA 1 ho dovuto omettere l'asterisco, e qui invece l'ho dovuto mettere?

UNA PROBABILE RISPOSTA potrebbe essere:

Nel PROBLEMA 1 hai chiesto nella funzione il valore del puntatore (*p) per poi cambiarlo (*p = 100)
Nel PROBLEMA 2 hai chiesto di nuovo il valore del puntatore (&p) per poi cambiarlo (p=100)

E' QUI CHE NON CAPISCO!

Mica il VALORE di un puntatore si cambia facendo p = 100? Stiamo parlando di VALORE non di INDIRIZZO!

Io sapevo che p è l'indirizzo e *p è il VALORE!


PROBLEMA FINALE

Qual è la differenza fra i due codici? ._.


Grazie in anticipo!
 
Ultima modifica:
Nel secondo caso realizzi una chiamata di funzione per riferimento, mentre nel primo realizzi lo stesso comportamento usando i puntatori. Il secondo metodo è esclusivo del C++, mentre il primo può essere usato anche in C.
Il simbolo * ha sia il significato di "tipo puntatore a " che "valore puntato da". Mi spiego meglio; con questa definizione
[code
void func(int *p)
{
*p = 100;
}
[/code]
stai dicendo che la funzione riceve un parametro puntatore ad intero, poi imposta il valore puntato dal puntatore a 100. Poi nel main hai
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
definisci una variabile intera a e la inizializzi a 10, poi definisci un puntatore ad intero pointer che punta ad a (lo inizializzi con l'indirizzo della variabile a). Chiami func e gli passi il puntatore ad intero (se guardi sopra avevi stabilito che riceveva appunto quello come parametro). Adesso se vai a stampare il valore puntato da pointer sarà giustamente 100.

Nel secondo problema invece hai questa definizione
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
significa che si aspetta che gli passi un intero (non più un indirizzo), ma del parametro passato non viene fatta la copia, ma si crea una sorta di alias; in pratica le modifiche che fai sul parametro p si andranno a riflettere anche sulla variabile intera che hai passato. (guarda altri esempi qui:
Perfavore, Entra oppure Registrati per vedere i Link!
)

In pratica i due problemi realizzano lo stesso comportamento, ma adottando due tecniche differenti.
 
  • Like
Reactions: 1 person
@ptm
ti ringrazio moltissimo.

Per quanto riguarda il primo problema, la soluzione sta nel fatto (come dici tu) che la funzione chiede un puntatore, non il valore di un puntatore. Grazie ;)

Nel secondo problema, invece, ho ancora dei dubbi.

La funzione chiede un &p. Il simbolo &, posto prima di una variabile, significherebbe "indirizzo della variabile". A quanto pare, usato nelle funzioni, è cosa totalmente differente in quanto func(int &p) chiede un valore da modificare permanentemente, non un indirizzo vero e proprio.

E' così?

p.s: so cos'è il passaggio per valore o per indirizzo/riferimento, i miei sono solamente dei dubbi per quanto riguarda argomenti richiesti da una funzione / argomenti da mandare


Altra domanda:

Ecco l'immagine del codice:
Perfavore, Entra oppure Registrati per vedere i Link!


La funzione vuole un parametro con due asterischi... che significa? Cosa me ne faccio di una funzione del genere?

Anche perchè se tento di modificare il valore del puntatore (facendo *p = 100) mi da anche errore...
 
Si, essendo nella lista dei parametri di una funzione ha il significato di "passaggio per riferimento"...
La funzione con **p è una funzione che riceve un puntatore a puntatore; normalmente viene usata per modificare il contenuto di un puntatore. Per esempio
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
 
  • Like
Reactions: 1 person
Si, essendo nella lista dei parametri di una funzione ha il significato di "passaggio per riferimento"...
La funzione con **p è una funzione che riceve un puntatore a puntatore; normalmente viene usata per modificare il contenuto di un puntatore. Per esempio
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Grazie ancora.

Ma io sapevo che per modificare un puntatore bastava settare la funzione in questo modo:

func(int *&p)

Come si differenzia quest'ultima da func(int **p)

?
 
E' la stessa differenza di prima con *& passi il puntatore per riferimento e lo modifichi (C++), con ** realizzi la stessa cosa con un puntatore a puntatore (C/C++)
 
Nell'uso "normale" si... poi alcune differenze nell'uso di uno e dell'altro... se leggi qui trovi alcune delle differenze:
Perfavore, Entra oppure Registrati per vedere i Link!
 
Nell'uso "normale" si... poi alcune differenze nell'uso di uno e dell'altro... se leggi qui trovi alcune delle differenze:
Perfavore, Entra oppure Registrati per vedere i Link!

Va benissimo

Grazie mille =)

Risolto!

- - - Aggiornato - - -
@ptm

Ultima cosetta, scusami.

Avendo scritto questi codici:

1.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


2.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


3.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Vedo che in tutti e 3 i casi, il valore al quale il puntatore AP sta puntando cambia.

Il che mi è strano.

il valore al quale AP punta... non doveva cambiare definitivamente SE E SOLO SE il puntatore in questione era passato per indirizzo/riferimento (terzo caso).

Io vedo che invece ciò è successo in tutti e 3 i casi...
 
Ultima modifica: