vale1411
Genius
3 min. di lettura
Vota

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.
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

= (1-1)

= (x-x)

= (&p -&p)

;
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

  1. Qual è la relazione tra array e puntatori in C?
  2. 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.

  3. Quali sono le difficoltà principali nel comprendere le relazioni tra array e puntatori?
  4. 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.

  5. Come il compilatore gestisce le espressioni con notazione array?
  6. Il compilatore trasforma autonomamente le espressioni con notazione array in espressioni con tipo puntatore, ad esempio, A → *(A+i).

  7. Quali sono le differenze principali tra puntatori e array?
  8. 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.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community