Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [c++] puntatori

  1. #1

    [c++] puntatori

    ciao raga, sono ancora qui a rompervi le scatole

    c'è qualche anima pia che mi può spiegare cosa sono questi dannati PUNTATORI? la loro utilità (che nn comprendo ) e come si usano?

    vi ringrazio!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Un puntatore è una variabile che contiene un indirizzo di memoria. Sono estremamente utili (direi indispensabili) ogni qual volta che hai bisogno di accedere a particolari strutture, senza preoccuparti di dover creare sufficienti variabili per loro. Supponiamo, infatti, che tu non sappia a priori di quante variabili hai bisogno...

    Vediamo di fare un esempio pratico: immagino che tu abbia lavorato, qualche volta, con gli array. Il classico programmino per ordinare un array l'avrai già fatto. Qual è il limite che hai incontrato finora? Senza dubbio il fatto di avere un array di dimensioni limitate ad un certo massimo di elementi. Questo limite si traduce, a volte, come qualcosa di restrittivo (se devo aver a che fare con un array più grande come faccio? riscrivo il programma e lo ricompilo); ma a volte si traduce solo in uno spreco di memoria (dichiari un array di dimensione 100 come massimo, quando l'utente ha bisogno di ordinare solo 10 elementi...).
    Come si ovvia a questi (nota: grossi) problemi? I puntatori arrivano in soccorso: dichiari una variabile come puntatore a valori interi e chiedi all'utente di quanti elementi ha bisogno. Quindi crei la struttura adatta a contenerli (allochi abbastanza memoria) e li vai a indirizzare (ossia li raggiungi) tramite il puntatore.

    Questo è un banalissimo esempio, ma la loro importanza la capirai quando dovrai far tornare dei valori a delle funzioni, oppure rendere permanenti dei cambiamenti a variabili, effettuati all'interno di procedure (quando inizierai a vedere gli oggetti, poi...)

    Vediamo l'esempio di prima: come creare un array dinamico...
    codice:
    #include <iostream>
    using namespace std;
    
    int main() {
       int *mioArray;  /* Questo è un puntatore ad intero: sarà l'array */
       int *copia;     /* Questo mi serve solo per tenere traccia del primo elemento */
       int lunghezza;  /* conterrà la lunghezza dell'array che chiedo all'utente */
       int i;
    
       cout << "Introduci la lunghezza dell'array: ";
       cin >> lunghezza;
    
       /* Ora creiamo lo spazio in memoria per l'array */
       mioArray = (int*) malloc( lunghezza * sizeof(int) );
       copia = mioArray;
    
       /* riempiamo l'array con dei valori numerici */
       for(i=0; i<lunghezza; i++) {
          *mioArray = i;  /* In questo modo accedo all'elemento attualmente puntato dal puntatore */
          mioArray++;  /* incremento il puntatore: andrà a puntare alla locazione successiva */
       }
    
       /* Stampiamo l'array */
       for (i=0; i<lunghezza; i++) {
          cout << "Elemento di indice " << i << ":  " << *copia;
          copia++;
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Originariamente inviato da LeleFT
    ...immagino che tu abbia lavorato, qualche volta, con gli array. Il classico programmino per ordinare un array l'avrai già fatto...
    il classico programmino x ordinare gli array.. oddio, ci ho sbattuto la testa x giorni, e alla fine sono venuto qui a chiedere aiuto XD

    cmq grazie mille x l'eccelente spiegazione.

    cmq nn mi è chiara una cosa, se chiedo all'utente il numero di elementi che questo vuole inserire nell'array, invece di fare tutta quella procedura:
    (int*) malloc( lunghezza * sizeof(int) ) (tra l'altro a me sconosciuta)
    nn facci prima a dichiarare il vettore con:
    int mioVettore[lunghezza] ??

    cmq mi potresti/e spiegare un po' meglio questo frammento di codice:
    (int*) malloc( lunghezza * sizeof(int) );

    grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Non puoi utilizzare la classica definizione dell'array
    codice:
    int mioArray[lunghezza];
    in quanto il compilatore vuole che la dimensione ddegli array sia una costante. Gli array, quindi, non si possono dimensionare a run-time.
    Un modo per procedere, quindi, è quello che ti ho illustrato prima:
    codice:
    mioArray = (int*) malloc(lunghezza * sizeof(int));
    Ora ti delucido sul significato oscuro di questa bruttissima riga di codice: mioArray è un puntatore, quindi al suo interno conterrà un indirizzo di memoria e, precisamente, l'indirizzo del primo elemento dell'array che verrà allocato.
    la funzione malloc serve, appunto, ad allocare una certa quantità di memoria (serve a dire, insomma, di riservare una certa quantità di memoria che intenderai usare). Quanta memoria dovremo allocare, quindi? A questa domanda bisogna rispondere con un "non lo so"... in effetti la quantità da allocare dipende da (almeno) un fattore: la dimensione in memoria del dato. In questo caso, dato che si tratta di interi, ci dobbiamo chiedere quanto occupa un intero in memoria (su architetture diverse, infatti, un intero può occupare da 16 a 64 byte). La funzione sizeof() fa proprio questo: ritorna il numero di byte minimo atto a contenere il dato (o il tipo di dato) passato come parametro. A noi, però, non va bene allocare la quantità di memoria necessaria a contenere un solo intero, ma dobbiamo allocarne a sufficienza per contenerne una quantità pari a lunghezza. Per questo moltiplichiamo la dimensione dell'intero per il numero di interi di cui abbiamo bisogno.

    Il cast a puntatore ad intero è necessario in quanto la funzione malloc ritorna il primo indirizzo di memoria utile allocato, ma solo noi sappiamo a che tipo di puntatore va assegnato (ci sono molte implicazioni sull'aritmetica dei puntatori a riguardo). La funzione malloc, di suo, ritorna un puntatore a void [ void * ], che va castato al giusto tipo di puntatore.

    Spero di essere riuscito a darti delle utili informazioni.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    certo tutto chiaro!
    ti ringrazio moltissimo, mi sei stato di grande aiuto
    dal codice di esempio e dalla tua ultima spiegazione ho appreso moltissimo, cose che prima erano davvero oscure x me e forse ora inizierò ad usarle

    ciao e grazie ancora!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.