Punteros y vectores
Supongamos
que tenemos un vector de 6 posiciones. Marcamos el final con un
centinela. Los vectores son espacios continuos en memoria, como ya se
ha visto en otros (multitud) de lenguajes.
El acceso a los elementos de un vector se hace con los corchetes. El primer elemento es el cero.
#include <iostream>
using namespace std;
int main()
{
int v[] = { 45, 23, 22, 12, 11, 10, -1 };
for(int i = 0; v[ i ] != -1; ++i) {
cout << v[ i ] << endl;
}
return 0;
}
Con
un puntero, es posible irse desplazando en memoria de elemento en
elemento, ya que, dependiendo del tipo del puntero, se avanza un número
determinado de bytes. Así, podemos hacer el bucle más eficiente ...
De hecho, podríamos decir que
v[ i ]
es equivalente a:
*( (&v[ 0 ]) + i )
Está claro que acceder a una posición de memoria es más costo que hacer una suma contínuamente:
#include <iostream>
using namespace std;
int main()
{
int v[] = { 45, 23, 22, 12, 11, 10, -1 };
for(int * i = &v[ 0 ]; *i != -1; ++i) {
cout << *i << endl;
}
return 0;
}
Ejercicios
Un planteamiento raro ...
const double PI = 3.1415927;
int main()
{
double * pi = (double *) &PI;
*pi = 356;
return 0;
}
Este código ... ¿qué hace? ... ¿compila? ¿funciona? ¿funciona siempre?