Vectores y punteros

Los vectores y punteros en C tienen una relación muy estrecha. A todos los efectos, las únicas diferencias importantes en el uso de un puntero y un vector están en que el vector (su nombre sin índice) es constante y el puntero es variable y que el vector implica la reserva de memoria y los punteros requieren que el programador haga que apunten a una zona de memoria apropiada.

Los punteros soportan operaciones que podemos utilizar en conjunción con vectores:

Operador utilizado Nombre y descripción de la operación Ejemplos para las siguientes variables
 int i, *p, *q, v[10];
+, - Suma o resta de un entero a un puntero. Se aplica a punteros que apuntan a un vector. Si el original apunta al elemento i devuelve un puntero que apunta al elemento i+entero ó i-entero del vector.
p=v;
q=p+3;
/*se asigna a q la posición v[3]*/
...
q=q-2;
/*se asigna a q la posición v[1]*/
++, -- Incrementar o decrementar un puntero es análogo a sumarle o restarle 1.
p=v;
q=p++;
/*se asigna a q, p, y p se incrementa*/
...
q--;
==, !=, <, >, <=, >= La comparación entre punteros da verdadero o falso en el sentido de C. Las comparaciones más usadas son la igualdad y desigualdad.
p=v;
q=p+3;
...
while(p< q)  /* se itera si p<q */
   ...
- Resta de punteros. Da como resultado un entero que indica el número de elementos que los separa. Es la operación contraria a la suma o resta de un entero.
int i;
p=v;
q=p+3;
i=q-p; /* i debe valer 3*/

Partiendo de la siguientes definiciones e inicialización:

int a[10], *v;
v=a;

se tiene el siguiente conjunto de expresiones equivalentes

*a <=> *v <=> a[0] <=> v[0] <=> *(a+0) <=> *(v+0)
a[3] <=> v[3] <=> *(a+3) <=> *(v+3)
Representación en memoria

Ejemplo

El procedimiento cambiaIndicesImpares modifica los elementos que ocupan posiciones impares en el vector con un valor pasado como tercer parámetro.

#include <stdio.h>
#include <stdlib.h>
void cambiaIndicesImpares(int *v, int n, int e){
   int *p; 
   for(p=v+1;p-v<n;p+=2)
      *p=e;
}
int main(){
   int *p, n;
   printf("Introduzca el tamaño del vector\n");
   scanf("%d",&n);
   /* Se reserva memoria dinámica para n enteros (ver sizeof) */
   int *v = (int *) malloc(sizeof(int)*n); 
   for(p=v;p<&v[n];p++) {
      printf("Introduzca un elemento del vector");
      scanf("%d",p);
   }
   cambiaIndicesImpares(v,n,-1);
   free(v);                 /* Se libera la memoria dinámica previamente reservada */
   return 0;
}