Ir al contenido

Introducción a Patrones de Diseño en C++ con Qt4/1.16.1 Los operadores unarios & y *

De Wikilibros, la colección de libros de texto de contenido libre.
Versión para imprimir esta pagina

1.16.1. Los operadores unarios & y *

[editar]

Una variable es un objeto con un nombre reconocido por el compilador. Un nombre de variable puede ser usado si este es el objeto en sí mismo. Por ejemplo, si decimos:


   int  x  =  5;


Podemos usar x para mantener el objeto integer cuyo valor es 5, y podemos manipular el objeto integer directamente a través del nombre x. Por ejemplo:


++x ;  // el símbolo x ahora se refiere a un entero con valor 6;


Un objeto (en el sentido más general) es un pedazo de memoria, el cual puede almacenar datos. Cada objeto tiene una dirección de memoria (donde los datos comienzan). El operador unario &, también conocido como el operador dirección-de, cuando es aplicado a cualquier objeto, retorna la dirección de memoria de ese objeto. Por ejemplo: &x devuelve la dirección de memoria de x.


Un objeto que almacena la dirección de memoria de otro objeto es llamado puntero. Decimos que el puntero apunta al objeto que almacenó la dirección de memoria.


  int*  y  =  &x ;


En este ejemplo, y apunta al entero x. El asterisco (*) que le sigue a int indica que y es un puntero a int.


Aquí hemos inicializado el puntero int y a la dirección de la variable int x. Una de las características más poderosas de los punteros es esa, se sujetan a las reglas que exploraremos en breve, aquí es posible para un puntero de un tipo almacenar la dirección de un objeto de tipo diferente (pero relacionado).


Cero (0), también representado por la macro NULL en programas C, es un valor especial que puede ser asignado legalmente a un puntero, usualmente cuando este comienza a ser inicializado (o reinicializado). 0 no es la dirección de ningún objeto. Un puntero que almacena el valor 0 es llamado puntero nulo. often represented by the macro NULL in C programs, is a special value that can be legally assigned to a pointer, usually when it is being initialized (or re-initialized). 0 is not the address of any object. A pointer that stores the value 0 is called a null pointer. Stroustrup recomienda el uso de 0 más que el de la macro NULL en programas C++.


Un puntero a un tipo simple usa exáctamente la misma cantidad de memoria que el puntero a un gran objeto complicado. Esta medida es usualmente la misma que sizeof(int) en esa máquina.


El operador unario *, también conocido como el operador desreferenciado, cuando se aplica a un operador no-nulo. devuelve el objeto que la dirección almacenó por el puntero.

Nota:
El símbolo * es usado en dos formas diferentes en una conexión con punteros:
  • Puede servir como un tipo de modificador, en un puntero de definición variable
  • puede ser usado como el operador de desreferencia.



Nota:
Desreferenciar un puntero nulo o no inicializado causa un error en tiempo de ejecución, usualmente un fallo de segmentación o, en windows, un fallo de protección general (GPF). Es responsabilidad del programador asegurarse de que no se intenta hacer referencia a un puntero nulo o no inicializado. Discutiremos técnicas para asegurarnos de que esos errores sean evitados


Ejemplo 1.23

[editar]
Ejemplo: Ejemplo 1.23. src/pointers/pointerdemo.cpp

int* px = 0 ; Modificador de tipo

<< " *px = " << *px Operador de desreferenciación unario

Nombre de Archivo pointerdemo.cpp

#include <iostream>
using namespace std;

int main() {
   int x = 4;
   int* px = 0 ;
   px = &x;
   cout << "x = " << x
        << " *px = " << *px 
        << " px = " << px
        << " &px = " << &px << endl;
   x = x + 1;
   cout << "x = " << x
        << " *px = " << *px
        << " px = " << px << endl;
   *px = *px + 1;
   cout << "x = " << x
        << " *px = " << *px
        << " px = " << px << endl;
   return EXIT_SUCCESS;
}

Salida:

OOP> ./a.out 
 x = 4 *px = 4 px = 0xbffff514  &px = 0xbffff510
 x = 5 *px = 5 px = 0xbffff514 
 x = 6 *px = 6 px = 0xbffff514 OOP>


Cuando corremos el Ejemplo 1.23 en momentos diferentes, o en diferentes máquinas, los valores particulares pueden variar.

La variable x accede a sus datos directamente, pero la variable px accede al mismo dato indirectamente. Esto es porque la palabra indirigida es también usada para caracterizar el proceso de acceso a datos a través de un puntero. La relación entre las dos variables, x y px es ilustrada en la Figura 1.4.

Figura 1.4

[editar]
Demostración de Puntero
Demostración de Puntero

Versión para imprimir esta pagina