Está en la página 1de 33

PROGRAMACION

III
 Bibliografía

 LUIS MUÑOZ GUERRERO, Programación Funcional


con Racker, Editorial Pereira Risalda, primera edición,
Año 2014.
 LUC GERVAIS C. Aprender la programación
orientada a objetos con el lenguaje C#, Editorial ENI,
Año 2016.
 ERIC GUNNERSON. A programmer’s introduction to
C,Editorial Apress ,año 2000.
 LUIS JOYANES & IGNACIO ZAHONERO. Estructura de
Datos en C, Editorial MacGraw-Hill, año 2007.
 SABERES ESENCIALES

 CONOCER
1.1. Conceptos de la memoria dinámica y punteros
1.2. Ejemplos de uso de memoria dinámica
1.3. Aplicaciones de la memoria dinámica y punteros.

 HACER
Crear programas haciendo uso de la memoria
dinámica y el manejo de punteros
MEMORIA
DINAMICA Y
PUNTEROS
I: Punteros y Manejo de Memoria Dinámica
• Definición de Puntero
Un puntero es un tipo de dato, cuyo contenido es una
dirección de memoria.
I: Punteros y Manejo de Memoria Dinámica
• Definición de Puntero

Los punteros son comunes en los


lenguajes de la familia de C, como C++ o
C# y sirven básicamente para trabajar a
bajo nivel, permitiendo optimizar
algoritmos y evitando en la medida de lo
posible copiar largas estructuras de datos,
agilizando el rendimiento general de la
aplicación.
I: Punteros y Manejo de Memoria Dinámica
• Ejemplo de Puntero

La zona b1 es un puntero, porque lo que almacena (b5), no es


un valor, sino un identificador de otra zona, ósea guarda una
dirección de Memoria.
 La zona b5 almacena el valor 23.
I: Punteros y Manejo de Memoria Dinámica
• Cómo se usa un Puntero

Los punteros se usan ya que permiten realizar operaciones de


manera más eficiente al trabajar con direcciones de memoria.
 Por ejemplo si tuviéramos que intercambiar el valor de dos
cadenas de texto de 200bytes cada una, es mucho más eficiente
cambiar los punteros a cada una de las cadenas (2 bytes, uno
por puntero), que copiar el contenido.
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#

 Los punteros son un tipo especial de variables que tiene


direcciones de memoria como sus valores.
 Por ser una variable, aunque de tipo especial, su declaración
no varía de gran forma con lo estudiado hasta el momento.
Sintaxis:
TipoDato* Puntero;
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
 El tipo de dato de una variable de tipo puntero se corresponde
con el tipo de dato de la variable a la que apunta.
 Los punteros pueden ser inicializados cuando son declarados o
en un enunciado de la asignación.
 Pueden ser inicializados a 0, NULL o a una dirección específica
( cuyo formato se presenta en hexadecimal ); un puntero con un
valor NULL apunta a nada.
 Para declarar un puntero debe utilizarse un tipo de datos:
int *ptrentero;
float *ptrreal;
char *ptrdireccion;
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
 Si se desea declarar varios punteros en una misma línea de
código, C# permite hacerlo de la siguiente manera:
int* p1, p2, p3;
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
 Por tanto, es así como si cada variable estuviera compuesta de
dos partes:
 su valor y
 su dirección de memoria.
Cada celda de memoria se puede considerar de una parte
con el contenido, y la otra parte que se almacena en la
dirección.
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
 Las direcciones se representan normalmente por un número
hexadecimal, pudiendo contener un carácter, un entero o un real
(aunque en realidad todos son almacenados como números
binarios).
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
 Una forma de acceder a la información de una variable es por
medio de una segunda variable que contiene la dirección de la
variable a la que se pretende acceder.
 Este tipo de variable se conoce como apuntador o puntero..
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
Operadores para Punteros
 El operador de dirección (&) es un operador unario que
devuelve la dirección de memoria de su operando.
 El operador de indireccón (*) regresa el valor del objeto hacia el
cual se apunta.

Por ejemplo:
int y = 5;
int* puntero;
puntero = &y

asigna la dirección de la variable “y” a la variable del apuntador


puntero. Entonces, se dice que puntero “apunta” a y.
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
Código Inseguro (Unsafe Code)
Con unsafe code o código inseguro nos referimos a una región
de código en la que está permitida la declaración y operaciones
con punteros.
La palabra clave para marcar un método, miembro o bloque es
unsafe.
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
Código Inseguro (Unsafe Code)
Con unsafe code o código inseguro nos referimos a una región
de código en la que está permitida la declaración y operaciones
con punteros.
La palabra clave para marcar un método, miembro o bloque es
unsafe.
Ejecutar una aplicación en modo inseguro (unsafe)
Dado que los punteros manipulan la memoria de nuestro
computador, para cada aplicación que vayamos a ejecutar
vamos a activar la ejecución en modo inseguro, la cual la
activamos de la siguiente manera:
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
1) Clic en la propiedades del proyecto:
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
2.- En la pestaña Compilación, tickear o chequear la opción
Permitir Código no Seguro.
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
3) Guardamos los cambios y pasemos a nuestro código.
4) Ahora, en vez de utilizar el
static void Main(string[] args)
vamos a utilizar el tipo de método inseguro (recordemos que
estamos trabajando con referencias de memoria):
unsafe static void Main(string[] args).
I: Punteros y Manejo de Memoria Dinámica
• Punteros en C#
A continuación se muestran ejemplos de declaraciones de
tipos de puntero:
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 01
PROGRAMA EN WINDOWS FORMS
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 01
PROGRAMA EN WINDOWS FORMS
amespace Puntero01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

unsafe private void button1_Click(object sender, EventArgs


e)
{
int Numero = (int)Num.Value;
int* PtrNumero = &Numero;

S1.Text = "Valor introducido es: " + Numero;


S2.Text = $"Direccion de Memoria: {(long)PtrNumero:X}";

}
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 01
PROGRAMA EN WINDOWS FORMS
unsafe private void button2_Click(object sender, EventArgs e)
{
char Caracter = 'A';
char* PtrCaracter = &Caracter;

S3.Text = "Valor Guardado: " + Caracter;


S4.Text = $"Direccion de Memoria: {(long)PtrCaracter:X}";

*PtrCaracter = 'Z';
S5.Text = "Valor Guardado: " + Caracter;

unsafe static string ObtRaiz(int* Ptr)


{
return "La raiz cuadrada de " + *Ptr + " es de: " +
Math.Sqrt(*Ptr);
}

unsafe private void button3_Click(object sender, EventArgs e)


{
int Numero = (int)Num.Value;
S6.Text = ObtRaiz(&Numero);

}
}
}
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 02
PROGRAMA EN MODO CONSOLA
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 02 - Modo Consola
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
unsafe static void Raiz(Double* Ptr)
{
Console.WriteLine("\nLa raiz cuadrada de [" + *Ptr + "] es: " + Math.Sqrt(*Ptr));
}
unsafe static void IncrementarPorValor(double n)
{
n = n + 1;
Console.WriteLine("Al aplicar incremento por valor obtenemos: " + n);
}
unsafe static void IncrementarPorReferencia(double* n)
{
*n = *n + 1;
Console.WriteLine("Al aplicar incremento por referencia obtenemos: " + * n);
}
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 02 - Modo Consola
unsafe static void Main(string[] args)
{
int Numero = 10;
int* PtrNum = &Numero;

Console.WriteLine($"Valor de la Variable: {Numero}");


Console.WriteLine($"Direccion de la Variable: {(long)PtrNum:X}");

char Caracter = 'B';


char* PtrCar = &Caracter;
Console.WriteLine($"Valor de la variable Caracter: {Caracter}");
Console.WriteLine($"Direccion de Memoria de Caracter: {(long)PtrCar:X}");

*PtrCar = 'W';
Console.WriteLine($"Valor de la variable Caracter: {Caracter}");
Console.ReadLine();
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 02 - Modo Consola
int y = 5;
int* puntero;
puntero = &y;

Console.WriteLine($"Valor de Y: {y}");
Console.WriteLine($"Direccion de Memoria de Y: {(long)puntero:X}");
Console.WriteLine("El valor de la variable donde apunta el puntero:"+*puntero);
Console.WriteLine($"Direccion de Memoria de Y: {(long)puntero:X}");
Console.WriteLine($"Direccion : {(long)&y:X}");
Console.ReadLine();

Double Num;
Console.WriteLine("Escribir un numero para extraer la raiz cuadrada: ");
Num = Double.Parse(Console.ReadLine());
Raiz(&Num);
Console.ReadLine();

Console.WriteLine("INCREMENTANDO");
IncrementarPorValor(Num);
IncrementarPorReferencia(&Num);
Console.ReadLine(); }
}
}
I: Punteros y Manejo de Memoria Dinámica
• C# - Programa 02 - Modo Consola
UNIDAD I: FUNDAMENTOS TEORICOS de BD
• Resumen y Dudas

 CONOCER
1.1. Conceptos de la memoria dinámica y punteros
1.2. Ejemplos de uso de memoria dinámica
1.3. Aplicaciones de la memoria dinámica y punteros.

 HACER
Crear programas haciendo uso de la memoria
dinámica y el manejo de punteros
UNIDAD I: FUNDAMENTOS TEORICOS de BD
• Criterio 01 – Actividad 01

 HACER
Crear programas haciendo uso de la memoria dinámica y el manejo de
punteros:
Desarrollar un programa para realizar
UNIDAD I: FUNDAMENTOS TEORICOS de BD
• Próxima Clase

II. Sobrecarga de funciones


UNIDAD I: FUNDAMENTOS TEORICOS de BD
• Asistencia

También podría gustarte