allora ho risolto così:
codice:
#include <stdio.h>
#define N 10

void positiviNegativi2(int v[],int dim){
 int i;
 int *p1,*p2,app=0;
 p1=&(v[0]);
 p2=&(v[dim-1]);
 for(i=0; (i<=dim/2); i++){
  if (v[i]<=0){
    app=*(p1);
    *(p1)=*(p2);
    *(p2)=app;
    p1++;
    p2--;
  }
 }
}

int main(){
  int i;
  int v[N]={3,-4,6,-8,4,-2,8,-2,7,-12};
  printf("Vettore originale: ");
  for (i=0; i<=N-1; i++)
    printf("%4d", v[i]);
  positiviNegativi2(v,N);
  printf("\n\n");
  printf("Vettore permutato: ");
  for (i=0; i<=N-1; i++)
    printf("%4d", v[i]);
  printf("\n\n"); 
  return 0;
}
ma mi scambia gli elementi nel modo sbagliato! Non deve fare cosi!
dovrebbe portare gli elementi negativi nella porzione finale dell'array mentre gli elementi positivi nella porzione iniziale!