Concetti Chiave
- In C, puntatori e array sono strettamente correlati ma presentano differenze significative, specialmente nelle operazioni aritmetiche.
- I puntatori possono utilizzare la notazione array, ma non viceversa; la comprensione del tipo di oggetto puntato è cruciale.
- Il compilatore C trasforma espressioni con notazione array in espressioni con tipo puntatore, offrendo diverse modalità di espressione delle variabili.
- Le stringhe letterali riservano spazio in memoria e non possono essere modificate se puntate da un puntatore, diversamente dagli array.
- Esistono differenze nell'uso di sizeof(), la gestione delle stringhe letterali, e l'assegnazione di valori tra array e puntatori.
Array e puntatori a confronto
In C c’è una stretta relazione tra gli array e i puntatori, ma anche notevoli differenze. È possibile utilizzare un puntatore usando la notazione array, ma non è possibile usare puntatori come array e viceversa. Le principali difficoltà nel capire le relazioni tra i due tipi di dato sono quelle che riguardano la difficoltà di capire il tipo di oggetto puntato, la semantica delle operazioni aritmetiche eseguibili su puntatori o con puntatori infatti dipende dal tipo di oggetto puntato. = (1-1) = (x-x) = (&p -&p) ;
In C non ci sono controlli sul superamento dei limiti di array, perciò può accadere di sovrascrivere la memoria. Il compilatore in questi casi non dà warning per i puntatori, ma li dà per gli array.
Puntatori a int: int A [10]; int *p = A;
Puntatori ad array di int: int A [10]; int (*p )[10] = &A;
Array di puntatori ad int: int *p [10]
Il compilatore trasforma autonomamente le espressioni con notazione array in espressioni con tipo puntatore:
A → *(A+i)
Ci sono diversi modi per esprime un variabile in un array:
p [1] = *( p +1) = *( A+1) = A [1]) e p[0] = 0
La regola di conversione da notazione array ad espressione aritmetica di tipo puntatore è applicata anche agli array multidimensionali:
A [j] [k] → (*(A+i)) [j] [k] → (*(*(A+i)+j)) [k] → *(*(*(A+i)+j)+k)
di avere righe di diverse lunghezze.
Una dichiarazione di puntatore riserva spazio di memoria per l’oindirizzo dell’oggetto puntato, tranne nel caso in cui l’oggetto puntato sia una stringa letterale, a cui viene riservato spazio di memoria (nel text segment). Non è possibile modificare il contenuto di una stringa letterale se questa è puntata da un puntatore, possiamo però farlo se è utilizzata per inizializzare un array.
Equivalenze tra puntatori e array:
- Nome di array è trattato come un puntatore al primo elemento dell’array dal compilatore
- L’indicizzazione di un elemento di un array è uguale a un’espressione aritmetica con tipo puntatore
- Il nome di un array in una dichiarazione di funzione è trattata come un puntatore al primo elemento dell’array
Differenze tra puntatori e array:
- L’operatore sizeof() agisce in modo diverso
- Non è possibile modificare una stringa letterale se assegnata a un puntatore, ma se assegnata ad un array sì
- Non si può assegnare valori ad una variabile di tipo array, ma si può farlo con variabili puntatore
- Differenze legate alla keyword extern
Domande da interrogazione
- Qual è la relazione tra array e puntatori in C?
- Quali sono le difficoltà principali nel comprendere le relazioni tra array e puntatori?
- Come il compilatore gestisce le espressioni con notazione array?
- Quali sono le differenze principali tra puntatori e array?
In C, c'è una stretta relazione tra array e puntatori, ma ci sono anche notevoli differenze. Un puntatore può essere utilizzato con la notazione array, ma non viceversa.
Le difficoltà principali riguardano la comprensione del tipo di oggetto puntato e la semantica delle operazioni aritmetiche eseguibili su puntatori, che dipendono dal tipo di oggetto puntato.
Il compilatore trasforma autonomamente le espressioni con notazione array in espressioni con tipo puntatore, ad esempio, A → *(A+i).
Le differenze principali includono il comportamento dell'operatore sizeof(), la possibilità di modificare stringhe letterali, l'assegnazione di valori e le differenze legate alla keyword extern.