2016-10-20 3 views
2

Ich versuche, Werte von zwei Variablen in C zu tauschen, schrieb ich Funktion, aber es funktioniert nicht, und ich kann nicht herausfinden, was falsch ist.Swap zwei Werte von Variablen

#include <stdio.h> 

void fun(int a_local, int b_local) 
{ 
    int temp = a_local; 
    a_local = b_local; 
    b_local = temp; 
} 

int main() 
{ 
    int a_global = 5; 
    int b_global = 7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(a_global, b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

    return 0; 
} 
+0

Code hat zwei Variablen vertauscht: 'a_local' und' b_local' haben den entgegengesetzten Wert, mit dem sie das Leben begonnen haben. Aber dieser Tausch betrifft ihre Eltern nicht: 'a_global, b_global'. – chux

Antwort

0

Die Funktion ist ungültig, und nichts zurückkehrt, stattdessen können Sie Et-Zeichen verwenden, wenn in den Argumenten „Pass by reference“ und alle „Changes“ passing wird nach dem Funktionsaufruf zu sehen.

#include <stdio.h> 

void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global,&b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 
2

In C werden alle Funktionsparameter als Wert übergeben. Änderungen an einem Parameter innerhalb der Funktion sind für die aufrufende Funktion nicht sichtbar.

Sie müssen die Funktion ändern, um einen Zeiger für jede Variable zu akzeptieren, die Sie ändern möchten. Dann übergeben Sie die Adresse dieser Variablen. Dann dereferenzieren Sie in der Funktion die Zeiger, um die Variablen in der aufrufenden Funktion zu ändern.

#include <stdio.h> 

void fun(int *a_local, int *b_local) 
{ 
    int temp = *a_local; 
    *a_local = *b_local; 
    *b_local = temp; 
} 

int main() 
{ 
    int a_global = 5; 
    int b_global = 7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global, &b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

    return 0; 
} 
0

Das Problem auf Ihre Funktion besteht darin, dass die Werte von Wert übergeben werden, nicht Bezug genommen wird, wird deshalb die Swap richtig gemacht, aber im RAM verloren geht, wenn sie von der Funktion (interne Variablen sind lokale Rückkehr zu die Funktion und beim Beenden zerstört)

Hier ist eine Lösung: Zeiger verwenden.

void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
0

Sie müssen die Variablen als Zeiger auf die Swapping-Funktion übergeben, sonst ihre lokalen Kopien erstellt werden, wenn Sie die Funktion aufrufen, Werte dieser lokalen Kopien werden ausgetauscht und dann zerstört, wenn Sie aus der Funktion zurückkehren, so dass Ihre ursprünglichen Variablen unverändert.

void fun(int* a_local, int* b_local) 
{ 
    int temp=*a_local; 
    *a_local=*b_local; 
    *b_local=temp; 
} 
int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    fun(&a_global,&b_global); 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 
0

es Ihren Weg zu tun, um die Werte aus der „Spaß“ Funktion, oder sie werden nicht tatsächlich in der Haupt geändert werden zurückkehren müßte. Um dies zu umgehen könnten Sie es nicht tun, in einer Funktion, wie in diesem Beispiel ..

int main() 
{ 
    int a_global=5; 
    int b_global=7; 

    printf("a=%d, b=%d\n", a_global, b_global); 
    int temp=a_local; 
    a_local=b_local; 
    b_local=temp; 
    printf("a=%d, b=%d\n", a_global, b_global); 

return 0; 
} 

Sie könnten auch die beiden Werte in eine Struktur setzen, und verwenden, die sie in passieren und aus Spaß.