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)
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; }