Punteros o Apuntadores

7
punteros o Apuntadores: !s una variable que referencia una región de memoria en otras palabras es una variable cuyo valor es una dirección de memoria. si se tiene una variable F p F de tipo puntero que contiene una dirección de memoria en la que se encuentra almacenado un valor F v F se dice que F p F apunta a F v F. trabajar con punteros implica la no manipulación de las variables en si, sino manejar direcciones de memoria en la cuales residen los datos. Declaración de punteros: La declaración de punteros utiliza un asterisco )G*, que en este caso act5a comocalificador de tipo, en una sinta8is muy parecida a la utilizada en la declaración de objetos normales peligro en la declaración de punteros: Aunque las declaraciones múltiples (en la misma sentencia) son aceptables en C++,con los punteros deben evitarse, porque es más que probable que el compilador intérprete erróneamente las declaraciones sucesivas. ejemplo: int* ptr1 ,ptr2;// posible error!! en estos casos es mejor hacer: int * ptr1; int * ptr2; inicialización de punteros: Un puntero, como cualquier variable u objeto, además de ser declar ado (para comenzar a existir) necesita ser inicializado (darle un valor de modo controlado), lo cual se realiza mediante el operador de asignación (‘=’). desde que el puntero es declarado almacena un valor, el problema es que se trata de un valor aleatorio, intentar

description

algoritmos

Transcript of Punteros o Apuntadores

punteros o Apuntadores:!s una variable que referencia una regin de memoria en otras palabras es una variable cuyo valor es una direccin de memoria. si se tiene una variable Fp F de tipo puntero que contiene una direccin de memoria en la quese encuentra almacenado un valor F v F se dice que Fp F apunta a F v F.trabajarconpunterosimplicalanomanipulacindelasvariablesensi,sino manejar direcciones de memoria en lacuales residen los datos.Declaracin de punteros:La declaracin de punteros utiliza un asterisco )G*, que en este caso act5a comocalificadorde tipo,en unasinta8is muyparecida ala utilizada en ladeclaracin de objetos normalespeligro en la declaracin de punteros:Aunque las declaraciones mltiples (en la misma sentencia) son aceptables en C++,con los punteros deben evitarse, porque es ms que probable que el compiladorintrprete errneamente lasdeclaraciones sucesivas.ejemplo:int*ptr1,ptr2;//posibleerror!!en estos casos es mejor hacer:int * ptr1;int * ptr2;inicializacin de punteros:Unpuntero,comocualquiervariableuobjeto,ademsdeserdeclarado(para comenzar a existir) necesita ser inicializado (darle un valor de modo controlado), lo cual se realiza mediante el operador de asignacin (=). desde que el puntero es declarado almacena un valor, el problema es que se trata de un valor aleatorio, intentar operar con un puntero sin haberlo inicializado es una frecuente causa de problemas.Opciones de inicializacin:Un puntero puede ser inicializado con la direccin de memoria de un objeto, tal objeto debe pertenecer a un tipo acorde al tipo al que apunta el puntero. Puede tratarse dela direccinde unelemento deun array ode unavariable individual, el operador & antepuesto a un objeto nos devuelve su direccin de memoria. Tambin puede utilizarse un literal, ya sea numrico, de carcter, o de otro tipo, y puede inicializarse como puntero nulo, en este caso est permitido usar el 0, el nico entero permitido, por su equivalencia con el valor NULL.

sobre este cuadro cabenlas siguientes aclaraciones:1. inicializar un puntero apuntando al primer elemento de un array admite dos notaciones equivalentes, en la segunda se sobreentiende que el elemento apuntado es el primer elemento del array.2. La equivalencia entre el valor 0 (cero) y NULL es de uso general, sin embargo existen compiladores que dan a NULL un valor diferente a cero.3. Un 'literal' debe ser el apropiado para el tipo de puntero inicializado. si es un puntero a char, una cadena de caracteres cualquiera (ejm:"hola") ser un literal adecuado, si se trata de tipo numrico, para un int "4" ser apropiado.si tomamos como ejemplo el tipo "char", siguiendo al cuadro anterior, tenemos las siguientes opciones de inicializacin

se ha insistido lo suficiente en que un puntero almacena como valor una direccin de memoria, por eso la presencia de un 'literal', en esta ultima tabla el literal de cadena "casa", puede sorprender. Es importante tener claro que todos los literales se almacenan desde el comienzo del programa en un lugar del segmento de datos, no es posible obtener su direccin (por medios normales) pero existe, es al comienzo de dicho segmento, el mismo sitio que se reserva a valores constantes y variables globales.Un literal es tratado como constante, esto es lo que permite que una funcin pueda retornar una constante sin temor a que dicho almacenamiento se pierda al salir de la funcin, un literal no es una variable 'local'. No hay obstculos para inicializar un puntero con una variable constante, por lo tanto lo mismo se aplica a literales de cualquier tipo.Las tablas anteriores no abarcan todos los casos posibles de inicializacin de punteros, aun no se han mencionado los casos donde el puntero apunta a una funcin o un objeto miembro de una clase, ni la opcin de inicializar a travs de memoria dinmica.INICIALIZACION ATRAVEZ DE MEMORIA DINAMICA:esta modalidad se diferencia de todas las enumeradas hasta ahora y puede considerarse como la principal. todas las formas vistas hasta aqui asignan al puntero la direccin de memoria de otra entidad (elemento, array, puntero, literal)adems del caso especial del valor NULL. ya se ha mencionado que la declaracin de un puntero no implica la reserva de memoria, salvo 2 bytes para almacenar una direccin, por esa razn podra decirse que el puntero, cuando es inicializado por otro elemento, 'vive' de la memoria que le aporta el objeto al que apunta.La reserva de memoria dinmica requiere el uso obligado de un puntero, el cual apuntara al comienzo de la zona reservada. Lo diferente aqu es que se trata del nico caso donde el puntero no necesita de otro elemento que le aporte memoria necesaria, no necesita apuntar a algn otro objeto. Cuando reservamos dinmicamente 40 bytes para un puntero a car, operaremos con el puntero 'como si' apuntara a un segundo objeto (un array de caracteres), pero tal array no existe. A pesar de no existir propiamente un segundo objeto, sigue siendo esencial, el tipo(type) segn el cual se declara el puntero, pues esto determina el modo en que el puntero nos permitir acceder a tal zona de memoria. No hay un 'objeto apuntado', pero el puntero se conduce igual que si lo hubiera, por esa razn hablaremos en general del 'objeto apuntado' por el puntero, sin aclarar el caso especial que estamos considerando.En C++ la reserva y liberacin de memoria dinmica se realiza atravez de los operadores new y delete, y su sintaxis, para un puntero de nombre ptr es la siguiente:

A travs del operador new solicitamos una cierta cantidad de memoria dinmica, es posible que no exista suficiente memoria disponible, en tal caso el operador nos devolver un puntero NULL (o apuntando a 0), y es por esta razn que luego de una solicitud es recomendable inspeccionar si el puntero devuelto es nulo. Esta seria la respuesta 'clsica' a una reserva fallida de memoria dinmica, sin embargo existen diferentes compiladores que, ajustndose al standard C++ no devuelven un puntero nulo sino que lanzan una excepcin (badPalloc).Asignacin de punteros. Respecto a la comparacin y a la asignacin, los punteros se ajustan a las mismas reglas que cualquier otra variable en C: Un puntero puede utilizarse a la derecha de una declaracin de asignacin para asignar su valor a otro puntero. Podemos comparar dos punteros en una expresin relacional.

A un puntero se le puede asignar: El valor de otro puntero, del mismo tipo. La direccin de memoria de una variable cuyo tipo coincida en el tipo_base del puntero. Ejemplo: int x=15, *p1=NULL, *p2=NULL; p1 = &x; // Se le asigna la direccin de memoria de x p2 = p1; // Se le asigna el valor de p1Los dos apuntan a la misma variablePUNTERO A PUNTERO:EJemplo:

int V= 10;int *p1;int **p2; //puntero a puntero

p1 = &V;p2 = &p1;

*p2 = 20; // el valor de V ahora es 20

PUNYTERO VOIDUn puntero puede apuntar a un objeto de cualquier tipo, predefinido por el lenguaje o definido por el usuario. 'void' es el nombre de un tipo, pero su uso est sujeto a mayores restricciones respecto a otros tipos. El significado en C++ de un puntero 'void' es el de un puntero que apunta a una zona de memoria no inicializada, memoria 'en bruto', o en la cual se encuentra almacenado un objeto de tipo desconocido, en general se trata de cdigo que trabaja a nivel hardware o relacionado con administracin de memoria. Las operaciones permitidas y no permitidas, en C++, para un puntero a void se resumen en el siguiente cuadro:

PUNTERO A CONSTANTEC++ permite definir un puntero a una constante, de forma que el valor al que el puntero apunta no pueda ser cambiado, pero el puntero en s puede cambiar para apuntar a otra variable o constante: const int l = 2; const int *p= &l;PUNTERO CONSTANTE

p es un puntero a un entero, declarado como constante. El entero al que apunta p no debe ser cambiado. El puntero p en s puede modificarse. As,*p = 3no es vlido, perop++s lo es.Adems, se puede declarar un puntero constante, que no puede ser cambiado:En la declaracin:int *const p;p es un puntero constante que no puede ser cambiado. El carcter al que apunta sin embargo s puede modificarse.Por ltimo : const int m = 3; const int *const p = &m;indica que ni el puntero p ni el carcter al que apunta pueden ser modificados.Estas construcciones pueden utilizarse para mejorar la calidad del cdigo. Si un puntero o una variable no sern nunca cambiados deben declararse como constantes. El compilador indicar si inadvertidamente se han modificado estos valores.