Tutorial de programación en C para Linux Parte 21: Punteros de caracteres, matriz de punteros y puntero a puntero
El concepto de punteros es uno de los conceptos más importantes del lenguaje de programación C. Hasta ahora hemos tratado varios aspectos de los punteros en C. Ampliando esto, en este tutorial trataremos algunos conceptos más de los punteros.
Punteros de carácter, matriz de punteros y puntero a puntero en C
Empecemos con los punteros de carácter con las siguientes líneas de código:
char p[] = "I like HowtoForge"
char *p = "I like HowToForge"
La primera línea define un array ‘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 a una constante de cadena.
La diferencia aquí es que al ser el primer ‘p’ un array, puedes modificar o cambiar fácilmente el contenido del array. Pero como el segundo ‘p’ apunta a una constante de cadena, no puedes cambiar el contenido de la cadena.
Por ejemplo, el siguiente trozo de código intenta modificar una constante de cadena:
#include <stdio.h>
int main()
{
char *p = "I like HowToForge";
p[0] = 'U';
return 0;
}
Y aquí está la salida producida por este código en mi sistema:
Segmentation fault
Este error sugiere que la ejecución del programa ha terminado de forma abrupta, y eso es porque hemos intentado cambiar algo que es constante.
Además, ten en cuenta que aunque el puntero ‘p’ puede hacerse apuntar a una cadena diferente, no puedes cambiar la dirección base de la matriz ‘p’ (si recuerdas, esto ya lo hemos tratado en uno de nuestros tutoriales anteriores).
Pasando ahora a las matrices de punteros, al igual que has visto matrices de enteros, de caracteres y de otro tipo, también puede haber una matriz de punteros. Por ejemplo, el siguiente programa define una matriz ‘arr’ de punteros enteros y le asigna valores.
#include <stdio.h>
int main()
{
int *arr[3];
int a = 0, b = 1, c = 2;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
return 0;
}
Observa que los valores asignados a la matriz son direcciones. Esto se debe a que ‘arr’ es una matriz de punteros, y los punteros sólo almacenan direcciones. Ahora, si quieres acceder a los valores guardados en esas direcciones, tendrás que utilizar el operador *.
El siguiente ejemplo (que no es más que una extensión del ejemplo anterior) muestra esto:
#include <stdio.h>
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] is: %d",i,*(arr[i]));
return 0;
}
Este es el resultado:
arr[0] is: 0
arr[1] is: 1
arr[2] is: 2
De forma similar a las matrices de punteros de enteros (como la que comentamos aquí), puedes tener matrices que almacenen punteros de caracteres y más.
Ahora, pasemos a los punteros a punteros. Como hemos repetido varias veces hasta ahora, un puntero almacena una dirección. Ahora bien, hasta ahora en esta serie de tutoriales de programación en C en curso, sólo hemos visto un puntero que apuntaba a una variable que no era un 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;
Este es un trozo de código que utiliza un puntero doble:
#include <stdio.h>
int main()
{
int *ptr;
int **p;
int a = 10;
ptr = &a;
p = &ptr;
printf("\n Pointer 'p' points to pointer 'ptr' which further points to value: %d", **p);
return 0;
}
Este es el resultado:
Pointer 'p' points to pointer 'ptr' which further points to value: 10
Este es un ejemplo de puntero doble. En una línea similar, puedes tener un puntero a un puntero, definido como, por ejemplo, int ***ptr. El número máximo de estos niveles de «puntero a puntero a ……» es específico de la implementación (aunque en algunos casos el límite es 12).
En la práctica, sin embargo, es probable que sólo 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
Hemos tratado aquí tres importantes conceptos relacionados con los punteros. Te aconsejamos que pruebes los ejemplos y conceptos que hemos tratado aquí en tu sistema para hacerte una mejor idea de cómo funcionan estas cosas. En caso de cualquier duda o consulta, déjanos un comentario a continuación.