Skip to content

Arreglos y apuntadores

RDLL edited this page Aug 11, 2023 · 2 revisions

Arreglos y apuntadores

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

using namespace std;

int main(){
    srand(time(NULL));
    int array[10],*ptr;
    ptr = &array[0];
    for (int i = 0; i < 10; i++)
        *(ptr+i) = rand() % 20;
    for (int i = 0; i < 10; i++)
        cout << array[i] << '\n';
    cout <<endl;
    return 0;
}

En principio un arreglo es un apuntador que apunta al primer elemento de un arreglo, de ahí el porque se puede usar un apuntador para recorrer y/o modificar arreglos, sin embargo hay una gran diferencia respecto a declararlo como arreglo a como un apuntador.

Modificando el contenido

*(ptr+i) = rand() % 20;

Aquí estamos recorriendo las diferentes direcciones de memoria que ocupa el arreglo, acceder al contenido, y modificarlo.

Si lo dejamos sin usar el operador de indirección nos marcaría error, también si lo usamos sin los paréntesis nos marcaría error, esto es porque le estamos asignando un valor y no una dirección de memoria.

Así que siempre que queramos modificar el valor de la variable a la que se apunta, hay que usar el operador de indirección * para asignar o modificar el valor.

Arreglos usando apuntadores

Dado que un arreglo es un apuntador, podemos crear arreglos usando apuntadores directamente, una de las ventajas de hacer esto, es que podemos crear arreglos en tiempo de ejecución, simular memoria dinámica.

A pesar de que el arreglo se crea en tiempo de ejecución seguimos dependiendo de conocer el tamaño del arreglo aunque sea en tiempo de ejecución.

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

using namespace std;

int main(){
    srand(time(NULL));
    int tam;
    int *ptr=NULL;
    cout << "Ingresa cantidad de elementos";
    cin << tam;
    ptr = new int[tam];
    if (ptr != NULL){
        for(int i = 0;i < tam; i++)
            *(ptr+i) = rand() % tam;
        for(int i = 0;i < tam; i++)
            cout << ptr[i] << '\n';
    }else cout << "Arreglo no creado";
    delete ptr;
    cout << "Memoria liberada";
    ptr = NULL;
    cout << endl;
    return 0;
}

A pesar de que no sea directamente memoria dinámica igual podemos realizar algunas cosas similares.

Operadores new y delete

Gracias a estos operadores es que C++ permite el manejo dinámico de memoria, con new reservamos la memoria a utilizar y este operador nos devuelve la primer dirección de memoria, con delete liberamos dicha memoria reservada.

En si es una manera de decirle al compilador que mas adelante usaremos memoria, en caso de no haber memoria new lanza una excepción y no devuelve nada.

Librería cstdlib

Esta librería nos permite usar las funciones para manejo dinámico de memoria y la generación de números aleatorios.

En el caso de los operadores new y delete estos se encuentran en la librería iostream.

Tanto rand como srand se encuentran en cstdlib; srand nos sirve para inicializar la semilla o el generador de números aleatorios en función de la hora del sistema, se usa de esta manera para evitar la repitición de los números tras cada ejecución y rand es el generador de nùmeros aleatorios.

Libreria ctime

Es una librería para la manipulación de fechas y tiempo.

La usamos para poder generar la semilla a tráves de srand en función de la hora del sistema con time(NULL).

Notación apuntador

La notación apuntador en el caso de estar trabajando con arreglos usando apuntadores, es la notación que usamos para realizar el recorrido y/o modificar el contenido

*(ptr+i) = rand() % tam;

Notación arreglo

Es la notación que normalmente usamos para trabajar arreglos, podemos hacer uso de la que mas nos convenga o se nos haga fácil de utilizar.

cout << ptr[i] << '\n';
Introducción Apuntadores Arreglos de apuntadores Apuntadores a funciones