miércoles, 20 de febrero de 2013

[Lectura] Apuntadores y Cadenas -parte 01-

Apuntadores y Cadenas

Operadores para apuntadores.

El operador dirección (&) es un operador unario que devuelve la dirección de memoria de su operando. Por ejemplo, suponga las siguientes declaraciones:

int y = 5;
int *ptrY;

la instrucción:

prtY = &y;

asigna la dirección de la variable "y" a la variable de apuntador ptrY. Entonces, se dice que ptrY "apunta" a "y". 

Ahora, ptrY hace referencia de manera indirecta al valor de la variable y. Observe que el & de la instrucción de asignación anterior no es el mismo que el &  de una declaración de variable de apuntador, el cual siempre es precedido por el nombre del tipo de dato.

ptrY [ . ]    y  [ 5 ]

El operador *, por lo general denominado operador de indirección u operador de desreferencia, devuelve un sinónimo (es decir, un alias o nombre clave) para el objeto al cual apunta el operando de su apuntador.

cout << *ptrY << end1;

imprime el valor de la variable y, es decir, 5, tal como lo haría la instrucción:

cout << y << end1;

a utilizar el * de esta manera se le llama desreferencia de un apuntador. Observe que un apuntador desreferenciado podria utilizarse tambien del lado izquierdo de una instrucción de asignación, como: 

*ptrY = 9;

el cual significa 9 a y.  El apuntador desreferenciado se podría utilizar también para recibir un valor de entrada como en:

cin >> *ptrY;

El apuntador desreferenciado es un lvalue.

- - - - - - - - - - - - - - - - - - - - -
// uso de los operadores & y *
#include <iostream>

using std::cout;
using std::end1;

int main ( )
{
    int a;                      //a es un entero
    int *ptrA;              //ptrA es un apuntador a un entero

    a = 7;
    ptrA = &a;              //a ptrA se le asigna la dirección de a

    cout << "La dirección de a es " << &a;
    << "\n El valor de ptrA es " << ptrA;

   cout << "\n\n El valor de a es " << a
   << "\n El valor de *ptrA es " << *ptrA;

   cout << "\n \n Muestra de que * y & son inversos "
   << "uno de otro. \n&*ptrA = " << &*ptrA
   << "\n*&ptrA = " << *&ptrA << end1;

   return 0;      //indica terminación exitosa
}   //fin de main

La dirección de a es 006AFDF4
El vaor de ptrA es 006AFDF4
El valor de a es 7
El valor de *ptrA es 7
Muestra de que * y & son inverso uno de otro.
&*ptrA = 006AFDF4
*&ptrA = 006AFDF4
- - - - - - - - - - - - - - - - - - - - -
Observe que en la salida, la dirección de a y el valor de ptrA son idénticos, con lo que se confirma que la dirección de a se asigna a la variable de apuntador ptrA. Los operadores & y * son inversos entre sí; cuando ambos se aplican de manera consecutiva a ptrA, en cualquier orden, se obtiene el mismo resultado.  

Apuntes:
El formato en el que aparece un apuntador depende de la máquina. Algunos sistemas muestran los valores de los apuntadores como enteros hexadecimales, mientras que otros utilizan enteros decimales.

Malo:
Desreferenciar un apuntador que no se ha inicializado de manera apropiada o que no ha sido asignado de manera que apunte a una localidad especifica de memoria podria ocasionar un error fatal en tiempo de ejecución, o podria modificar de manera accidental datos importantes y permitir que el programa se ejecute por completo, posiblemente con resultados incorrectos.

Intentar desreferenciar una variable que no es un apuntador, es un error de sintaxis.

Desreferenciar un apuntador  a 0, por lo general es un error fatal en tiempo de ejecución.

-Lecturas tomadas del libro Como Programar de Pearson Prentice Hall, Deitel Deitel-

No hay comentarios :

Publicar un comentario