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?