Esercizio puntatori linguaggio c

Sassy3
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;

Risposte
apatriarca
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 = &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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.