La aritmética de punteros se limita a suma,
resta, comparación y asignación. Las operaciones aritméticas en los punteros de
tipoX (punteros-a-tipoX) tienen automáticamente en cuenta el tamaño real de
tipoX. Es decir, el número de bytes necesario para almacenar un objeto tipoX
[2]. Por ejemplo, suponiendo una matriz de double con 100 elementos, si ptr es
un puntero a dicha matriz, la sentencia ptr++; supone incrementar el Rvalue de
ptr en 6.400 bits, porque el tamaño de la matriz es precisamente 100x64 bits.
Nota:
no confundir el puntero-a-matriz con un puntero a su primer elemento (que aquí
sería puntero-a-double).
La aritmética realizada internamente en los
punteros depende del modelo de memoria en uso y de la presencia de cualquier
modificador superpuesto.
Las operaciones que implican dos punteros
exigen que sean del mismo tipo o se realice previamente un modelado
apropiado .
Sean ptr1, ptr2 punteros a
objetos del mismo tipo, y n un tipo entero o una enumeración; las
operaciones permitidas y los resultados obtenidos con ellas son:
La comparación de punteros solo tiene sentido
entre punteros a elementos de la misma matriz; en estas condiciones los
operadores relacionales ( 4.9.12): ==,
!=, <, >, <=, >=,
funcionan correctamente.
Cuando se crea un arreglo unidimensional o de
'n' dimensiones, todos los elementos de dicho arreglo se acomodan en la memoria
de manera adjunta o lineal, es decir, se puede desplazar por el arreglo
moviéndonos de una dirección de memoria a otra con un apuntador, y simplemente
sumando o restando unidades al apuntador se logra que dicho apuntador pueda
recorrer el arreglo.
En la siguiente imagen se puede ver como se
almacena un arreglo y como apuntar a él:
Como se puede observar todos los elementos del
arreglo están adjuntos entre ellos, si el arreglo fuera bi-dimensional sería lo
mismo.
No hay comentarios:
Publicar un comentario