Punteros C · 3 min read · Nov 20, 2025

Tutorial de programación en C de Linux Parte 21: Punteros de caracteres, arreglo de punteros y puntero a puntero

El concepto de punteros es, de hecho, uno de los conceptos muy importantes en el lenguaje de programación C. Hasta ahora, hemos discutido varios aspectos de los punteros en C. Ampliando eso, en este tutorial, discutiremos algunos conceptos más sobre punteros.

Punteros de caracteres, arreglo de punteros y puntero a puntero en C

Comencemos con punteros de caracteres con las siguientes líneas de código:

char p[] = "Me gusta HowtoForge"  
char *p = "Me gusta HowToForge"

La primera línea define un arreglo ‘p’ con un tamaño igual al número de caracteres entre comillas dobles. Pero la siguiente línea define un puntero ‘p’ que apunta hacia una constante de cadena.

La diferencia aquí es que el primer ‘p’, al ser un arreglo, puedes modificar o cambiar fácilmente el contenido del arreglo. Pero dado que el segundo ‘p’ está apuntando a una constante de cadena, simplemente no puedes cambiar el contenido de la cadena.

Por ejemplo, el siguiente fragmento de código intenta modificar una constante de cadena:

#include   
  
int main()  
{  
   char *p = "Me gusta HowToForge";  
   
   p[0] = 'U';  
  
   return 0;  
}

Y aquí está la salida producida por este código en mi sistema:

Fallo de segmentación

Este error sugiere que la ejecución del programa llegó a un final abrupto, y eso es porque intentamos cambiar algo que es constante.

Además, ten en cuenta que aunque el puntero ‘p’ puede hacerse para apuntar a una cadena diferente, no puedes cambiar la dirección base del arreglo ‘p’ (si recuerdas, esto ya lo hemos discutido en uno de nuestros tutoriales anteriores).

Ahora, pasando a los arreglos de punteros, así como has visto arreglos de enteros, caracteres y otros tipos, también puede haber un arreglo de punteros. Por ejemplo, el siguiente programa define un arreglo ‘arr’ de punteros a enteros y les asigna valores.

#include   
  
int main()  
{  
 int *arr[3];  
 int a = 0, b = 1, c = 2;  
   
 arr[0] = &a;  
 arr[1] = &b;  
 arr[2] = &c;  
  
 return 0;  
}

Ten en cuenta que los valores asignados al arreglo son direcciones. Esto se debe a que ‘arr’ es un arreglo de punteros, y los punteros no almacenan nada más que direcciones. Ahora, si deseas acceder a los valores guardados en estas direcciones, tendrás que usar el operador *.

El siguiente ejemplo (que no es más que una extensión del ejemplo anterior) muestra esto:

#include   
  
int main()  
{  
   int *arr[3];  
   int a = 0, b = 1, c = 2;  
   
   arr[0] = &a;  
   arr[1] = &b;  
   arr[2] = &c;  
   
   for(int i=0; i < 3; i++)  
      printf("\n arr[%d] es: %d",i,*(arr[i]));  
  
 return 0;  
}

Aquí está la salida:

arr[0] es: 0   
arr[1] es: 1   
arr[2] es: 2 

Similar a los arreglos de punteros a enteros (como el que discutimos aquí), puedes tener arreglos que almacenan punteros a caracteres y más.

Ahora, pasemos a punteros a punteros. Como hemos reiterado varias veces hasta ahora, un puntero almacena una dirección. Ahora, hasta ahora en esta serie de tutoriales de programación en C, solo hemos visto un puntero apuntando a una variable no puntero, pero el hecho es que los punteros también pueden apuntar a otros punteros.

Esto significa que un puntero puede almacenar la dirección de otro puntero. Por ejemplo, lo siguiente es un puntero doble o un puntero a puntero:

int **ptr;

Aquí hay un fragmento de código que utiliza un puntero doble:

#include   
  
int main()  
{  
   int *ptr;  
   int p;  
   
   int a = 10;  
   
   ptr = &a;  
   
   p = &ptr;  
   
   printf("\n El puntero 'p' apunta al puntero 'ptr' que a su vez apunta al valor: %d", p);  
  
   return 0;  
}

Aquí está la salida:

El puntero 'p' apunta al puntero 'ptr' que a su vez apunta al valor: 10

Así que este fue un ejemplo de un puntero doble. En líneas similares, puedes tener un puntero a un puntero a un puntero, definido como, por ejemplo, int *ptr. El número máximo de tales niveles de ‘puntero a puntero a……’ es específico de la implementación (en algunos casos el límite es 12, aunque).

Prácticamente, sin embargo, es probable que solo encuentres punteros a punteros hasta el nivel tres, ya que tener más niveles hace que la lógica sea más compleja de entender y mantener.

Conclusión

Discutimos aquí tres conceptos importantes relacionados con punteros. Se te aconseja probar los ejemplos y conceptos que discutimos aquí en tu sistema para tener una mejor idea de cómo funcionan estas cosas. En caso de cualquier duda o consulta, déjanos un comentario abajo.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.