La funzione dovrebbe ricevere quattro parametri: i due vettori sorgente, il vettore di destinazione e la quantita' degli elementi contenuti nei due vettori sorgente (che è la stessa per entrambi):
int fondi( const int *v1, const int *v2, int *vr, size_t l );
Il valore di ritorno l'ho messo solo per permettere di restituire qualcosa che faccia capire se l'operazione e' o non e' andata a buon fine. A me piace restituire 1 se e' andato tutto bene, 0 se ci sono stati errori (in questo caso l'unico errore che mi viene in mente è il passaggio di puntatori NULL). Nota l'uso di const per rendere evidente che il contenuto di v1 e v2 non sarà modificato mentre quello di vr sì.
Siccome devi "scorrere" per intero tre vettori hai due possibilità: o usi tre indici e l'operatore [], oppure usi tre puntatori ausiliari e l'aritmetica dei puntatori. Secondo me è più immediato seguire il meccanismo degli indici. E' pratico usare nomenclature che permettano di collegare a colpo d'occhio l'indice al suo vettore. Quindi:
size_t i1 = 0; /* segue l'avanzamento nel vettore v1 */
size_t i2 = 0; /* segue l'avanzamento nel vettore v2 */
size_t ir = 0; /* segue l'avanzamento nel vettore risultante vr */
Usando l'operatore ternario ?: puoi copiare i valori minori da v1 e v2, fino all'esaurimento di uno, dell'altro o di entrambi i vettori.
L'operatore ternario ?: sembra complicato, ma in definitiva è solo una specie di forma sintetica di if-else:
while( i1<l && i2<l ) vr[ir++] = v1[i1]<v2[i2] ? v1[i1++] : v2[i2++];
Nota che gli indici vengono incrementati solo quando vengono usati, per cui "seguono" dappresso la lettura e lo "svuotamento" dei vettori ai quali si riferiscono.
A questo punto, uno dei due vettori è senz'altro esaurito mentre l'altro (chissà quale?) potrebbe non esserlo. Devi copiare tutti gli elementi "residui" del vettore che non è stato esaurito. Il while, con la sua verifica anteposta, permette di saltare completamente qualsiasi operazione sul/sui vettori eventualmente già esauriti.
while( i1<l ) vr[ir++] = v1[i1++];
while( i2<l ) vr[ir++] = v2[i2++];
Mettendo insieme "i pezzi", viene fuori la funzione che ti serve. Più semplice di quel che poteva sembrare, no?
int fondi( const int *v1, const int *v2, int *vr, size_t l ) {
if( v1 && v2 && vr ) { /* i puntatori sono validi? */
/* definisce tre indici (uno per vettore) e li inizializza a zero */
size_t i1 = 0; /* segue l'avanzamento nel vettore v1 */
size_t i2 = 0; /* segue l'avanzamento nel vettore v2 */
size_t ir = 0; /* segue l'avanzamento nel vettore vr */
/* copia i valori minori da v1 e v2, fino all'esaurimento
di uno, dell'altro o di entrambi i vettori; l'operatore
ternario "?:" sembra complicato, ma e' solo una specie
di forma sintetica di if-else */
while( i1<l && i2<l )
vr[ir++] = v1[i1]<v2[i2] ? v1[i1++] : v2[i2++];
/* a questo punto, uno dei due vettori e' senz'altro esaurito
mentre l'altro (chissa' quale?) potrebbe non esserlo */
/* se e' il primo vettore a non essere esaurito, copia tutti
i valori restanti del primo vettore in vr */
while( i1<l )
vr[ir++] = v1[i1++];
/* se e' il secondo vettore a non essere esaurito, copia
tutti i valori restanti del secondo vettore in vr */
while( i2<l )
vr[ir++] = v2[i2++];
return 1; /* 1: ok */
}
return 0; /* 0: errore */
}