Introducción a Patrones de Diseño en C++ con Qt4/1.16.1 Los operadores unarios & y *
1.16.1. Los operadores unarios & y *
editarUna 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.
- Puede servir como un tipo de modificador, en un puntero de definición variable
- puede ser usado como el operador de desreferencia.
Ejemplo 1.23
editarint* px = 0 ; Modificador de tipo
<< " *px = " << *px Operador de desreferenciación unarioNombre 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.