Discussione:Aritmetica dei puntatori

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Spiego qua un rollback che ho fatto all'incipit, da

«Nei linguaggi di programmazione, l'espressione aritmetica dei puntatori si riferisce a un insieme di operazioni di tipo aritmetico applicabili sulle variabili di tipo puntatore; tali operazioni sono pensate per consentire l'accesso a locazioni di memoria. E' importante che l'accesso avvenga ad aree opportunamente riservate da un applicativo e non in maniera casuale per non causare crash del sistema.»

a

«Nei linguaggi di programmazione, l'espressione aritmetica dei puntatori si riferisce a un insieme di operazioni di tipo aritmetico applicabili sui valori di tipo puntatore; tali operazioni sono pensate soprattutto per l'accesso ad array. L'aritmetica dei puntatori è tipica del linguaggio C e dei suoi derivati.»

Nell'incipit modificato la frase nuova ha a che vedere con i puntatori in generale e non con l'aritmetica dei puntatori, e quindi a mio parere va un po' offtopic; "tali operazioni sono pensate per consentire l'accesso alla memoria", per esempio, non mi piace molto perché tutte le operazioni sui puntatori hanno questo scopo, anche quelle che non appartengono all'"aritmetica dei puntatori" (p.es. la stessa derefenziazione).

Penso che le modifiche avessero lo scopo di spiegare meglio cosa sia un puntatore, ma io lo considererei un prerequisito necessario per leggere questa voce. Comunque provo ad aggiungere un "torna a"; che ne dite? Moongateclimber 13:58, 13 feb 2007 (CET)[rispondi]


Non condivido molto il rollback in quanto espresso così sembre che l'aritmetica dei puntatori sia specifica degli array, viceversa i puntatori e l'aritmetica di questi sono avulsi dal concetto di array. E' pur vero che gli array in C sono dei particolari puntatori con memoria preallocata tuttavia la cosa mi sembra riduttiva --LuckyLarry 14:20, 27 feb 2007 (CET)[rispondi]

La parte che consideravo sviante era la seguente: sono pensate per consentire l'accesso a locazioni di memoria. Una frase del genere potrebbe infatti andare bene per spiegare il concetto di puntatore in generale, non riguarda in modo particolare l'aritmetica. Analogamente E' importante che l'accesso avvenga ad aree opportunamente riservate da un applicativo e non in maniera casuale per non causare crash del sistema vale per qualunque cosa si faccia con i puntatori, non solo per l'aritmetica.
Inoltre, l'aritmetica dei puntatori non mi sembra tanto avulsa dal concetto di array (anzi, per niente). Detto in termini semplici: le operazioni aritmetiche sui puntatori hanno senso (ovvero portano a un risultato definito e prevedibile) solo se applicate su array (tieni presente che K&R e lo standard ANSI chiamano "array" non solo quelli dichiarati, "preallocati" come dici tu, ma anche quelli creati dinamicamente). Se vogliamo andare sul tecnico: l'operatore "[]" in C (indicizzazione di un array) è definito in termini di aritmetica dei puntatori:
a[i] == *(a+i)
quindi tecnicamente non puoi usare un array senza usare l'aritmetica dei puntatori. Non credo che sia un caso :-)
Moongateclimber 14:32, 27 feb 2007 (CET)[rispondi]
Giusto per fare accademia quelli che sono indicati tra parentesi negli array sono come dici tu indici, non sono puntatori (anche se è ovvio che non si può prescindere dal concetto di puntatore in C)
Ammetto di non aver mai letto K&R ma di aver capito i puntatori spaccandomici il cranio, quindi sono un po' carente sulla teoria, ma la potenza dei puntatori e della aritmetica sui puntatori la vedo sulle strutture allocate dinamicamente. magari sarebbe il caso di evidenziare il concetto di array come area di memoria puntata e tipo array.

--LuckyLarry 14:55, 27 feb 2007 (CET)[rispondi]

Non mi sono spiegato. Quello che sto dicendo è che in C, diversamente da altri linguaggi, l'indicizzazione di un array (sintassi [i]) viene considerata semplicemente un altro modo (sintattico) di esprimere un'operazione aritmetica sui puntatori. a[i] vuol dire l'oggetto puntato dal puntatore a dopo che a tale puntatore è stato sommato i, ovvero *(a+i).
Che questo sia vero lo dimostra per esempio il fatto (provare per credere) che dato un array
int v[20];
per accedere alla terza posizione puoi fare
v[2]
ma anche
2[v] (provare per credere!!!!)
Infatti quest'ultima espressione diventa
*(i+v)
che per il compilatore non è diversa da
*(v+i) ovvero v[i]
Inoltre, ribadisco: le strutture allocate dinamicamente a cui ti riferisci sono array a tutti gli effetti, quindi non stiamo dicendo due cose diverse. (Ovviamente non tutte le strutture dinamiche sono array, le liste per esempio non lo sono, ma infatti sulle liste l'aritmetica dei puntatori non la puoi usare). Comunque: penso che entrambi conveniamo che la voce adesso è uno stub, e la frase iniziale riflette questo fatto. Forse una soluzione al dubbio di cui stiamo discutendo è trasformarla in una voce completa, chiarendo tutti gli aspetti. :-) Moongateclimber 15:10, 27 feb 2007 (CET)[rispondi]


v[2]
ma anche
2[v] (provare per credere!!!!)
Infatti quest'ultima espressione diventa
*(i+v)
che per il compilatore non è diversa da
*(v+i) ovvero v[i]
Non ho bisogno di provare..... l'ho usato un migliaio di volte.... ma a quanto pare sono infelice nell'esprimermi.... Ignoravo la definizione di array per strutture non preallocate tutto qui. Approfondire l'argomento per altro temo lo porterebbe ad essere un duplicato della voce puntatore.

--LuckyLarry 16:18, 27 feb 2007 (CET)[rispondi]

un altro piccolo dubbio è vero che non puoi usare la matematica sulle liste, ma la si può usare sugli stack e sulle code... anche se è un' operazione "sporca"