Forse mi sono espresso male...chiedo scusa.
Magari possiamo risolverla così:
Ora commento il codice del programma così mi dite dove sbaglio.

codice:
using namespace std;#include <iostream>
void cambia(int m, int n[7]){
        (*(n+m))--; //n punta a vet[-1], memoria sporca, m = 4, quindi *(*(n+m)) punta a vet[-1+4] e decrementa il valore presente
        m++; //m=4 diventa m=5
        n--; //mi sposto nell'elemento precedente del vettore
//ora, siccome, vet-1 è stato passato per indirizzo (perchè gli array sono passati come indirizzi) 
//ad un altro puntatore (perchè un array, n[7], è un puntatore) avro' che le mie modifiche saranno
 //salvate sul vettore contenuto nel main: vet[]. Invece la mia variabile locale int m; 
//non avendo il segno & davanti riceve una copia del valore contenuto in vet[4], quindi le modifiche sono perse.
}


int main(){
    int vet[] ={4,2,3,2,4};
    cambia(vet[4], vet-1);//passo alla funzione l'indirizzo del 4°elemento del vettore e lo metto in int m; 
//poi prendo l'indirizzo della cella di memoria contenente vet, ci sottraggo 1 (cella) e passo questo indirizzo a n[]. 
//è un po' come se gli avessi passato vet[-1]

    cambia(0,&vet[4]);
//ora, chiamo di nuovo la funzione scambia passando un intero e l'indirizzo di memoria &vet[4]. Domanda: se passo come parametro vet[4] passo il valore contenuto in vet[4] oppure l'indirizzo
//della cella di memoria vet[4]? e se avessi passato vet+4? oppure &vet+4? oppure &vet[4]? 
//Provo a dare la mia idea:
// vet+4: passo l'indirizzo del primo elemento + 4, quindi passo l'indirizzo del 5° elemento del vettore
//vet[4]: passo il valore contenuto nella posizione vet[4], quindi un intero, nel mio caso =4
//&vet+4: credo valga lo stesso discrorso di vet+4
//&vet[4]: passo l'indirizzo di memoria del 5° elemento dell'array

//in questo caso, l'ultimo elemento dell'array sara' decrementato di 1, perchè passando &vet[4] 
//identifico l'ultimo elemento del mio array, gli sommo la variabile m che nel mio caso ha ricevuto 
//come parametro il valore 0, poi con (*(n+m))-- decremento l'ultimo elemento del vettore. 
//dopo di che fa anche un m++ ma non serve a molto e poi fa n-- e quindi sposta il puntatore 
//indietro di un elemento dell'array (nulla di rilevante ai fini dell'alterazione dei valori nell'array).
//siccome si parla ancora di vettori ho che sono stati passati per indirizzo, quindi le modifiche sono state salvate 
    int i=0;
    for(i=0; i<5; i++)
        cout << vet[i];
    return 0;    
}
Giusto?