Está en la página 1de 33

Punteros y memoria dinámica

Punteros y memoria dinámica


Temario
• Memoria del computador
• Asignación en C
• Punteros
• Comando de Indirección
• Ejercicios
Memoria de la
computadora
Memoria del computador
La memoria del computador es el lugar donde se almacenan los
valores de las variables que declaramos en nuestros programas.

La memoria está formada por un conjunto de celdas continuas


cada una de 1 byte de tamaño. Estas celdas están enumeradas
de forma consecutiva de tal forma que cada celda tiene el
mismo número que la anterior más 1.
AB001
AB002
AB003
AB004
AB005
AB006
AB007

N-1
N
Memoria del computador
Al declarar una variable el Sistema Operativo (S.O) reserva en la
memoria el espacio necesario para almacenar dicha variable.

Las variables tienen diferente tamaño que pueden ser obtenidos


utilizando la función sizeof(tipo)
La ubicación de las variables dentro de la
Memoria del memoria es aleatoria y se calcula cada vez que se
ejecuta el programa por lo que no podemos saber
computador la posición exacta hasta que el programa se
ejecute.
Memoria del computador
tipodato Variable;
AB001

AB002
Variable La segunda vez que se ejecuta el programa
AB003

AB004

AB005
Variable
AB006 La primera vez que se ejecuta el programa
AB007

N-1

N
Analogía de la memoria
Analogía de la memoria
Un teatro La memoria
• Una persona desea ingresar a • Una variable desea ingresar a la
un teatro. memoria del computador.

• El acomodador (personal • El sistema operativo busca un


encargado de la ubicación) espacio disponible y ubica a la
busca un espacio disponible y variable en dicho espacio.
ubica a la persona en dicho
espacio.
• En la próxima ejecución, el
Sistema Operativo
• En la próxima función de probablemente ubicará a la
teatro, el acomodador variable en un lugar distinto
probablemente ubicará a la dependiendo de la disponibilidad
persona en un lugar distinto en la memoria.
dependiendo de la
disponibilidad en el teatro.
Asignación en C
Asignación en C
Cuando hacemos una aplicación, declaramos diversas
variables, por ejemplo:
• char x;
• int y;
• float z;

Pero recuerda que….


• Cada variable, según el tipo de dato, ocupa una cantidad
distinta de bytes en memoria
Memoria del computador
Dirección Valor
AB001 Al declarar una variable, el S.O le
AB002 asigna la mejor ubicación posible en
AB003
AB004
memoria
AB005
AB006
AB007 ▫ char xx;
AB008
AB009 ▫ int yy;
AB00A
AB00B ▫ float zz;
AB00C
AB00D
AB00E
AB00F
AB010
AB011
AB012
AB013
AB014
.
.
N
Asignación en C
Dirección Valor
AB001 Luego de declarar las variables,
AB002
AB003
recién podemos asignarle un valor
z
AB004
AB005
AB006
AB007 ▫ x = ‘A
‘A’;
AB008
AB009 ▫ y = 17
17;
AB00A
AB00B ▫ z = 15.8
15.8;
y AB00C
AB00D
AB00E
AB00F
AB010
AB011
AB012
x AB013
AB014
.
.
N
Asignación en C
Dirección Valor En C++,
AB001 • Referenciamos a las variables por su
AB002
AB003
nombre para imprimirlas
z 15.8
AB004
AB005
AB006
•cout<< x;
AB007 •cout<< y;
AB008
AB009 •cout<< z;
AB00A
AB00B
y AB00C • Referenciamos a las variables por su
AB00D 17 nombre cuando vamos a almacenar un
AB00E
AB00F
valor en ellas
AB010
AB011
AB012 •cin>> x;
x AB013 ‘A’ •cin>> y;
AB014
. •cin>> z;
.
N
Asignación en C
• Existen otro tipos de variables a los ya tradicionales

• Estas variables no almacenan un dato char o int o double o


float, almacenan direcciones de memoria

• Las variables que almacenan direcciones de memoria, reciben


el nombre de puntero o variable dinámica.
Punteros
Un puntero es un tipo especial de
variable, que almacena el valor de
una dirección de memoria y es en la
dirección de memoria, donde se
encuentra en dato.
Punteros
Para almacenar una dirección de
memoria, las variables del tipo
puntero, requieren de 2 bytes.
Un puntero se define de la siguiente forma:

Tipo de dato * nombredelpuntero;


Punteros
Ejemplo:
• int * ptrentero;
• char * cadena;
• float * numero;
Imaginemos
que hemos
• int y;
declarado • int * ptrentero;
dos
variables:
Punteros

• Mientras la primera variable


Recuerda y almacena un dato entero la
que…. segunda ptrentero almacena
una dirección de memoria.
Punteros
Dirección Valor
AB001 Al declarar una variable, el S.O le
AB002
AB003
asigna la mejor ubicación posible en
AB004 memoria
AB005
AB006
AB007 int y;
AB008
AB009 int *ptrentero;
AB00A
AB00B
AB00C
AB00D
AB00E
AB00F
AB010
AB011
AB012
AB013
AB014
.
.
N
Punteros
Dirección Valor
AB001 Luego de declarar las variables,
AB002
AB003 recién podemos asignarle un valor
AB004
AB005
AB006 ▫ y = 14
14;
AB007
AB008
AB009
y AB00A
AB00B
AB00C
AB00D Pero….
AB00E
AB00F
Al puntero debemos asignarle una
AB010 dirección de memoria
ptrentero AB011
AB008
AB012
AB013
AB014 ptrentero=&y;
&y
.
.
N
Del ejemplo:
• La variable y ocupa 4 bytes (int) y tiene el valor 14

• La variable ptrentero ocupa 2 bytes (dirección de


memoria) y tiene el valor de AB008

• En la dirección de AB008 se encuentra almacenado un


dato entero cuyo valor es el de la variable y (14)

• Entonces, si se almacena la dirección de memoria,


puedo obtener el dato allí almacenado ?????
SI!
Comando de indirección
Comando de Indirección
Dirección Valor
AB001 A partir de un puntero que almacena
AB002 una dirección de memoria podemos
AB003
AB004
usar el comando de indirección (*):
AB005
AB006
AB007
AB008
* ptrentero
y
AB009
14
AB00A
AB00B
Anteponer * al nombre del puntero
AB00C significa: “El valor apuntado por ”
AB00D
AB00E
AB00F
AB010
ptrentero AB011
AB008
Y cómo funciona????
AB012
AB013
AB014
.
.
N
Comando de Indirección
Dirección Valor
AB001 El comando es utilizado para, a
AB002
AB003
partir, de una dirección de memoria
AB004 obtener el valor allí almacenado .
AB005
AB006
AB007
AB008
Se puede usar para:
y
AB009
AB00A
14 Imprimir el valor:
AB00B
AB00C
AB00D
AB00E
cout<< *ptrentero;
AB00F
AB010
AB011
ptrentero AB012
AB008
AB013
AB014
.
.
N
Comando de Indirección
Dirección Valor
AB001 El comando es utilizado para, a
AB002
AB003
partir, de una dirección de memoria
AB004 obtener el valor allí almacenado .
AB005
AB006
AB007
AB008
Se puede usar para:
y
AB009
AB00A
14 Alterar el Valor :
AB00B
AB00C
AB00D
AB00E
AB00F
AB010
15
AB011
ptrentero AB012
AB008
AB013
AB014 *ptrentero= *ptrentero +1;
.
.
N
Ejercicios
Muestra el uso de direcciones
Ejemplo 1
Escribir un programa en C++ que permita declarar dos variables enteras,
asignarles un valor e imprimir sus direcciones de memoria.

#include <iostream>
using namespace std;
int main()
{
int varA;
int varB;
varA = 90;
varB = 120;
cout<<"varA = " << varA << " y su direccion es: " << &varA << "\n";
cout<<"varB = " << varB << " y su direccion es: " << &varB << "\n";
return 0;
}
Ejemplo 2
Escribir un programa en C++ que permita declarar dos variables enteras,
asignarles un valor e imprimir sus direcciones de memoria. Luego, declarar
un puntero a una de ellas y manipular el dato a través del puntero.

int main()
{
int varA;
int varB;
varA = 90;
varB = 120;
cout<<"varA = " << varA << " y su direccion es: " << &varA << "\n";
cout<<"varB = " << varB << " y su direccion es: " << &varB << "\n";
int *pA = &varA; // declara la variable puntero pA y le asigna un valor
int *pB; // declara la variable puntero pB
pB = &varB; // le asigna un valor
*pB = 45; // modifica el valor apuntado por pB
cout<<"varA = " << *pA << " y su direccion es: " << pA << "\n";
cout<<"varB = " << *pB << " y su direccion es: " << pB << "\n";
return 0;
}
Parámetros de una
función

Muestra el uso de direcciones


Parámetros por valor Se crean copias
resultad de n1 y n2 en a y
n1 n2
o b
20 30 25

int main() a b
{ 20 30
int n1 = 20;
int n2 = 30; int DameSuma(int a, int b)
cout<<n1 << “ ” <<n2; { a = 15; b = 10;
int resultado= DameSuma(n1, n2); int suma = a + b;
return suma;
cout<<n1 << “ ” <<n2; }
cout<<“La suma es “ <<resultado; suma

return 0; 25
}

NOTA: Las variables en el main y los parámetros en DameSuma pueden llamarse


igual, pero son diferentes.
NO se crean copias,
la función opera con
Parámetros por referencia n1 y con n2
directamente:
mediante sus
n1 n2 resultado referencias.
20 30 45

int main() a b
{
int n1 = 20;
int n2 = 30; int DameSuma(int &a, int
cout<<n1 << “ ” <<n2; &b)
int resultado = DameSuma(n1, n2); { a = 25; b = 20;
int suma = a + b;
cout<<n1 << “ ” <<n2; return suma;
cout<<“La suma es ”<<resultado; }
suma
return 0; 45

}
Parámetros por referencia puntero
NO se crean copias, la
función opera con p1
y con p2
p1 p2 resultado directamente:
20 30 13 mediante sus
referencias.
int main()
{ a b
int n1 = 20;
int n2 = 30; int DameSuma(int *a, int
int *p1, *p2; *b)
p1 = &n1; { *a = 5; *b = 8;
p2 = &n2; int suma = *a + *b;
int resultado = DameSuma(p1, p2); return suma;
}
cout<<n1 << “ ” <<n2; suma
cout<<“La suma es ”<<resultado; 13
return 0;
}

También podría gustarte