Guia#10: Tema: “Aritmética de Punteros en C#”.

Anuncio
Facultad: Ingeniería
Escuela: Ingeniería en Computación
Asignatura: Programación I
Guia#10: Tema: “Aritmética de Punteros en C#”.
Objetivos
 Conocer los conceptos de aritmética de punteros y punteros a funciones.
 Desarrollar aplicaciones que utilicen aritmética de punteros.
 Desarrollar aplicaciones que utilicen punteros a funciones.
Introducción
Los punteros se suelne utilizar para recorrer tablas de elementos sin necesidad de tener que comprobarse
que el indice al que se accede en cada momento se encuentra dentro de los limites de la tabla. Por ello, los
operadores aritmeticos definidos para los punteros estan orientados a facilitar este tipo de recorridos.
Hay que tenr en cuenta que todos los operadores aritmeticos aplicables a punteros dependen del tamaño del
tipo de dato apuntado, por lo que no son aplicables a punteros void, ya que estos no almacenan informacion
sobre dicho tipo. Estos operadores son ++ y --.
Existe una cierta aritmética que es aplicable a los punteros y que difiere a la aritmética vista para los
enteros y reales.
Las operaciones aritméticas admisibles para los punteros, son:
 Sumarle o restarle un entero, obteniendo como resultado un puntero del mismo tipo.
 Restar dos punteros, obteniendo como resultado un entero.
Operaciones entre punteros y enteros.
La diferencia de la aritmética de punteros con respecto a la vista anteriormente es que los punteros se
incrementan y decrementan en función del tipo de dato al que apuntan. La idea consiste en que si se le suma
1 a un puntero, el valor del puntero apuntaría al siguiente elemento en la memoria.
Material y Equipo



Guía de laboratorio No. 11.
Computadora con Visual Studio 2013 o superior.
Dispositivo de almacenamiento (USB).
Procedimiento
G10_Ejemplo_1
Comprobación de la aritmética de punteros:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guia10_Ejemplo1
{
class Program
{
unsafe static void Main(string[] args)
{
Console.Title = "Programa de puntero en un vector";
int[] Array = new int[] { 1, 2, 3, 4, 5, 6 };
fixed(int *Ptr = &Array[0])
{
Console.WriteLine("Valor inicial del puntero es: " + (int)*Ptr);
//Desplazamos el puntero en 2 casillas de memoria
*Ptr = *Ptr + 2;
Console.WriteLine("Puntero desplazado en dos casilla es: " + (int)*Ptr);
*Ptr = *Ptr - 2;
Console.WriteLine("Puntero regresado a la primer casilla es: " + (int)*Ptr);
*Ptr = *Ptr + 1;
Console.WriteLine("Puntero desplazado en una casilla es: " + (int)*Ptr);
}
Console.ReadKey();
}
}
}
G10_Ejemplo_2
En este ejemplo veremos la relación que hay entre arreglos y punteros:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Guia10_Ejemplo2
{
class Program
{
unsafe static void Main(string[] args)
{
Console.Title = "Segundo ejemplo de punteros con un vector con letras";
int contador = 0;
int entero = 5;
int *puntero;
puntero = &entero;
int temporal = *puntero;
*puntero = 3;
Console.WriteLine("El valor de [puntero] es: " + *puntero);
Console.WriteLine("El valor de la variable [entero] es: " + entero);
char[] texto = new char[] {'H', 'o','l','a' };
fixed (char* cadena = &texto[0])
{
for (int j = 0; j < 4; j++)
{
if (cadena[j] == 'o')
{
contador = contador + 1;
}
}
Console.WriteLine("\nEl primer caracter de la cadena es: " + cadena[0]);
Console.WriteLine("La cadena tiene [" + contador + "] letras o");
}
Console.ReadKey();
}
}
37
}
Analisis de Resultados
Explicar el código del ejemplo 2, haciendo énfasis en la instrucción fixed.
Investigacion Complementaria
Investigar sobre el uso de estructuras en C#.
Bibliografia
Deitel, Harvey M. y Paul J. Deitel, Cómo Programar en C#, Segunda Edición, México, 2007.
.
Descargar