|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2006
Città: Milano
Messaggi: 36
|
[C] help programma "passaggio parametri per indirizzo"
domanda:
1)perchè non gira? 2) perchè non avviene lo scambio dei valori? se acquisisco 10 e 20 con le scanf? #include<stdio.h> void scambia(int a, int b) { int tmp; tmp=a; a=b; b=tmp; } void main() { int num1,num2; printf("Inserisci numero: "); scanf("%d", &num1); fflush(stdin); printf("Inserisci numero: "); scanf("%d", &num2); fflush(stdin); scambia(num1,num2); printf("num1=%d, num2=%d",num1,num2); getchar(); } Soluzione: #include<stdio.h> void scambia(int *a, int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } void main() { int num1,num2; printf("Inserisci numero: "); scanf("%d", &num1); fflush(stdin); printf("Inserisci numero: "); scanf("%d", &num2); fflush(stdin); scambia(num1,num2); printf("num1=%d, num2=%d",num1,num2); getchar(); } 1) lo compilo con dev-c e ugualmente il programma non gira e non capisco il perchè 2)affinche avvenga lo scambio dei valori cioè INPUT:num1=10 e num2=20 OUTPUT:num1=20 e num2=10 utilizzando una procedura io devo per forza utilizzare lo scambio dei parametri per indirizzo? perchè il programma non dovrebbe effettuare lo scambio con la prima versione e ha bisogno dei puntatori? |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
Quote:
2)Devi necessariamente utilizzare il passaggio tramite puntatori poichè con il passaggio normale viene creata una copia per ogni variabile ed al termine della funzione queste copie vengono distrutte; modificando il valore delle copie non modifichi quello dei due valori originari che cerchi di invertire. |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53970
|
Non effettua lo scambio perché a e b all'interno di scambia(int a, int b) sono variabili locali alla funzione, di conseguenza no fai altro che scambiare i valori fra due variabili locali di cui il chiamante ignora l'esistenza.
E' equivalente a fare: scambia_a = a; scambia_b = b; tmp=scambia_a; scambia_a=scambia_b; scambia_b=tmp; Quindi a e b non vengono scambiati. Al contrario quello che viene fatto con i puntatori: scambia_a = &a; scambia_b = &b; tmp=*scambia_a; *scambia_a=*scambia_b; *scambia_b=tmp; In questo caso essendo l'indirizzo contenuto in scambia_a lo stesso di a lo scambio avviene. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2006
Città: Milano
Messaggi: 36
|
wooow cristallino
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:38.