"Lo scopo dei puntatori è quello di consentire all'utente di accedere direttamente a un blocco di memoria."
Questo non è sempre vero. Considerare
*(int*)(0x1234) = some_value;
questo è l'accesso alla memoria "diretto". Anche se
int a = some_value, *ptr = &a;
*ptr = some_other_value;
ora si sta accedendo a
indirettamente.
non riesco ad utilizzare la variabile 'var' per accedere al blocco di memoria in cui è memorizzato il valore 5 , dato che posso cambiare il valore della variabile ogni volta che voglio var = 6; ?
Sicuramente; ma la semantica è diversa.
Ho davvero bisogno di un puntatore quando posso accedere a qualsiasi valore di una variabile semplicemente utilizzando la sua variabile, invece di utilizzare un puntatore che punta all'indirizzo in cui è memorizzato il valore?
No, non è così. Considera il primo esempio: all'interno dello scope in cui è stato dichiarato a
, la modifica del suo valore tramite ptr
è piuttosto inutile! Tuttavia, cosa succede se non si è nell'ambito di a
? Questo è
void foo(int x)
{
x = 5;
}
int main(void)
{
int x = 10;
foo(x);
}
In foo
, quando lo fai x = 5
, c'è un'ambiguità: vuoi modificare o foo::x
main::x
? In quest'ultimo caso, è necessario "esplicitamente" richiesto e il fatto che ciò avvenga tramite i puntatori - o meglio, tramite indiretta - è una coincidenza e una scelta di lingua. Altre lingue hanno altri.
L'importante nozione è quella di [puntatore aliasing] (https://en.wikipedia.org/wiki/Pointer_aliasing) –
Correlati: http: // stackoverflow.com/q/27484168/694576 – alk
"Lo scopo dei puntatori è quello di consentire all'utente di accedere direttamente a un blocco di memoria." è un po 'una strana affermazione; Direi che l'uso principale per i puntatori per situazioni in cui non si ha il nome della variabile disponibile (ad esempio l'implementazione del riferimento pass-by o l'accesso a oggetti allocati dinamicamente o l'accesso al membro di un array con l'indice mutevole) –