Esercizio puntatori linguaggio c
Ciao a tutti 
Ho fatto un esercizio sui puntatori, ma non avendo la soluzione non so se il mio ragionamento sia corretto o meno...Potreste darmi una vostra opinione?
Quali sono i valori di *q, *v e p al termine di questa sequenza di operazioni?
int *q,*v,p;
p=5;
*v=45;
q=&p;
*q++;
*v=p+4;
p=*v-2;
v=&p;
io ho risolto così:
p assume valore 5;
la variabile a cui punta v assume valore 45;
q punta a p;
la variabile a cui punta q (cioè p) è incrementata di 1);
la variabile a cui punta v assume il valore p+4 (cioè 10);
p assume il valore cui punta v,-2 (cioè 8);
v punta a p;
Dunque i risultati che ottengo sono p=8; *v=8; *q=8;

Ho fatto un esercizio sui puntatori, ma non avendo la soluzione non so se il mio ragionamento sia corretto o meno...Potreste darmi una vostra opinione?
Quali sono i valori di *q, *v e p al termine di questa sequenza di operazioni?
int *q,*v,p;
p=5;
*v=45;
q=&p;
*q++;
*v=p+4;
p=*v-2;
v=&p;
io ho risolto così:
p assume valore 5;
la variabile a cui punta v assume valore 45;
q punta a p;
la variabile a cui punta q (cioè p) è incrementata di 1);
la variabile a cui punta v assume il valore p+4 (cioè 10);
p assume il valore cui punta v,-2 (cioè 8);
v punta a p;
Dunque i risultati che ottengo sono p=8; *v=8; *q=8;
Risposte
Se il codice fosse solo quello si avrebbe un probabile crash alla terza riga per un puntatore non inizializzato. Per comodità suppongo quindi che v punti a qualcosa di sensato prima della terza riga (e che ci siano quindi righe di codice non presenti).
{ p = 5, *v = 45, *q = 5}
Qui hai sbagliato e credo che anche il tuo professore non abbia capito che cosa succede. ++ ha precedenza su * come puoi vedere qui e quindi quella riga è equivalente a
Il risultato è che q non punta più a p, ma alla locazione di memoria successiva il cui valore è sconosciuto!!!
{p = 5, *v = 45, *q = ???}
{p = 7, *v = 9, *q = ???}
{p = 7, *v = 7, *q = ???}
Per verificare che la mia analisi fosse corretta ho scritto il seguente codice:
Eseguendolo mi restituisce.
Suppongo che l'esercizio dovesse restituire quello che ha scritto tu e che quindi il tuo professore si sia sbagliato.
p = 5; *v = 45; q = &p;
{ p = 5, *v = 45, *q = 5}
*q++;
Qui hai sbagliato e credo che anche il tuo professore non abbia capito che cosa succede. ++ ha precedenza su * come puoi vedere qui e quindi quella riga è equivalente a
*(q++);
Il risultato è che q non punta più a p, ma alla locazione di memoria successiva il cui valore è sconosciuto!!!
{p = 5, *v = 45, *q = ???}
*v=p+4; p=*v-2;
{p = 7, *v = 9, *q = ???}
v = &p;
{p = 7, *v = 7, *q = ???}
Per verificare che la mia analisi fosse corretta ho scritto il seguente codice:
#include <iostream> int main() { int *q,*v,p; int i; v = &i; p=5; *v=45; q=&p; std::cout << "q = " << q << std::endl; *q++; std::cout << "q = " << q << std::endl; *v=p+4; p=*v-2; v=&p; std::cout << "*q = " << *q << "\n*v = " << *v << "\np = " << p << std::endl; }
Eseguendolo mi restituisce.
q = 0x28ff04 q = 0x28ff08 *q = 2686728 *v = 7 p = 7
Suppongo che l'esercizio dovesse restituire quello che ha scritto tu e che quindi il tuo professore si sia sbagliato.