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.
[1] Comprobación "estática" significa que se realiza en tiempo de compilación.