|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C] difficoltà coi puntatori
Salve ragazzi, vi confesso che mi sento davvero tanto scemo ma, non riesco a capire l'utilità dei puntatori in C.
Cioè, mi chiedevo, che utilità hanno, nel senso che avere una variabile che punta all'indirizzo di un'altra variabile, non riesco a darle un senso. Dato che, per imparare il linguaggio C i puntatori sono una condizione sine qua non, prima di darmi all'ippica, qualcuno di voi dotato di un pò di pazienza, cercherebbe di far capire ad un testone come me a cosa servono? Thx. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
io penso che chiunque all'inizio abbia pensato almeno una volta all'inutilità dei puntatori se visti con la definizione che ne hai dato tu. per il momento prendi un puntatore come un modo per realizzare le stringhe in c, oppure per allocare dinamicamente memoria (cioè ridimensionare un array, dare una dimensione a runtime ecc..). quando comincerai ad impratichieri ti sorprenderai della grandissima varietà di utilizzi che potrai farne.
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2003
Città: addio fabriANO... mò sto a Roma ahò!!
Messaggi: 579
|
già: a che potrebbe servire sapere l'indirizzo di una variabile?
![]() Prova a pensare per esempio al passaggio dei parametri nelle funzioni: void aaa (int x, int *y){ x = 5; *y = 5; } il parametro "x" viene passato per VALORE, mentre il parametro "y" per RIFERIMENTO. Che vuol dire ciò? Per valore - Che quando la funzione sarà chiamata, le verrà passata UNA COPIA del parametro x; nella funzione puoi assegnare qualsiasi valore ad x, ma modificherai solo la copia, quindi quando la funzione terminerà ti ritroverai esattamente come prima ![]() Per riferimento - alla funzione verrà passato L'INDIRIZZO della variabile, quindi un PUNTATORE ad essa. ![]() Per questo quando serve che una funzione possa modificare un parametro si usano i puntatori. Un altro utilizzo sta nella creazione di strutture dinamiche (array, liste, alberi... ). Prendiamo il caso più semplice: la creazione di un array dinamico. Come saprai, se noi dichiariamo un array , per esempio, in questo modo int vet[10]; nella sezione di memoria del nostro programma dedicata ai dati verrà fatto spazio per 10 variabili int contigue, e "vet" verrà fatto puntare alla prima. Ora, quest'array è STATICO, perché una volta dichiarato da 10, niente e nessuno potrà ridimensionarlo ![]() Qui ci viene in aiuto una funzione di nome malloc() . La malloc , dato come parametro un numero di byte, alloca per noi uno spazio di memoria di quella dimensione nella parte di memoria centrale inutilizzata dal sistema operativo e dagli altri programmi (che si chiama HEAP). Dopo averlo fatto restituisce un puntatore a quell'area di memoria appena creata, che noi possiamo usare a piacimento. Nel caso di un array dinamico, di 20 elementi per esempio, la procedura da seguire sarà: Codice PHP:
![]() ciao!
__________________
Tavshan Pasha Bazar: Oggetti etnici per il relax! |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Grazie mille ad entrambi
![]() Devo sbatterci un bel pò la capoccia comunque perchè non mi sono ancora chiari ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Aug 2003
Città: addio fabriANO... mò sto a Roma ahò!!
Messaggi: 579
|
Quote:
![]() ![]() ![]() ![]() ora mi ammazzo. addio. PAF ![]() però dai, l'hai letto in 2 minuti.. prova a concentrarti un po' e vedrai che sarà chiaro ^_^ ciao!
__________________
Tavshan Pasha Bazar: Oggetti etnici per il relax! Ultima modifica di Argosoft : 16-01-2005 alle 17:14. |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Anche se un professore è bravo, un alunno può sempre essere deficiente ![]() (nel senso che deficie nell'apprendimento ![]() ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#9 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Re: [C] difficoltà coi puntatori
Quote:
Inoltre, se puoi ottenere l'indirizzo di una variabile ed elaborarlo, allora molte altre operazioni (tra tutte, ottenere un indirizzo un certo numero di locazioni dopo una variabile data) diventano molto più semplici. Non va dimenticato il fatto che, con ottima probabilità, una variabile di un tipo strutturato occupa più spazio di una variabile puntatore allo stesso tipo. Altro non mi viene in mente, per ora...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2002
Città: VR-PD
Messaggi: 11655
|
Utilizzi tipici dei puntatori :
- passaggio per riferimento . Esempi di questo tipo ne trovi parecchi in questo thread , non insisterò oltre sulla sua importanza basti sapere che qualsiasi linguaggio di programmazione prevede questo tipo di uso dei puntatori , talvolta sarà mascherato in modo da non mostrare esplicitamente il passaggio del puntatore ( come ad es. in VB o in Java ) , ma sotto sotto funziona sempre in questo modo . - utilizzo dinamico della memoria . Anche questa funzionalità é già stata accennata , tramite l' utilizzo dei puntatori é possibile allocare la memoria secondo le necessità senza imporre dimensioni predefinite . - utilizzo di dati astratti . Questa é un uso dei puntatori molto interessante , anche se raro , si riferisce alla creazione di tipi di dato che riferiscono ad altri dati . Le forme più comuni con cui si presentano sono le liste concatenate e gli alberi , ma esistono anche casi più complessi . Per esempio se volessimo fare una struttura di dati per una persona cominceremo a creare i campi relativi al nome , alla data di nascita , altezza etc. , poi quando arriviamo a dover inserire i dati relativi ai genitori , al coniuge o ai figli cosa facciamo ? Se inserissimo un' altra struttura sarebbe uno spreco di spazio , oltretutto sarebbe anche poco pratico , se cercassimo il fratello del nonno della moglie di una persona come possiamo fare ? La soluzione più semplice é che i dati relativi alla parentela siano dei puntatori a strutture analoghe , ogni persona ha la sua e in ogni struttura sono definiti i puntatori che ti dicono dove trovare i dati relativi . L' utilizzo dei puntatori é tuttavia fonte inesauribile di errori terrificanti per cui spesso nei linguaggi "evoluti" si cerca di limitare la possibilità di utilizzo di questi strumenti , e spesso si ricorre a sistemi estremi per nascondere in ogni maniera la loro esistenza .
__________________
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:25.