Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


Tipos de punteros: razones para su existencia


§1 
Como se ha indicado en la página precedente ( 4.2.1a), cada puntero es declarado como apuntando a un tipo particular, lo que origina que existan tantas clases de punteros como tipos de objetos. Puesto que los punteros contienen direcciones de memoria, podría parecer que todos deberían ser del mismo tipo, ya que todos almacenan el mismo tipo de dato (una dirección), por lo que asignarles tipos distintos sería una complicación innecesaria de lenguaje.

§2  Razones para la diferencia

En principio esto es cierto desde luego, pero existen dos razones para esta diferenciación: una es de seguridad; la otra de aritmética. A continuación las comentaremos brevemente.

§2.1  En primer lugar recordemos que uno de los mecanismos de seguridad de C++ es precisamente la identificación estática de tipos ( 2.1). Si todos los punteros fuesen del mismo tipo no podrían realizarse estas comprobaciones [1].

Considere el siguiente ejemplo:

char ch = 'X'                 // un carácter

wchar_t  wcaracter = L'X';    // un carácter ancho

...

char* ptr1 = &ch;             // sendos punteros a ambos objetos

wchar_t* ptr2 = &wcaracter;

...

*ptr1 = *ptr2;                // asignación erronea!!

En estas condiciones, si ptr1 y ptr2 fuesen del mismo tipo, el compilador no podría comprobar que los objetos señalados son distintos y por tanto la asignación errónea.

§2.2  La segunda razón hay que buscarla en la aritmética de punteros. En efecto, aunque esquelética, la aritmética de punteros permite ciertas operaciones, entre ellas la suma con enteros. En el apartado correspondiente ( 4.2.2) se ve como la suma de un puntero X* con un entero n produce otro puntero (del mismo tipo), desplazado del anterior el espacio correspondiente a n objetos tipoX, es decir, el desplazamiento es n * Tamaño-de-X, lo que puede expresarse mediante: n * sizeof(tipoX).

Para que las operaciones con punteros puedan realizarse correctamente, es necesario que el compilador conozca el tamaño del objeto que será señalado. Esto se consigue precisamente por el "tipo" del puntero involucrado en la operación.

  Inicio.


[1]  Comprobación "estática" significa que se realiza en tiempo de compilación.