Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    C++ Passaggio array per referenza

    Ragazzi sto cercando di capire cosa non va in questo semplice programmino.
    dove sbaglio?

    #include <iostream>
    #include <conio.h>
    using namespace std;

    void A(int&[4]);


    int main() {
    int a[4] = {1,2,3,4};
    int z=0;
    A(a);
    for(z=0;z<4;z++) {
    cout << a[z];
    }
    getch();
    return 0;

    }
    void A(int& AR[4])
    {
    int i;
    for(i=0;i<4;i++) {
    AR[i]=5;
    }
    }

  2. #2
    Devi passare l'indirizzo del primo elemento dell'array. Se "a" è il tuo array, va passato come argomento "a" o "&a[0]" (solitamente si usa la prima). Tutti e due i modi indicano il primo elemento dell'array:

    Codice PHP:
    #include <iostream>
    #include <conio.h>
    using namespace std;

    void A(int*);

    int main() {
        
    int a[4] = {1,2,3,4};
        
    int z=0;
        
    A(a); //oppure A(&a[0])
        
    for(z=0;z<4;z++) {
            
    cout << a[z];
        }
        
    getch();
        return 
    0;

    }

    void A(intAR)
    {
        
    int i;
        for(
    i=0;i<4;i++) {
            
    AR[i]=5;
        }


  3. #3
    ok, quindi non c'è un modo per passare semplicemente per referenza del tipo

    void funz(int& ) //prototipo

    main() {
    ....
    funz(a);
    ....
    }
    void funz(int& b) {
    ...
    }

    ???? grazie

  4. #4
    Puoi effettuare il passaggio per referenza indicando l'indirizzo dell'argomento tramite l'operatore &.
    In C++ comunque, quando parli di array, parli di puntatori.
    Pensa ad un array come ad una serie di celle e ad un puntatore come ad una freccia che punta ad una determinata cella (quando inizializzi l'array, alla prima).
    Puoi utilizzare l'aritmetica per far spostare il puntatore (ad esempio, puntatore = puntatore+1 significa che lo sposti una cella in avanti) e l'operatore * per accedere al valore della cella (oppure unire il tutto con l'operatore []).

    Guarda questo esempio:

    Codice PHP:
    #include <iostream>

    using namespace std;

    void f(intx)
    {    
        
    x++;
    }

    void g(intx)
    {
        (*
    x)++;
    }


    void h (int x)
    {
        
    x++;
    }

    void s(intptrint size)
    {
        for(
    int i 0sizei++)
        {
            
    cout << *ptr << " | ";
            
    ptr+=1;
        }
        
    cout << endl;
    }

    void t(intptrint size)
    {
        for(
    int i 0sizei++)
        {
            
    cout << ptr[i] << " | ";
        }    
        
    cout << endl;
    }

    int main()
    {
        
    int i 10;
        
    cout << "i (indirizzo " << &<< ") = " << << endl;
        
    f(i);
        
    cout << "i (indirizzo " << &<< ") = " << << endl;
        
    h(i);
        
    cout << "i (indirizzo " << &<< ") = " << << endl;
        
    intptr = &i;    
        
    g(ptr);
        
    cout << "Accedo ad i (indirizzo " << ptr << ") tramite puntatore: i = " << << endl;
        
    cout << endl;
        
        
    int j[3] = {012};
        
    s(j3);
        
    t(j3);

    Quando chiamo f, gli passo l'indirizzo della variabile, quindi le modifiche al suo interno vengono applicate alla variabile nel main.
    In g passo un puntatore alla variabile. Nota che uso l'operatore * per accedere al valore della variabile, e poi uso l'incremento ++. Cioè gli dico di incrementare il valore della variabile puntata dal puntatore.
    In h avviene un passaggio per valore, nessuna modifica avviene.

    s e t operano sull'array.
    Sia a s che a t passo un puntatore al primo elemento dell'array.
    Nel primo caso puoi vedere come posso stamparlo ciclando, utilizzando l'operatore di deferenziazione (*) e dicendo di spostarsi in avanti di una cella (ptr+=1).
    In t uso un indice unito all'operatore []. Sortisco lo stesso effetto ma in due maniere diverse.
    La sostanziale differenza è che in s modifico il puntatore, che quindi all'inizio si trova all'inizio dell'array e alla fine del ciclo si trova una cella oltre la fine dell'array.
    In t l'indirizzo a cui si riferisce ptr rimane immutato.

    La gestione della memoria è uno degli aspetti più ostici all'inizio, cerca di reperire altro materiale e guardartelo bene.


  5. #5
    ok grazie mille per la spiegazione.
    Pero la mia domanda era un altra.
    Nell'esempio che ho postato

    #include <iostream>
    #include <conio.h>
    using namespace std;

    void A(int&[4]);


    int main() {
    int a[4] = {1,2,3,4};
    int z=0;
    A(a);
    for(z=0;z<4;z++) {
    cout << a[z];
    }
    getch();
    return 0;

    }
    void A(int& AR[4])
    {
    int i;
    for(i=0;i<4;i++) {
    AR[i]=5;
    }
    }

    Cosa c'è di sbagliato? Non è possibile farlo in questo modo?

  6. #6
    In realtà ho risposto alla tua domanda
    Un'array non è un tipo di dato (prova a vederla così), è un'astrazione che costruisci a partire da qualcos'altro.
    Quando devi usare una funzione che deve lavorare su un array, passi come argomento qualcos'altro in realtà, non l'array. Passi un puntatore.
    Per questo int& AR[4] non ha alcun senso. Tu vorresti passare per riferimento una struttura dati (un array di 4 elementi) che non esiste. Devi passare un puntatore, ricordandoti, come ti ho detto prima che un array è un puntatore:

    questo ha senso:

    Codice PHP:
    void A(intAR){...} 
    questo ha senso (un vector è una struttura dati):

    Codice PHP:
    void A(vector<int>& vi){}

    int main(){
        
    vector<intvi;
        
    A(vi);

    e questo (non badare troppo alla classe, nota solo l'introduzione di una nuova struttura dati):

    Codice PHP:
    #include <iostream>
    #include <vector>

    using namespace std;

    class Array
    {

    public:
        Array(
    int size) : size(size){ ptr = new int[size];}
        ~Array(){ 
    delete [] ptr; }
        
    intoperator[](int index) const { return ptr[index];}
        
    intoperator[](int index){ return ptr[index]; }
        
    int getSize(){return size;}
    private:
        
    intptr;
        
    int size;
    };

    void f(Array& a)
    {
        for(
    int i 0a.getSize(); i++)
            
    a[i] = i;
    }

    int main() {
        Array 
    a(10);
        
    f(a);
        for(
    int i 0a.getSize(); i++) 
            
    cout << a[i] << endl;
        

    edit: se sintatticamente ti piace di più, puoi usare

    Codice PHP:
    #include <iostream>
    #include <vector>

    using namespace std;

    void f(int a[]){
        for(
    int i 03i++)
            
    //cout << a[i] << endl; // ok
            
    cout << (*a)++ << endl// è un puntatore
    }

    int main() {
        
    int a[3] = {0,1,2};
        
    f(a);

    nella funzione, come parametro, indichi il tipo, il nome seguito da []. Denoti così un array (in sostanza rimane un puntantore però, come puoi notare dagli operatori * e ++).

  7. #7
    ti ringrazio sei molto gentile.
    Se ho qualche altro problema posso contattarti a qualche indirizzo?

  8. #8
    Figurati, è stato un piacere.
    Sono spesso qui sul forum, se hai bisogno contattami pure


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.