Edición didáctica en español. El código y sus salidas conservan el original.
Array de punteros en C
Distingue un array de direcciones de un puntero a un array y accede a los objetos correctamente.

int *p[3] declara un array de tres punteros a int. En cambio, int (*p)[3] declara un puntero a un array de tres enteros. Los paréntesis cambian qué parte del declarador se agrupa primero.
Cada elemento del array de punteros necesita una dirección válida antes de desreferenciarse. Los objetos apuntados pueden estar en lugares diferentes y deben seguir existiendo mientras se usan. Para imprimir una dirección con %p, convierte el argumento a void *.
Un array de punteros a cadenas no es una matriz rectangular de caracteres. Si apunta a literales, utiliza const char * y no intentes modificar esos literales. Dibuja cada puntero y su objeto para comprobar la interpretación.
Código C
#include <stdio.h>
int main(void)
{
int first = 10;
int second = 20;
int third = 30;
int *items[] = {&first, &second, &third};
size_t count = sizeof items / sizeof items[0];
*items[1] = 25;
for (size_t i = 0; i < count; ++i) {
printf("items[%zu] points to %d\n", i, *items[i]);
}
printf("second is now %d\n", second);
return 0;
}Abrir en el compiladorPreguntas frecuentes
¿Por qué el código y la salida siguen en inglés?
Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.