Punteros a punteros en C

davidpoza

Buenas noches,
me preguntaba por qué mi el compilador gcc me suelta un warning en el siguiente código, que aparentemente funciona.

código:
#include <stdio.h>
/usamos dobles punteros porque queremos cambiar los punteros, no los valores./
intercambioVec(int *vec1[], int *vec2[], int dim)
{
int i; int *aux;
for (i=0; i<dim; i++)
{
aux=vec1;
vec1=vec2;
vec2=aux;
}
}
imprimirVector(int vec[], int dim)
{
int i;
for (i=0; i<dim; i++)
{
printf("%d ", vec);
}
printf("\n");
}
int main()
{
int vec1[2], vec2[2];
vec1[0]=1;
vec1[1]=2;
vec2[0]=3;
vec2[1]=4;
intercambioVec(&vec1,&vec2,2); //warning aqui
imprimirVector(vec1, 2);
imprimirVector(vec2, 2);
return 0;

}


Lo que pretendo en este programilla es hacer una función que intercambie los elementos de dos vectores simplemente camabiando sus punteros, por lo tanto, para modificar un puntero en la función, paso un puntero al puntero en cuestión.

No estoy del todo seguro de que lo este haciendo correctamente.


El warnings:
prueba.c:30: aviso: se pasa el argumento 1 de 'intercambiarVec' desde un puntero incompatible.

prueba.c:30: aviso: se pasa el argumento 2 de 'intercambiarVec' desde un puntero incompatible.


Salida:
3 4
1 2
Por lo que aparentemente ha funcionado, sin embargo el compilador se queja y da el warning!

Agradezco cualquier ayuda.

P.D.Tengo puesta la opción -pedantic para que me avise de todo, incluso las chorradas.

cabron

intercambioVec(&vec1,&vec2,2);

Sobran los &, el nombre de un array sin los [] se convierte en un puntero, ejemplo:

int* p;
int a[10];

p = a;

davidpoza

ok, ya los he quitado, sigue funcionando igual pero también siguen saliendo los warning :(

RikuTheRonin

Creo que lo que te sobra es el [] de los vectores, yo cuando uso un vector como dato de entrada, siempre lo pongo: nombrefuncion(tipo * vector)

No hace falta los[] ni los & al llamar a dicha funcion

cabron

Es lo que dice #4, he mirado directamente la línea del warning y no me he fijado en el resto.

intercambioVec(int *vec1[], int *vec2[], int dim)

Tienes que usar int *vec, si pones int *vec[] está mal

javithelong

Si lo que quieres es intercambiar los punteros, asi es como deberías hacerlo . en tu codigo estas cambiando los valores directamente...

int intercambiaVector (int ** vector1, int ** vector2) {

int ** aux;

aux = vector1;
vector1 = vector2;
vector2 = aux;

return 0;
}

y llamar a la funcion asi:

intercambiaVector (&vec1, &vec2);

Saludos

Soltrac

Lo q te dice #6 es lo q kieres hacer.

Evidentemente, tb puedes poner int *v[] q int **v, es lo mismo, ambos son punteros a la dirección del vector.

EDIT: Aún así, ahora q estoy pensando, ya que no recuerdo mucho C, no se si así los estás pasando por parámetro o por referencia (porque en C++ para pasar por referencia ponías & y listo), todo sería cuestión de probarlo :)

Usuarios habituales

  • Soltrac
  • javithelong
  • cabron
  • RikuTheRonin
  • davidpoza