ProgrammazioneSviluppatore Embedded

Che cos'è un array di puntatori nel linguaggio C e in cosa si differenzia da un puntatore a un array? Come si dichiarano e si usano correttamente ciascun tipo?

Supera i colloqui con l'assistente IA Hintsage

Risposta

Array di puntatori — struttura in cui ogni elemento rappresenta un puntatore, di solito dello stesso tipo. Viene utilizzato, ad esempio, per memorizzare un elenco di stringhe (char *arr[];).

Puntatore a un array — variabile che memorizza l'indirizzo di inizio dell'intero array (ad esempio, int (*ptr)[10]; punta a un array di 10 elementi int).

Esempi:

// Array di puntatori a char (array di stringhe) char *days[] = {"Sun", "Mon", "Tue"}; // Puntatore a un array di 10 numeri interi int arr[10]; int (*p)[10] = &arr; // Accesso: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]

Domanda insidiosa

"Qual è la differenza tra char *arr[3]; e char (*arr)[3]; e come accedere correttamente alle stringhe in ciascun caso?"

Molti pensano che non ci sia differenza o che siano semplicemente sinonimi.

Risposta corretta:

  • char *arr[3]; — array di 3 puntatori a char (di solito un array di stringhe).
  • char (*arr)[3]; — puntatore a un array di 3 char (puntatore a una stringa monoblocco lunga 3).
char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z

Esempi di errori reali dovuti all'ignoranza delle sottigliezze dell'argomento


Storia 1

Nel progetto è stato creato un array di stringhe per il menu, ma è stato scritto char menu[5][30]; È stato passato erroneamente come parametro nella funzione come char *menu, causando malfunzionamenti della funzione solo con la prima stringa, mentre le altre risultavano distorte o la programma si bloccava.


Storia 2

Hanno cercato di creare un array di puntatori a array: int *arr[10]; inizializzati tramite cicli, ma in realtà si conservavano puntatori a array locali, provocando UB durante l'accesso.


Storia 3

Nell'implementazione di una coda FIFO per i buffer si è confuso dove prendere l'indirizzo dell'intera coda (puntatore a un array) e dove prendere l'elemento (array di puntatori a blocchi). Questo ha causato scostamenti errati nei puntatori — i dati venivano persi.