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]
"Qual è la differenza tra
char *arr[3];echar (*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
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.