ProgramaciónDesarrollador Embebido

¿Qué es un array de punteros en el lenguaje C y en qué se diferencia de un puntero a un array? ¿Cómo se deben declarar y usar correctamente cada uno de estos tipos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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]

Pregunta trampa

"¿En qué se diferencia char *arr[3]; de char (*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

Ejemplos de errores reales por desconocimiento de los matices del tema


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.