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. .