-
Notifications
You must be signed in to change notification settings - Fork 1
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.
*(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.
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.
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.
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.
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)
.
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;
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 |
---|