Вы находитесь на странице: 1из 34

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE INGENIERÍA DE SISTEMAS


E INFORMÁTICA,

Escuela Académico Profesional de Ingeniería de


Software

Estructura de Datos 1
Punteros

Hugo David Calderon Vilca


Punteros y memoria dinámica

Objetivos

• 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 AB001

variables que declaramos en AB002

nuestros programas. AB003

• La memoria está formada AB004

por un conjunto de celdas AB005

continuas cada una de 1 byte AB006

de tamaño. Estas celdas AB007

están enumeradas de forma


consecutiva de tal forma que N-1
cada celda tiene el mismo
N
número que la anterior más
1.
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)
Memoria del computador

• La ubicación de las variables dentro de la memoria es


aleatoria y se calcula cada vez que se ejecuta el
programa por lo que no podemos saber 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
AB003 programa
AB004

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

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
un teatro. la 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 • En la próxima ejecución, el
espacio. 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
persona en un lugar distinto disponibilidad 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
AB002 S.O le asigna la mejor
AB003
AB004
ubicación posible en memoria
AB005
AB006
AB007
AB008
▫ char x;
AB009
AB00A
▫ int y;
AB00B
AB00C ▫ float z;
AB00D
AB00E
AB00F
AB010
AB011
AB012
AB013
AB014
.
.
N
Asignación en C++
Dirección Valor
AB001
Luego de declarar las
AB002 variables, recién podemos
z AB003
AB004
asignarle un valor
AB005
AB006
AB007 ▫ x = ‘A’;
AB008
AB009 ▫ y = 17;
AB00A
AB00B ▫ z = 15.8;
y AB00C
AB00D
AB00E
AB00F
AB010
AB011
AB012
x AB013
AB014
.
.
N
Asignación en C++
Dirección Valor • Referenciamos a las
AB001
AB002 variables por su nombre
z AB003
AB004 15.8 para imprimirlas
AB005
AB006 •cout<< x;
AB007
AB008 •cout<< y;
AB009
AB00A •cout<< z;
AB00B
y AB00C
AB00D 17 • Referenciamos a las
AB00E variables por su nombre
AB00F
AB010 cuando vamos a almacenar
AB011
AB012 un valor en ellas
x AB013 ‘A’
AB014 •cin>> x;
.
.
N
•cin>> y;
•cin>> z;
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
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.

• Para almacenar una dirección de memoria, las


variables del tipo puntero, requieren de 2 bytes.
Punteros

• Un puntero se define de la siguiente forma


Tipo de dato * nombredelpuntero;
Ejemplo:
•int * ptrentero;
•char * cadena;
•float * numero;
Punteros
• Imaginemos que hemos declarado dos variables:
• int y;
• int * ptrentero;
• Recuerda que….
• Mientras la primera variable y almacena un
dato entero la segunda ptrentero almacena
una dirección de memoria.
Punteros
Dirección Valor
AB001 Al declarar una variable, el S.O
AB002
AB003
le asigna la mejor ubicación
AB004 posible en 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
AB004 valor
AB005
AB006
AB007
y = 14;
AB008
AB009 14
y AB00A
AB00B
AB00C
AB00D Pero….
AB00E
AB00F
Al puntero debemos asignarle
AB010 una 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
AB00A
14 Anteponer * al nombre del puntero
AB00B
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 El comando es utilizado para, a
AB001 partir, de una dirección de memoria
AB002 obtener el valor allí almacenado .
AB003
AB004
AB005
AB006 Se puede usar para:
AB007
AB008 Imprimir el valor:
AB009
y AB00A
14
AB00B
AB00C cout<< *ptrentero;
AB00D
AB00E
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
Ejemplo 1

Escribir un programa que permita declarar dos variables


enteras, asignarles un valor e imprimir sus direcciones de
memoria.

#include <iostream>
#include <conio.h>
using namespace std;
void 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";
getch();
}
Ejemplo 2

Escribir un programa 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.

void 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";
getch();
}
Parámetros de una función
Parámetros por valor
Se crean copias de
n1 n2 resultado n1 y n2 en a y b

20 30 50

a b
void main()
{ 20 30
int n1 = 20;
int DameSuma(int a, int b)
int n2 = 30;
{
int suma = a + b;
int resultado= DameSuma(n1, n2);
return suma;
}
cout<<“La suma es “ <<resultado; sum
a
_getch(); 50
}

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


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

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

void main()
{ a b
int n1 = 20;
int n2 = 30;
int *p1, *p2; int DameSuma(int *a, int *b)
p1 = &n1; {
int suma = *a + *b;
p2 = &n2;
return suma;
int resultado = DameSuma(p1, p2);
}
cout<<“La suma es ”<<resultado; suma
50
_getch();

}
FIN

Вам также может понравиться