Aritmetica dei puntatori

di il
3 risposte

Aritmetica dei puntatori

Evviva evviva l'aritmetica dei puntatori

3 Risposte

  • Re: Aritmetica dei puntatori

    Ciao,
    nella tua classe iteratore ti terrai traccia della posizione corrente, cosi` da passare alla successiva. Nel costruttore puoi passare come parametro all'iteratore la dimensione della matrice, in modo da sapere se, all'attivazione del ++, devi andare all'elemento [x][y+1] della matrice, o all'elemento [x+1][y].

    Spero di esserti stato d'aiuto,
    Intel.
  • Re: Aritmetica dei puntatori

    Hai proprio ragione
  • Re: Aritmetica dei puntatori

    Ok, provo a spiegarti brevemente un po' di aritmetica sui puntatori. Te hai una matrice, ovvero un doppio puntatore ai tuoi dati. Per semplicità ammettiamo una matrice di interi: int ** matrice.
    Il primo puntatore rappresenta il valore della colonna, mentre il secondo quello della riga. È possibile accedere al dato in posizione (x, y) semplicemente scrivendo la sintassi matrice[x][y]. Se invece vuoi spostare il puntatore che identifica la matrice nella posizione (x, y) devi effettuare due somme: la prima al puntatore della colonna e la seconda al puntatore della riga. Una volta effettuata la somma il dato in posizione (x, y) te lo ritroverai nella posizione (0, 0). La somma sulla colonna quindi si effettua facendo
    matrice += x;
    , mentre la somma sulle righe
    (*matrice) += y
    . Come puoi notare per spostarti di una riga accedi al puntatore relativo alla colonna ed effettui la somma sul secondo puntatore. Dando una breve occhiata al tuo codice la tua matrice è fatta proprio con un doppio puntatore, e quindi questa soluzione dovrebbe funzionarti. Per completezza ti posto un piccolo codice di esempio scritto in c con una matrice 5x5 e la procedura per manipolare i suoi puntatori in modo da stampare tutti i suoi elementi. In pratica ho simulato in piccolo il tuo iteratore.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
    	
    	int i, j, c = 0;
    	int ** m;
    	
    	/* allocazione matrice */
    	m = (int **) malloc(sizeof(int) * 5);
    	
    	for (i = 0; i < 5; i++){
    		m[i] = (int *) malloc(sizeof(int) * 5);
    		for (j = 0; j < 5; j++)
    			m[i][j] = c++;
    	}
    	
    	/* scansione matrice */
    	for (i = 0; i < 5; i++){
    		
    		for (j = 0; j < 5; j++){
    		
    			printf("%d ", **m);
    			(*m)++;  /* spostamento sulle righe */
    			
    			if (j == 4)
    				printf("\n");
    			
    		}
    		
    		m++;  /* spostamento sulle colonne */
    		
    	}
    	
    	return 0;
    	
    }
    
    Intel
Devi accedere o registrarti per scrivere nel forum
3 risposte