Skip to content

Arreglos de apuntadores

RDLL edited this page Aug 11, 2023 · 3 revisions

Arreglos de apuntadores

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>

using namespace std;

int main(){
    srand(time(NULL));
    int cols,rows;
    int **ptr=NULL;
    cout << "Ingresa filas";
    cin >> rows;
    cout << "Ingresa columnas";
    cin >> cols;
    try{
        ptr = new int*[rows];
        for(int i = 0; i < rows; i++)
            *(ptr+i) = new int[cols];
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                *(*(ptr + i)+j) = rand() % (rows*cols);
            }
        }
        for(int i = 0; i < rows; i++){
            cout << "\n|" << setw(2);
            for(int j = 0; j < cols; j++)
                cout << setw(2) << ptr[i][j] << setw(2) << "|";
        }
        for(int i = 0; i < rows; i++)
            delete[] *(ptr+i);
        cout << "\nMemoria de columnas liberada\n";
        delete[] ptr;
        cout << "Memoria completa liberada";
    }catch(bad_alloc& ex){
        cout<< "Matriz no creada, memoria insuficiente\n";
    }
    cout <<endl;
    return 0;
}

Para declarar matrices, el tema cambia bastante, ya que en realidad se crea un arreglo de apuntadores a un tipo de dato, para el ejemplo sería un arreglo de apuntadores a enteros.

Declaración

Para decirle al compilador que vamos a crear una matriz usando arreglos usamos **

int **ptr=NULL;

Y creamos el arreglo de apuntadores indicando que se trata de apuntadores

ptr = new int*[rows];

Para crear las columnas hay que recorrer cada fila.

for(int i = 0; i < rows; i++)
            *(ptr+i) = new int[cols];

También podemos usar la notación arreglo

for(int i = 0; i < rows; i++)
            ptr[i] = new int[cols];

Inicialización

Para inicializarlos podemos usar tanto la notación apuntador o la notación arreglo

    for(int i = 0; i < rows; i++)
        for(int j = 0; j < cols; j++)
            *(*(ptr + i)+j) = rand() % (rows*cols);

Dado que lo que queremos modificar es una variable entera, asi que hay que recorrer los apuntadores a enteros que se encuentran en el arreglo y de ahí recorrer los apuntadores a enteros.

Lo podemos ver así

*(*(arreglo de apuntadores)apuntadores a enteros)

Librería iomanip

Es una librería de manipulación de parámetros de salida

Esta librería nos permite usar setw, que lo que hace es crear un espacio del tamaño que le indiquemos en cada declaración.

for(int i = 0; i < rows; i++){
    cout << "\n|" << setw(2);
        for(int j = 0; j < cols; j++)
            cout << setw(2) << ptr[i][j] << setw(2) << "|";
}

Lo que hace aquí es asignar un espacio de tamaño 2, como si presionaramos 2 veces la barra espaciadora, por eso no confundir con \t que es para tabulación.

Para una matriz de 4x5 la salida se vería así

| 1 |13 |18 | 6 |17 |
|15 |17 |16 | 9 | 8 |
| 3 | 1 |18 | 7 |14 |
|12 |19 |15 |16 | 6 |

Esto de modificar los parámetros de salida, solo dependerá de si queremos darle estilo a la salida, no es algo obligatorio

Introducción Apuntadores Arreglos y apuntadores Apuntadores a funciones