libri-javascript-python

In questa lezione introdurremo l’aritmetica dei puntatori. Infatti, come abbiamo già detto i puntatori sono delle variabili particolari che contengono un indirizzo di memoria. Come sappiamo sugli indirizzi di memoria è possibile fare un accesso diretto.

Operazioni e aritmetica dei puntatori

Elenchiamo alcune operazioni con i puntatori:

La dereferenziazione

Della dereferenziazione ne abbiamo già discusso nella precedente lezione, ne riportiamo un esempio.

int *pa, a;

pa=&a;


L’assegnamento

Abbiamo già trattato l’assegnamento nella lezione precedente.

int *pa, *pb;

pb=pa;

o ancora un altro esempio:

int *pa=NULL;

In questo caso viene assegnato al puntatore pa il valore NULL, quindi restituisce il valore 0.

Ricordiamo che se un puntatore viene dichiarato ma non inizializzato non punta a NULL e restituisce il valore 1.

Il confronto

int *pa, *pb;

if (pa==pb);

….

else if (pa<pb)

….

Il confronto può essere utilizzato per vedere se due puntatori puntano alla stessa locazione di memoria.

Si possono utilizzare gli operatori:

==, !=, <, <=, >, >=


Operazioni di incremento e decremento

Incremento – Per andare da un indirizzo più basso ad uno più alto.

Decremento – Per andare da un indirizzo più alto ad uno più basso.

Quindi gli operatori ammessi per una variabile puntatore sono:

+, ++, -, —

Vediamo un semplice esempio a scopo didattico, ipotizzando di avere un array di 5 elementi qualunque. L’operazione di somma puntatore e intero in questo caso provoca un avanzamento del puntatore esattamente a quanto corrisponde l’intero. Allo stesso modo per la differenza, la sottrazione di un intero da un puntatore provoca uno spostamento del puntatore dall’alto verso il basso.

Cioè l’operazione p++ mi dà l’indirizzo della seconda cella, p+=2 mi dà l’indirizzo della terza cella e così via.

Esempio di utilizzo di aritmetica dei puntatori in C con gli operatori di incremento e decremento:

#include <stdio.h>

int main(void) {
	int a[5]= {9,5,6,7,10};
	
	int *p = &a[0];
	
	printf("\nStampa il valore %d", *p);
        //stampa il primo valore, cioè 9.

	p++;
        /*il puntatore si sposta dalla posizione più bassa
          a quella più alta di una posizione. */
	printf("\nStampa il valore %d", *p);
        // quindi stamperà il valore 5. 

	p--;
        /*il puntatore si sposta dalla posizione più alta
          a quella più bassa di una posizione. */
	printf("\nStampa il valore %d", *p);
        // quindi stamperà il valore 9. 

	p += 2;
        /*il puntatore si sposta dalla posizione più bassa
          a quella più alta di due posizioni. */
	printf("\nStampa il valore %d", *p);
        // quindi stamperà il valore 6.
 
	p += 2;
        /*il puntatore si sposta dalla posizione più bassa
          a quella più alta di due posizioni */
	printf("\nStampa il valore %d", *p);
        // quindi stamperà il valore 10. 
	
	return 0;
}

Fate anche la prova a stampare gli indirizzi e analizzate i risultati ottenuti.

int main(void) {
	int a[5]= {9,5,6,7,10};
	
	int *p = &a[0];

	printf("\nStampa il valore %p", p);
	p = p + 1;
	printf("\nStampa il valore %p", p);
	p--;
	printf("\nStampa il valore %p", p);
	p += 2;
	printf("\nStampa il valore %p", p);
	p += 2;
	printf("\nStampa il valore %p", p);
	
	return 0;
}

La sottrazione tra puntatori è definita solo quando entrambi i puntatori puntano ad elementi dello stesso array.

La sottrazione tra un puntatore e un altro produce il numero di posizioni tra i due puntatori.

Facciamo quindi un semplice esempio:

#include <stdio.h>


int main(void) {
	int a[10];
	int *p = &a[0];
 	int *q, d;
 	
 	q = p;
 	p += 6;
 	d = p - q;
 	printf("Numero di interi che si possono memorizzare tra i due puntatori : %d ", d);
	
	return 0;
}
	

Il programma mi dirà che si possono memorizzare tra i due puntatori 6 numeri interi.

In questa lezione abbiamo introdotto l’aritmetica dei puntatori, approfondiremo l’argomento ancora nelle prossime lezioni.

Alcuni link utili

Realizzare un menù di scelta in C

Strutture complesse in C

Esercizio sulle struct in C

Typedef struct C

Media per riga e per colonna

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Sommare dei numeri di una matrice

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Inserire dati in una matrice

Tavola pitagorica in C

Array multidimensionali

Programma sui triangoli in C

Media dei numeri in un array

Array con numeri random

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C