Puntatori e vettori, due piccoli dubbi

di il
3 risposte

Puntatori e vettori, due piccoli dubbi

- Nel passaggio di vettori a funzioni bisogna sempre specificare la dimensione del vettore? Ad.esempio, prototipo/chiamata di Func:

int Func ( int vett [], int size );
...
int a [9];
...
Func ( a, 9 );


- Per inizializzare un puntatore, 'è preferibile utilizzare NULL a 0. Ciò perché uno 0 che sia stato assegnato a un puntatore sarà prima convertito in puntatore di tipo appropriato.' Che vuol dire?


Grazie mille a tutti

3 Risposte

  • Re: Puntatori e vettori, due piccoli dubbi

    Gianluca20395 ha scritto:


    - Nel passaggio di vettori a funzioni bisogna sempre specificare la dimensione del vettore? Ad.esempio, prototipo/chiamata di Func:

    int Func ( int vett [], int size );
    ...
    int a [9];
    ...
    Func ( a, 9 );


    - Per inizializzare un puntatore, 'è preferibile utilizzare NULL a 0. Ciò perché uno 0 che sia stato assegnato a un puntatore sarà prima convertito in puntatore di tipo appropriato.' Che vuol dire?


    Grazie mille a tutti
    ti rispondo in ordine..
    1) Allora, ora non sono al pc e non ho possibilità di provare comunque, se la memoria non mi inganna hai fatto un errore.

    Quando crei una funzione devi mettere la dimensione:
    esempio, questa funzione ti fa la somma di tutti gli elementi del vettore

    Int Somma(int mat [5]){... }

    Adesso, fai conto di avere il Vettore completo e sei nel main.. allora dovrai fare semplicemente:
    Main (){
    int vet[5];
    ...
    int sommaVett= Somma (vet);
    ..}
    In questa maniera la variabile sommaVett avrà la somma degli elementi del vetttore.
    quindi la dimensione la devi definire quando crei la funzione.

    2) per la seconda domanda non posso esserti di aiuto. Non me lo ricordo

    Buona giornata
  • Re: Puntatori e vettori, due piccoli dubbi

    La cosa e' piu' complicata del previsto e di quanto detto precedentemente.

    In C/C++ i parametri vengono passati per valore.

    In C++ c'e' un'opportuna sintassi per indicare che si vuole passare un parametro per reference (cioe' mediante un puntatore).

    Questo implica che se specifichi la dimensione del vettore nella definizione (ad esempio "int v[10]" ) di una funzione, quando passi il parametro, il vettore viene copiato nello stack.

    Ora, se il vettore ha 10 elementi, non ci sono problemi, ma se ne ha 1.000.000 (un milione) hai due effetti collaterali:

    1) aumento enorme del tempo di chiamata della funzione (perche' deve ogni volta copiare un milione di elementi, cioe' 4 o 8 milioni di byte)
    2) rischi uno "stack overflow", cioe' l'applicazione si schianta perche' non ha spazio nell stack per i parametri da passare alla funzione.

    Questo e' il motivo per cui si preferisce passare i vettori per puntatore, e questo implica scrivere

    int v[]

    oppure

    int *v

    come parametro.

    In questo caso, il valore e' un puntatore, cioe' un oggetto di 4 (32bit) o 8 byte (64bit)!
  • Re: Puntatori e vettori, due piccoli dubbi

    Migliorabile, ma il nome di un vettore è un puntatore al suo primo elemento, quindi non viene sempre passato per riferimento? E le due definizioni:

    int Func ( int vett [5] );

    int Func( int vett [ ], int size );

    Forse nella prima def. Il vettore è passato per valore, mentre nella seconda per riferimento?
Devi accedere o registrarti per scrivere nel forum
3 risposte