Array e puntatori

In questo articolo parleremo degli array e puntatori in C, ovvero di due elementi strettamente correlati tra loro. Infatti il compilatore gestisce sempre gli array con la logica dei puntatori.

Abbiamo studiato come accedere agli elementi di un array per mezzo di un indice, adesso vedremo come accedere per mezzo di un puntatore.

Dunque, se consideriamo ad esempio un array a e una variabile puntatore pa:

int a[10];

int *pa;

Potremmo utilizzare indifferentemente le due assegnazioni equivalenti:

pa=&a[0]; oppure

p=a;

Quindi, come potete notare, il nome dell’array è usato come un puntatore al suo primo elemento.

In C il nome dell’array, come nel nostro caso a, è una costante, non una variabile.


Esempio di utilizzo di Array e puntatori

Quindi, come dicevamo, il nome di un array è un puntatore costante al primo elemento di un array. Dunque facciamo questo semplice esempio, dove entrambi i printf stampano l’indirizzo del primo elemento di a.

#include <stdio.h>

int main() {
	int a[5];
	int *p;
	
	p=a; //avrei potuto scrivere anche p=&a[0]
	
	printf("indirizzo: %p ", a);
	printf("indirizzo: %p ", p);
	
	return 0;
}

Consideriamo adesso che l’espressione a[i] non fa altro che aggiungere al puntatore implicito a il valore della variabile intera i e applicare al risultato ottenuto l’operatore di in-direzione *. Dunque scrivere a[i] è equivalente a scrivere *(a+i).

Facciamo quindi un semplice esempio:

#include <stdio.h>

int main() {
	int a[5]={6,3,4,8,9};

	printf("\nValore: %d", a[2]);
	printf("\nValore: %d", *(a+2));
	
	return 0;
}

Entrambi i printf stamperanno il valore 4.

Anche se è meno comune, potrei scrivere anche in questo modo:

#include <stdio.h>

int main() {
	int a[5]={6,3,4,8,9};

	printf("\nValore: %d", 2[a]);
	printf("\nValore: %d", *(2+a));
	
	return 0;
}

Quindi c’è equivalenza tra puntatori e nomi di vettori, ma è importante dire che i puntatori rappresentano delle variabili, mentre i nomi dei vettori rappresentano delle costanti.

A un puntatore infatti viene allocata la memoria necessaria a contenere l’indirizzo dell’oggetto puntato mentre a un array viene assegnato lo spazio necessario per contenere gli elementi.

Precisiamo dunque che se p è un puntatore e a è un array, le operazioni: p++; e pure p=a; sono così consentite. Mentre non sono consentite a++; e anche a=p.

Altri esempi con array e puntatori

Facciamo altri semplici esempi per rafforzare quanto detto.

Prendiamo dunque un array a e sommiamo tutti gli elementi, noterete che entrambi i metodi proposti sono equivalenti.

#include <stdio.h>

int main() {
	int a[5]= {9,5,6,7,10};
	int i,sum=0;
	
	for(i=0; i<5; i++)
		sum += a[i];
	
	printf("\nStampa la somma %d", sum);
	
	sum=0;
	for(i=0; i<5; i++)
		sum += *(a+i);
		
	printf("\nStampa la somma %d", sum);
	
	return 0;
}
	

Anche con quest’altro esempio otterremo lo stesso risultato, fate attenzione all’ultimo ciclo for, che non fa uso dell’indice i ma del puntatore. Avrei potuto scrivere il secondo for anche così: for(; p<(a+5); p++).

#include <stdio.h>

int main() {
	int a[5]= {9,5,6,7,10};
	int *p = &a[0];
	int i,sum=0;
	
	for(i=0; i<5; i++)
		sum += p[i];
		
	printf("\nStampa la somma %d", sum);
	
	sum=0;	
	for(p=a; p<(a+5); p++)
		sum += *p;
	
	printf("\nStampa la somma %d", sum);

	return 0;
}

In questa lezione abbiamo parlato di array e puntatori, torneremo ancora a parlare di questo argomento nelle prossime lezioni, al fine di approfondire questi concetti.

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


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *