Ho alterato leggermente il tuo codice:
codice:
using namespace std;
#include <iostream>
void cambia(int m, int n[7]){
cout << "Indirizzo n ad inizio chiamata cambia(): "<<n<<endl;
//for(int i=0;i<7;i++) cout << "n["<<i<<"]: " << n[i] <<endl;
(*(n+m))--;
m++;
cout << "Indirizzo n dopo (*(n+m))--: " << n<<endl;
n--;
cout << "Indirizzo n termine funzione: "<<n<<endl;
}
int main(){
int vet[] ={4,2,3,2,4};
cout << "Indirizzo originale vet: " << vet << endl;
cambia(vet[4], vet-1);
cout << "Indirizzo vet dopo cambia(vet[4], vet-1): "<<vet<<endl<<endl;
cambia(0,&vet[4]);
cout << "Indirizzo vet dopo cambia(0, &vet[4]): "<<vet<<endl;
int i=0;
for(i=0; i<5; i++)
cout << vet[i];
return 0;
}
Io ottengo:
codice:
Indirizzo originale vet: 0x28fef8
Indirizzo n ad inizio chiamata cambia(): 0x28fef4
Indirizzo n dopo (*(n+m))--: 0x28fef4
Indirizzo n termine funzione: 0x28fef0
Indirizzo vet dopo cambia(vet[4], vet-1): 0x28fef8
Indirizzo n ad inizio chiamata cambia(): 0x28ff08
Indirizzo n dopo (*(n+m))--: 0x28ff08
Indirizzo n termine funzione: 0x28ff04
Indirizzo vet dopo cambia(0, &vet[4]): 0x28fef8
42313
Quindi fai caso a:
codice:
Indirizzo n ad inizio chiamata cambia(): 0x28fef4
Indirizzo n dopo (*(n+m))--: 0x28fef4
è sempre il solito di inizio funzione, prima dell'esecuzione di quell'istruzione. Cambia solo dopo con l'ultima sottrazione: Indirizzo n termine funzione: 0x28fef0
Ma quando ritorna al chiamante, vet ha sempre l'indirizzo originale, questo voglio dire! Questo vale per entrambe le chiamate, come si nota.