Matrici e puntatori

di il
12 risposte

Matrici e puntatori

So che il nome di una matrice corrisponde all'indirizzo del primo elemento per cui se definisco la matrice 10x5
int m[10][5];
int* p;
p=m;
perchè il compilatore mi da errore?


Stessa cosa se ho:
int* q;
q= new int[10][5];
ottengo sempre un errore ma non ho chiaro perchè.

12 Risposte

  • Re: Matrici e puntatori

    No ... guarda qui
    
    	int m[10][5];
    	int *p;
    	p = &m[0][0];
    
    	int (*pp)[5];
    	pp = m;
    	int *ppp;
    	ppp = *pp;
    
  • Re: Matrici e puntatori

    Approfitto della disponibilità.
    Se devo allocare in memoria dinamica una matrice[10][5] i cui elementi sono interi, l'unico modo è questo?
    int** p;
    p= new int*[10];
    for (int i=0; i<10; i++)
       p[i]= new int[5];
  • Re: Matrici e puntatori

    Così scrivi delle costanti nel codice e non va bene ... semmai usa variabili rows e cols
    
    int **p;
    p = new int*[rows];
    for(i=0;i<rows;i++)	
       p[i] = new int[cols];
    
  • Re: Matrici e puntatori

    Certo era per fare un esempio per capire se il codice è corretto e se esiste solo questa via per allocare matrici in memoria dinamica
  • Re: Matrici e puntatori

    oregon ha scritto:


    Così scrivi delle costanti nel codice e non va bene ... semmai usa variabili rows e cols
    
    int **p;
    p = new int*[rows];
    for(i=0;i<rows;i++)	
       p[i] = new int[cols];
    

    ma l'accesso all'elemento dell'array avviene con *p((indice_riga*numero_colonne)+indice_colonna+1) oppure è possibile riferirsi all'oggetto con p[indiceriga][indicacolonna] ?
    non mi è chiaro.
  • Re: Matrici e puntatori

    oregon ha scritto:


    No ... guarda qui
    
    	int m[10][5];
    	int *p;
    	p = &m[0][0];
    
    	int (*pp)[5];
    	pp = m;
    	int *ppp;
    	ppp = *pp;
    

    Alla fine ho adottato questo codice per allocare dinamicamente una matrice:
    int** p;
    p= new int*[10];
    for (int i=0; i<10; i++)
       p[i]= new int[5];
    ma ho scoperto anche questo metodo:
    
        int* mat;
        mat = new int[10 * 5];
        for (int i=0;i<10*5; i++)
            mat[i] = 1;
    
    Cosa ne pensate?
    Da un lato utilizzi un puntatore int* e dall'altro int**.
  • Re: Matrici e puntatori

    Ti ripeto usa variabili e bon 10 altrimenti c'è poco di dinamico.

    Nel secondo caso allochi un vettore con lo spazio per gli elementi della matrice. Avrai problemi ad accedere per riga e colonna. È preferibile il metodo con il doppio puntatore
  • Re: Matrici e puntatori

    oregon ha scritto:


    Ti ripeto usa variabili e bon 10 altrimenti c'è poco di dinamico.
    Non ho inserito intenzionalmente variabili ma costanti giusto per semplificare con un esempio, non è codice di alcun programma.
    Nel secondo caso allochi un vettore con lo spazio per gli elementi della matrice. Avrai problemi ad accedere per riga e colonna. È preferibile il metodo con il doppio puntatore
    Mi hai preceduto era proprio la domanda successiva, cioè se non capisco male, nel secondo caso posso riferirmi ai singoli elementi della matrice mediante un'espressione espressione numerica tra parentesi quadre (che in sostanza si riferiscono ad un vettore) e quindi mi precluderei la possibilità di utilizzare il doppio indice. Corretto?

    Premesso che il codice è stato compilato e non mi ha dato alcun errore, e che non ho intenzionalmente inserito variabili per rendere le cose più semplici, nel caso debba deallocare la matrice è corretto seguire questo iter?
    int** p;
    p= new int*[10];
    for (int i=0; i<10; i++)
       p[i]= new int[5];
    
    for (int i=0; i<10; i++)
       delete[] p[i];
    delete[] p;
  • Re: Matrici e puntatori

    Prima usi p e poi armadio ????
  • Re: Matrici e puntatori

    oregon ha scritto:


    Prima usi p e poi armadio ????
    ooops! il compilatore non restituisce nessun errore, forse dovrei provare a stampare i contenuti delle celle di memoria per fare una verifica?
  • Re: Matrici e puntatori

    Nessun errore? Ma che compilatore usi??
  • Re: Matrici e puntatori

    Ok, lasciamo perdere l'esempio creato ad hoc.
    Questo è il codice incollato del programma dove ho estratto il distruttore e costruttore, la dichiarazione della classe.
    Anche qua vedi errori?

    
    
    
    #include <iostream>
    using namespace std;
    
    const int P=5;    // n. pezzi max per slot
    const int S=5;    // n. di slot
    
    class Distributore {
            int** armadio;
            int ripiani;
        public:
            Distributore(const int);
            bool acquista(int);
            bool aggiungi(int,int);
            friend ostream& operator<<(ostream&, const Distributore&); 
            Distributore(const Distributore&);
            Distributore operator+(int);
            ~Distributore();
    };
    
    Distributore::Distributore(const int num)           //costruttore
    {
        ripiani=num;
        armadio=new(int*[ripiani]);
        for(int r=0; r<ripiani; r++)
            armadio[r]=new int[S];
        for(int r=0; r<ripiani; r++)
            for(int c=0; c<S; c++)
                armadio[r][c]=1;
    }
    
    Distributore::~Distributore() //distruttore di copia
    {
        for (int i=0; i<ripiani; i++) {
            delete[] armadio[i];
            }
        delete[] armadio;
    }
    
    
Devi accedere o registrarti per scrivere nel forum
12 risposte