Array de punteros — estructura donde cada elemento es un puntero, generalmente del mismo tipo. Se utiliza, por ejemplo, para almacenar una lista de cadenas (char *arr[];).
Puntero a un array — variable que almacena la dirección del inicio de todo el array (por ejemplo, int (*ptr)[10]; apunta a un array de 10 elementos int).
Ejemplos:
// Array de punteros a char (array de cadenas) char *days[] = {"Sun", "Mon", "Tue"}; // Puntero a un array de 10 números enteros int arr[10]; int (*p)[10] = &arr; // Acceso: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"¿En qué se diferencia
char *arr[3];dechar (*arr)[3];y cómo acceder a las cadenas en cada caso?"
Muchos creen que no hay diferencia o que son simplemente sinónimos.
Respuesta correcta:
char *arr[3]; — array de 3 punteros a char (generalmente un array de cadenas).char (*arr)[3]; — puntero a un array de 3 char (puntero a una cadena unidimensional de longitud 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
Historia 1
En un proyecto se levantaron arrays de cadenas para un menú, pero escribieron char menu[5][30]; y lo pasaron incorrectamente a una función como char *menu, lo que hizo que la función solo funcionara con la primera cadena, mientras que las demás se corrompían o el programa fallaba.
Historia 2
Intentaron crear un array de punteros a arrays: int *arr[10]; lo inicializaron a través de ciclos, pero en realidad almacenaron punteros a arrays locales, lo que causó UB al intentar acceder.
Historia 3
En la implementación de una cola FIFO para buffers confundieron dónde tomar la dirección de toda la cola (puntero a un array) y dónde tomar el elemento (array de punteros a bloques). Debido a esto, los desplazamientos de punteros eran incorrectos — se perdían datos.