Guía Clara sobre Punteros a Arreglos en Lenguaje C

Los punteros a arreglos en C son un concepto avanzado que facilita el manejo eficiente de estructuras de datos. Comprenderlos requiere primero dominar los punteros básicos.

Un puntero es una variable que almacena una dirección de memoria. Un puntero constante no puede cambiar su dirección después de la asignación. Ejemplo:

#include <stdio.h>

int main() {
    int dato = 100;
    int *const ptrFijo = &dato;
    printf("Valor: %d\n", *ptrFijo);
    return 0;
}

Intentar reasignar ptrFijo genera un error, ya que es de solo lectura. En cambio, un puntero variable puede apuntar a diferentes direcciones.

Los punteros a arreglos se definen con la snitaxis int (*ptr)[n];, donde ptr apunta a un arreglo de n elementos. Esto es esencial para trabajar con arreglos multidimensionales.

Para un arreglo unidimensional:

#include <stdio.h>

int main() {
    int coleccion[5] = {10, 20, 30, 40, 50};
    int (*ptr)[5];
    ptr = &coleccion;
    for (int i = 0; i < 5; i++) {
        printf("Elemento %d: %d\n", i, (*ptr)[i]);
    }
    return 0;
}

Aquí, ptr apunta al arreglo completo. Desreferenciándolo con (*ptr) se accede a los elementos.

Con arreglos bidimensionales, el puntero se asigna directamente al nombre del arreglo:

#include <stdio.h>

int main() {
    int tabla[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
    int (*ptr)[4];
    ptr = tabla;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%3d ", ptr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

La dimensión del puntero debe coincidir con la segunda dimensión del arreglo para evitar errores.

Para asignación dinámica de arreglos bidimensionales, se usa memoria heap con malloc:

#include <stdio.h>
#include <stdlib.h>

int** asignarMatriz(int filas, int cols) {
    int** matriz = (int**)malloc(filas * sizeof(int*));
    for (int i = 0; i < filas; i++) {
        matriz[i] = (int*)malloc(cols * sizeof(int));
    }
    return matriz;
}

int main() {
    int filas = 3, cols = 4, valor = 1;
    int** matrizDin = asignarMatriz(filas, cols);
    for (int i = 0; i < filas; i++) {
        for (int j = 0; j < cols; j++) {
            matrizDin[i][j] = valor++;
        }
    }
    for (int i = 0; i < filas; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d", matrizDin[i][j]);
        }
        printf("\n");
    }
    // Nota: Se debe liberar la memoria con free() después de su uso.
    return 0;
}

Este método asigna espacio para puntreos a filas y luego para cada fila, permitiando arreglos de tamaño dinámico.

Etiquetas: C Punteros arreglos punteros a arreglos asignación dinámica de memoria

Publicado el 6-13 05:30