Matriz de punteros en C
En C, una matriz de punteros es una colección homogénea de variables de puntero indexadas que son referencias a una ubicación de memoria. Generalmente se usa en programación C cuando queremos apuntar a múltiples ubicaciones de memoria de un tipo de datos similar en nuestro programa C. Podemos acceder a los datos desreferenciando el puntero que apunta a ellos.
Sintaxis:
pointer_type *array_name [array_size];
Aquí,
- pointer_type: tipo de datos al que apunta el puntero. array_name: Nombre del array de punteros. array_size: Tamaño de la matriz de punteros.
Nota: Es importante tener en cuenta la precedencia y asociatividad del operador en la matriz de declaraciones de punteros de diferentes tipos, ya que un solo cambio significará algo completamente diferente. Por ejemplo, incluir *nombre_matriz entre paréntesis significará que nombre_matriz es un puntero a una matriz.
Ejemplo:
C
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
Producción
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
Explicación:
Como se muestra en el ejemplo anterior, cada elemento de la matriz es un puntero que apunta a un número entero. Podemos acceder al valor de estos números enteros seleccionando primero el elemento de la matriz y luego desreferenciandolo para obtener el valor.
Conjunto de sugerencias sobre el carácter
Una de las principales aplicaciones de la matriz de punteros es almacenar múltiples cadenas como una matriz de punteros a caracteres. Aquí, cada puntero de la matriz es un puntero de carácter que apunta al primer carácter de la cadena.
Sintaxis:
char *array_name [array_size];
Después de eso, podemos asignar una cadena de cualquier longitud a estos punteros.
Ejemplo:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
Este método de almacenar cadenas tiene la ventaja de la matriz tradicional de cadenas. Considere los siguientes dos ejemplos:
Ejemplo 1:
C
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
Producción
String array Elements are: Geek Geeks Geekfor
En el programa anterior, hemos declarado las 3 filas y 10 columnas de nuestra matriz de cadenas. Pero debido a la predefinición del tamaño de la matriz de cadenas, el consumo de espacio del programa aumenta si la memoria no se utiliza correctamente o no se utiliza. Ahora intentemos almacenar las mismas cadenas en una matriz de punteros.
Ejemplo 2:
C
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
Producción
geek Geeks Geeksfor
Aquí, la memoria total utilizada es la memoria necesaria para almacenar las cadenas y los punteros sin dejar ningún espacio vacío, lo que ahorra una gran cantidad de espacio desperdiciado. Podemos entender esto usando la imagen que se muestra a continuación.
El espacio ocupado por la matriz de punteros a caracteres se muestra mediante bloques de color verde sólido, excluyendo la memoria necesaria para almacenar el puntero, mientras que el espacio ocupado por la matriz de cadenas incluye bloques de color verde sólido y claro.
Matriz de punteros a diferentes tipos
No solo podemos definir la matriz de punteros para tipos de datos básicos como int, char, float, etc., sino que también podemos definirlos para tipos de datos derivados y definidos por el usuario, como matrices, estructuras, etc. Consideremos el siguiente ejemplo donde Creamos una matriz de punteros que apuntan a una función para realizar las diferentes operaciones.
Ejemplo:
C
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
Producción
Sum : 55 Difference : 45 Product : 250 Quotient : 10
Aplicación de una matriz de punteros
Una variedad de indicadores es útil en una amplia variedad de casos. Algunas de estas aplicaciones se enumeran a continuación:
- Se utiliza más comúnmente para almacenar varias cadenas.
- También se utiliza para implementar LinkedHashMap en C y también en la técnica de encadenamiento de resolución de colisiones en Hashing.
- Se utiliza en algoritmos de clasificación como la clasificación por cubos.
- Se puede usar con cualquier tipo de puntero por lo que es útil cuando tenemos declaraciones separadas de múltiples entidades y queremos almacenarlas en un solo lugar.
Desventajas de la matriz de punteros
La variedad de indicadores también tiene una buena cantidad de desventajas y debe usarse cuando las ventajas superan las desventajas. Algunas de las desventajas de la matriz de punteros son:
- Mayor consumo de memoria: una matriz de punteros requiere más memoria en comparación con matrices simples debido al espacio adicional requerido para almacenar punteros. Complejidad: una matriz de punteros puede resultar compleja de usar en comparación con una matriz simple. Propenso a errores: a medida que usamos punteros, todos los errores asociados con los punteros vienen con ellos, por lo que debemos manejarlos con cuidado.
Artículo relacionado: Puntero a una matriz | Puntero de matriz