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?